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,只有最高版本能被显示】
在这里插入图片描述
这里的Target要选择用的CPU,生成路径建议直接选择到Keil工程的目录下,这样省的每次生成代码再往Keil文件夹下拷贝,我是在Keil工程目录下新建了Bsw文件夹,Bsw文件夹下会有Cfg和Src两个文件夹,Cfg就存放EB生成的文件,Src存放MCAL的源码。点击Finish完成创建。
在这里插入图片描述

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

在这里插入图片描述

3. PORT配置

如下图所示,可以添加模块:
在这里插入图片描述
我们先添加一个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同学提供的解决方法):

  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,例如:
在这里插入图片描述
配置完所有的引脚之后,Port的PortNumberOfPins可能数量对不上,点击下图红框中可以自动计算。

在这里插入图片描述
整个工程没有错误(红叉)的话,Port的配置就完成了,

3. Dio配置

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模块就配置完成了。

4. 添加Base模块

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

在这里插入图片描述

5. 添加MCU模块

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

在这里插入图片描述

6. 集成代码

(1)生成配置文件

点击EB的生成代码后,我们可以在生成路径下看到三个文件夹,就是生成的配置.c和.h文件:
在这里插入图片描述

(2)拷贝MCAL源码

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

(3)添加源码

在Keil工程中,要把生成的配置代码和MCAL源码中的.C文件都添加进去:
在这里插入图片描述

(4)添加头文件路径

在Keil工程的头文件路径配置界面,把配置代码和源代码的所有包含.h文件的路径添加进去:
在这里插入图片描述

(5)配置不使用AUTOSAR OS

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

AUTOSAR_OS_NOT_USED

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

在这里插入图片描述

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灯闪烁:

在这里插入图片描述

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

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

版权声明:本文为CSDN博主「老孟_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42967006/article/details/121831965

生成海报
点赞 0

老孟_

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

LVGL 优化帧率技巧

前文 LVGL——PC模拟器仿真模拟VS2017 f429 discovery开发版 LVGL移植(带操作系统) 在F429平台上尝试LVGL过程中,总结出几种优化提高帧率的方法 这里我们直接用官方测

Keil MDK5 STM32F103C8T6开发环境配置

Windows下使用Keil MDK5进行stm32f103c8t6的开发和编译, 配合ST-LINK工具进行烧录, 使用原生(非HAL)的方式. 所需硬件 stm32f103系列开发板 stm32f103c8t6核心板 参数 ARM 32-b