S32K1XX系列单片机 ——(2)用EB配置MCAL

1. 概述

在下面的网址可以下载MCAL、OS和EB
https://www.nxp.com/design/automotive-software-and-tools/autosar:AUTOSAR-HOME

EB和MCAL的安装我这里就不详细说了,网上有很多教程,本文着重说一下MCAL中Dio和Port模块的配置方法,以及如何在Keil工程中集成MCAL源代码和EB生成的配置代码。

2. 新建EB工程

新建时需要选择AUTOSAR版本:
【注意:如果同时安装了多个版本的AUTOSAR,只有最高版本能被显示】
S32K1XX系列单片机 ——(2)用EB配置MCAL_第1张图片
这里的Target要选择用的CPU,生成路径建议直接选择到Keil工程的目录下,这样省的每次生成代码再往Keil文件夹下拷贝,我是在Keil工程目录下新建了Bsw文件夹,Bsw文件夹下会有Cfg和Src两个文件夹,Cfg就存放EB生成的文件,Src存放MCAL的源码。点击Finish完成创建。
S32K1XX系列单片机 ——(2)用EB配置MCAL_第2张图片

创建好的工程默认只包含一个Resource模块:

S32K1XX系列单片机 ——(2)用EB配置MCAL_第3张图片

3. PORT配置

如下图所示,可以添加模块:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第4张图片
我们先添加一个PORT模块:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第5张图片
添加了Port模块后,我们可以看到一个PortContainer,默认创建了一个,每个PortContainer后面有一个PortNumberOfPortPins,这个PortContainer就是PORTA/B/C/D/E,PortNumberOfPortPins就是当前Port中有多少有效Pins,这个PortNumberOfPortPins不允许手动填写,而是在新建了Pin之后软件自动计算得到的。
S32K1XX系列单片机 ——(2)用EB配置MCAL_第6张图片
点击PortPin可以添加删除Pin:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第7张图片
每一个Pin有如下属性需要配置:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第8张图片
其中Pin id就是一个索引序号,软件自动分配即可。
比较重要的是PortPin PCR,它直接决定了当前的Pin对应哪个引脚,计算方法如下:

PCR = Port Number + Pin Number

Port Number:PORTA = 0;PORTB = 32;PORTC = 64;PORTD = 96;PORTE = 128;
Pin Number就是引脚序号。

例如:
PTD15:PCR = 96 + 15 = 111
PTA17:PCR = 0 + 17 = 17

如果你去查代码,会发现程序中解析PCR的时候,把一个字节的高3位解析成PORT序号,低5位解析成Pin序号,正好和上面的换算关系一致。

这个PCR也和下面的Mode有关,PCR配置好之后,相应的引脚也就确定了,这时Mode中就可以选择该引脚支持的功能。

例如PTD15的PCR是111,芯片手册中该引脚的功能定义如下:

在这里插入图片描述
在EB中Mode的选项也是这几个:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第9张图片
我们把5组Port都创建好,为了方便我在Port名后面加了计算PCR用的偏移量:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第10张图片
然后在每个Port中添加用到的所有引脚:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第11张图片
S32K1XX系列单片机 ——(2)用EB配置MCAL_第12张图片

【注意,一定要把调试引脚和RESET引脚配置好,不然烧写程序后就连不上调试器了】
如果复位和调试引脚配置不正确,导致调试器无法连接,可按照如下方法解决(感谢luyegogogo同学提供的解决方法):

  1. 如果复用引脚被改,在keil里面的option debug setting里面的右边框框里是看不到芯片号的,也就是没连上;
  2. 保持拉低PTA5(RESET_B),给板子和接上板子的调试器上电,keil右边的框框里能看到一串号码了,说明连上了,但到了这一步还是烧不进去;
  3. 打开J-Link Commander 输入unlock Kinetis,回车,显示unlocking device ok,就可以正常烧程序了。

调试引脚的mode要选择相应的调试功能,PE处选择PullEnabled,方向选择PORT_PIN_IN,例如:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第13张图片
配置完所有的引脚之后,Port的PortNumberOfPins可能数量对不上,点击下图红框中可以自动计算。

S32K1XX系列单片机 ——(2)用EB配置MCAL_第14张图片
整个工程没有错误(红叉)的话,Port的配置就完成了,

3. Dio配置

Dio可以看做是Port的使用接口,应用程序是不可以直接操作Port或Pin的,只能通过Dio。Dio的配置也比较简单,其实就是给Pin重新定义了一个名称。

首先在上文的Module Config界面添加Dio模块:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第15张图片
DioPort中的配置就对应着单片机的PORT,PORTA-E的DioPort ID分别为0-4。

