CMSIS-DRIVER系列(1)_CAN配置

前言

目前网上采用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文件夹。
RTE编译器配置

点击Device中的RTE_Device.h文件(1),选择图形化编辑界面(2),选择要开启的Can通信并配置针脚(3)。

RTE_Device配置
在要运用到Can的任务中,引用bsp_cms_can.h文件,初始化时对g_xCan结构体进行配置。在CAN通信中我对于每一路CAN均封装了g_xCan结构体。结构体中的内容可以去参考源代码,很简单。初始化过程中只需要配置波特率及是否是扩展帧即可。随后调用Can_init函数进行初始化。这里要简单说明一下波特率的配置其实是有要求的,我已经在bsp_cms_can.c文件中进行了分类,绝大多数波特率都可以涵盖,其余特殊的波特率大家可以查以下官网的提示,进行修改。初始化之后我一般会开启操作系统线程进行CAN数据的收发处理。线程的创建在bsp_all_define中进行了封装。

 Can初始化

在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的数据发送,则新数据会覆盖已有数据。完成程序如下图:

图 7 Can配置及收发

总结

因为我进行了二次封装所以实时性会下来,对于实时性要求很高的项目会不满足各位使用。大家可以通过修改bsp_cms_can.c内的文件进行实时性功能实现。can_init为初始化不建议大家修改。

源代码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值