前言
目前网上采用CMSIS标准接口开发MCU的程序例程及资料比较少,因此在此平台记录一下本人多年来开发的经验,并对通信进行二次封装,希望对也想采用此方式开发的码友有一些帮助。所有内容均为自主开发,不喜勿喷。
注:例程采用的是某点stm32f407ZGT6板卡,也可能会用我开发的项目。所有移植过程会在每一章进行说明。另外提前说明因为工作比较忙,所以更新周期和内容也会不固定。
第一期先介绍一下CMSIS。
一、CMSIS是什么?
简单来说CMSIS是一种与芯片无关采用统一API接口的中间件。
即如果你需要更换MCU,新的MCU也满足CMSIS标准的话,理论上你采用CMSIS标准的代码是不需要进行替换的。
二、CMSIS-DRIVER重要注意点
1.CMSIS Driver主要封装的是通信类,对于特定的如PWM输出,外部中断等没有封装。
2.封装的各通信类是各MCU该功能的最小交集。例如SPI通信,本封装里必须MOSI与MISO都要用到。这个在看各自项目原理图的时候一定要注意。
三、CAN驱动移植
很多人都说通信移植应该从串口开始,但是在CMSIS-DRIVER移植中,在我看来CAN是最简单的。所以我们先聊CAN。
首先选择RTE编辑器(1),选择CMSIS DRIVER中的CAN(2),其后将我写好的bsp_cms_can的.c和.h文件加载到自己的项目中去。我写程序喜欢统一把底层封装到BSP文件夹中应用层在APP文件夹。
点击Device中的RTE_Device.h文件(1),选择图形化编辑界面(2),选择要开启的Can通信并配置针脚(3)。
在要运用到Can的任务中,引用bsp_cms_can.h文件,初始化时对g_xCan结构体进行配置。在CAN通信中我对于每一路CAN均封装了g_xCan结构体。结构体中的内容可以去参考源代码,很简单。初始化过程中只需要配置波特率及是否是扩展帧即可。随后调用Can_init函数进行初始化。这里要简单说明一下波特率的配置其实是有要求的,我已经在bsp_cms_can.c文件中进行了分类,绝大多数波特率都可以涵盖,其余特殊的波特率大家可以查以下官网的提示,进行修改。初始化之后我一般会开启操作系统线程进行CAN数据的收发处理。线程的创建在bsp_all_define中进行了封装。
在bsp_cms_can文件中对Can数据收发进行了封装,目前配置一路CAN最多可接收500个不同类型的CanId,每一次读取数据时可以调用Can_Can_rxData(STR_CanStruct* pxCan, uint32_t canId, uint8_t* data)函数进行数据读取,返回值为读取到的数据长度。pxCan为选择用哪里路Can进行接收,CANID为接收得canid号,data为接收字节首地址。同理发送可调用Can_txData(STR_CanStruct* pxCan,uint32_t canId,uint8_t* data,uint8_t len)函数进行发送。与接收类似,发送过程添加发送数据长度。目前机智下CAN数据接收为覆盖方式进行,即若有相同ID的数据发送,则新数据会覆盖已有数据。完成程序如下图:
总结
因为我进行了二次封装所以实时性会下来,对于实时性要求很高的项目会不满足各位使用。大家可以通过修改bsp_cms_can.c内的文件进行实时性功能实现。can_init为初始化不建议大家修改。