DioPort中可以添加Channel,一个Channel对应一个引脚,如我添加了两个LED的引脚:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第16张图片
在初始页面可以配置一些API,我们去掉error detect,勾选Flip API:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第17张图片
检查一下没有错误,Dio模块就配置完成了。

4. 添加Base模块

Base模块是使用MCAL时必须的,定义了一些通用的变量、宏定义等,直接在ModuleConfig中添加Base模块即可,不需要配置什么:

S32K1XX系列单片机 ——(2)用EB配置MCAL_第18张图片

5. 添加MCU模块

MCU模块会初始化时钟等必要的单片机运行环境,为防止程序运行出错也要进行添加,MCU模块的配置基本不需要更改,只要没有错误就保持默认即可(还没有详细研究,之后研究一下再展开写):

S32K1XX系列单片机 ——(2)用EB配置MCAL_第19张图片

6. 集成代码

(1)生成配置文件

点击EB的生成代码后,我们可以在生成路径下看到三个文件夹,就是生成的配置.c和.h文件:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第20张图片

(2)拷贝MCAL源码

然后我们再Bsw文件夹下新建一个Src文件夹,把这几个MCAL模块的源代码拷进去(源代码在MCAL安装路径下):
S32K1XX系列单片机 ——(2)用EB配置MCAL_第21张图片
注意这里有个SchM模块,是MCAL调用的,但因为我们现在没有OS,所以没有SchM模块,编译会报错。其实MCAL中调用的接口也不多,主要就是一些临界区关中断的函数,我们可以先定义一个空函数:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第22张图片
注意SchM中的AUTOSAR版本要和源代码对应上,我下文有工程源码,可以参考里面的SchM模块代码。

(3)添加源码

在Keil工程中,要把生成的配置代码和MCAL源码中的.C文件都添加进去:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第23张图片

(4)添加头文件路径

在Keil工程的头文件路径配置界面,把配置代码和源代码的所有包含.h文件的路径添加进去:
S32K1XX系列单片机 ——(2)用EB配置MCAL_第24张图片

(5)配置不使用AUTOSAR OS

因为我们现在没有使用AUTOSAR OS,为避免编译错误,需要在Keil工程的配置选项中,添加以下宏定义:

AUTOSAR_OS_NOT_USED

多个宏定义之间用英文逗号“,”隔开

S32K1XX系列单片机 ——(2)用EB配置MCAL_第25张图片

7. 编辑main函数

我们在main.c中写一个简单的测试程序:

#include "Mcu.h"
#include "Port.h"
#include "Dio.h"

void TestDelay(uint32 delay);
void TestDelay(uint32 delay)
{
   static volatile uint32 DelayTimer = 0;
   while(DelayTimer<delay)
   {
       DelayTimer++;
   }
   DelayTimer=0;
}

/**
* @brief        Main function of the example
* @details      Initializez the used drivers and uses the Icu
*               and Dio drivers to toggle a LED on a push button
*/
int main(void)
{
    uint8 count = 0U;

    /* Initialize the Mcu driver */
    Mcu_Init(&McuModuleConfiguration_0);

    Mcu_InitClock(McuClockSettingConfig_0);
#if (MCU_NO_PLL == STD_OFF)
    while ( MCU_PLL_LOCKED != Mcu_GetPllStatus() )
    {
        /* Busy wait until the System PLL is locked */
    }

    Mcu_DistributePllClock();
#endif
    Mcu_SetMode(McuModeSettingConf_0);

    /* Initialize all pins using the Port driver */
    Port_Init(&PortConfigSet_0);

    while (count++ < 10)
    {
        /* Get input level of channels */
//        Dio_WriteChannel(DioConf_DioChannel_DioChannel_LED_GREEN, STD_HIGH);
        Dio_FlipChannel(DioConf_DioChannel_DioChannel_LED_GREEN);
        Dio_FlipChannel(DioConf_DioChannel_DioChannel_LED_BLUE);
        TestDelay(2000000);

//        Dio_WriteChannel(DioConf_DioChannel_DioChannel_LED_GREEN, STD_LOW);
//        TestDelay(2000000);

    }


    return (0U);
}

7. 编译工程

完成以上步骤后,不出意外的话就可以编译工程了,工程编译成功后,烧写进单片机,可以看到两个LED灯闪烁:

S32K1XX系列单片机 ——(2)用EB配置MCAL_第26张图片

我把Keil工程和EB工程都打包上传了,需要的话可以从下面的连接下载:

Keil工程:
https://download.csdn.net/download/weixin_42967006/60028154
EB工程:
https://download.csdn.net/download/weixin_42967006/60026949

你可能感兴趣的:(S32,嵌入式,AUTOSAR,NXP,S32K144,MCAL,EB,Keil)