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
    评论
Version: 2.12.0 (2019-07-17) Keil.STM32F7xx_DFP.2.12.0.pack Download Updated Pack to include subset of STM32Cube_FW_F7 Firmware Package version V1.15.0 using HAL Drivers V1.2.7 Added support for Low Level (LL) drivers. Corrected RTE_Device.h file (I2C3_SDA) Corrected condition for selecting HAL RCC MX_Device_h.ftl: Updated parsing of USART virtual mode Updated generation of macros: Added handling for '(' and ')' symbols Corrected launching STM32CubeMX via "play" button for existing projects overwrites with a new STM32CubeMX project file instead of loading existing. Updated Board Examples: graphics examples use Segger emWin version 5.50.0. examples enable Event Recorder in debug targets Updated LCDConf.c (ready for GUI_USE_ARGD = 1) CMSIS-Driver: CAN: Corrected SetBitrate function to leave Silent and Loopback mode as they were. Corrected SetMode function to clear Silent and Loopback mode when NORMAL mode is activated. Corrected MessageSend function to only access required data for sending. EMAC: Corrected __MEMORY_AT(x) define to be compliant with Arm Compiler 6. Corrected: ETH DMA initialization moved to enable of MAC transmitter or receiver solving netInitialize/netUnnitialize/netInitialize sequence. I2C: Corrected transfers for data sizes greater than 255 (Complete Reload handling). Corrected I2C_SlaveReceive functionality. Corrected code alignment. MCI: Added data cache handling. USART: Added check for valid pointer to USART_PIN prior to use. Corrected POWER_OFF sequence. DMA is DeInitialized after it is aborted. USB Device: Updated USBD_EndpointConfigure function to check that maximum packet size requested fits into configured FIFO (compile time configured). I/O output speed is configurable SPI: Updated SPI_TRANSFER_INFO structure - tx_buf type changed from uint8_t * to const uint8_t *. Added check for valid pointer to SPI_PIN prior to use.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值