在下面的网址可以下载MCAL、OS和EB
https://www.nxp.com/design/automotive-software-and-tools/autosar:AUTOSAR-HOME
EB和MCAL的安装我这里就不详细说了,网上有很多教程,本文着重说一下MCAL中Dio和Port模块的配置方法,以及如何在Keil工程中集成MCAL源代码和EB生成的配置代码。
新建时需要选择AUTOSAR版本:
【注意:如果同时安装了多个版本的AUTOSAR,只有最高版本能被显示】
这里的Target要选择用的CPU,生成路径建议直接选择到Keil工程的目录下,这样省的每次生成代码再往Keil文件夹下拷贝,我是在Keil工程目录下新建了Bsw文件夹,Bsw文件夹下会有Cfg和Src两个文件夹,Cfg就存放EB生成的文件,Src存放MCAL的源码。点击Finish完成创建。
创建好的工程默认只包含一个Resource模块:
如下图所示,可以添加模块:
我们先添加一个PORT模块:
添加了Port模块后,我们可以看到一个PortContainer,默认创建了一个,每个PortContainer后面有一个PortNumberOfPortPins,这个PortContainer就是PORTA/B/C/D/E,PortNumberOfPortPins就是当前Port中有多少有效Pins,这个PortNumberOfPortPins不允许手动填写,而是在新建了Pin之后软件自动计算得到的。
点击PortPin可以添加删除Pin:
每一个Pin有如下属性需要配置:
其中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的选项也是这几个:
我们把5组Port都创建好,为了方便我在Port名后面加了计算PCR用的偏移量:
然后在每个Port中添加用到的所有引脚:
【注意,一定要把调试引脚和RESET引脚配置好,不然烧写程序后就连不上调试器了】
如果复位和调试引脚配置不正确,导致调试器无法连接,可按照如下方法解决(感谢luyegogogo同学提供的解决方法):
调试引脚的mode要选择相应的调试功能,PE处选择PullEnabled,方向选择PORT_PIN_IN,例如:
配置完所有的引脚之后,Port的PortNumberOfPins可能数量对不上,点击下图红框中可以自动计算。
Dio可以看做是Port的使用接口,应用程序是不可以直接操作Port或Pin的,只能通过Dio。Dio的配置也比较简单,其实就是给Pin重新定义了一个名称。
首先在上文的Module Config界面添加Dio模块:
DioPort中的配置就对应着单片机的PORT,PORTA-E的DioPort ID分别为0-4。
DioPort中可以添加Channel,一个Channel对应一个引脚,如我添加了两个LED的引脚:
在初始页面可以配置一些API,我们去掉error detect,勾选Flip API:
检查一下没有错误,Dio模块就配置完成了。
Base模块是使用MCAL时必须的,定义了一些通用的变量、宏定义等,直接在ModuleConfig中添加Base模块即可,不需要配置什么:
MCU模块会初始化时钟等必要的单片机运行环境,为防止程序运行出错也要进行添加,MCU模块的配置基本不需要更改,只要没有错误就保持默认即可(还没有详细研究,之后研究一下再展开写):
点击EB的生成代码后,我们可以在生成路径下看到三个文件夹,就是生成的配置.c和.h文件:
然后我们再Bsw文件夹下新建一个Src文件夹,把这几个MCAL模块的源代码拷进去(源代码在MCAL安装路径下):
注意这里有个SchM模块,是MCAL调用的,但因为我们现在没有OS,所以没有SchM模块,编译会报错。其实MCAL中调用的接口也不多,主要就是一些临界区关中断的函数,我们可以先定义一个空函数:
注意SchM中的AUTOSAR版本要和源代码对应上,我下文有工程源码,可以参考里面的SchM模块代码。
在Keil工程中,要把生成的配置代码和MCAL源码中的.C文件都添加进去:
在Keil工程的头文件路径配置界面,把配置代码和源代码的所有包含.h文件的路径添加进去:
因为我们现在没有使用AUTOSAR OS,为避免编译错误,需要在Keil工程的配置选项中,添加以下宏定义:
AUTOSAR_OS_NOT_USED
多个宏定义之间用英文逗号“,”隔开
我们在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);
}
完成以上步骤后,不出意外的话就可以编译工程了,工程编译成功后,烧写进单片机,可以看到两个LED灯闪烁:
我把Keil工程和EB工程都打包上传了,需要的话可以从下面的连接下载:
Keil工程:
https://download.csdn.net/download/weixin_42967006/60028154
EB工程:
https://download.csdn.net/download/weixin_42967006/60026949