引言
上一篇文章实现了基于rtthread的uart 的DMA接收驱动的配置与使用。下面重点需要完成rtthread对stm32的CAN驱动的配置,由于rtthread默认工程中没有对特定芯片如stm32的CAN驱动的芯片级驱动代码,但是在rtthread的github仓库中有相关的代码,需要我们自己完成配置。因此本文的重点工作是完成stm32的CAN驱动的配置,通过上述流程达到一以贯之的效果,以后再遇到其他协议也可以如此处理。
资料连接
本项目的所有资料全部开源:
硬件工程:https://lceda.cn/FranHawk/485tocan_motor_controller
软件工程:https://github.com/FranHawk/RT-Thread-485toCAN
前期准备
- 制作好的电机驱动板一块
- USB转485模块一个,用来插在PC上实现485协议与电机驱动板通讯
- rtthread studio开发环境
- cubemx配置工具
- 硬件连接图如下所示,蓝色的就是USB转485模块
CAN驱动配置
这篇文章依托上一篇文章已经创建好的工程参考文献
这篇文章是rtthread官方文档的CAN驱动说明,里面有CAN协议简要介绍和CAN应用层代码示例
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/can/can
这几篇文章教如何在rtthread studio中配置CAN驱动,重点看前三篇,里面有一些疑难问题的解决
https://club.rt-thread.org/ask/question/429883.html
https://www.icode9.com/content-4-826571.html
https://blog.csdn.net/qq_25186745/article/details/112788923?utm_source=app&app_version=4.8.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
https://club.rt-thread.org/ask/question/427543.html代码下载
根据上述几篇参考文献,我们首先要去rtthread的github仓库下载stm32的can驱动支持代码
打开以下链接
https://github.com/RT-Thread/rt-thread
进入bsp文件夹,找到stm32
进入以下路径,找到drv_can.h和drv_can.c,下载这两个文件,并分别放到rtthread studio工程的drivers/include和drivers文件夹中,然后在rtthread studio中刷新,才能看到新添加的两个文件配置CAN驱动
打开stm32f1xx_hal_conf.h,注释掉CAN的使能如下图
打开rtthread settings,使能CAN设备驱动程序
在board.h中添加
1 |
最后还需要CAN的两个引脚初始化的代码,我们打开cubemx完成CAN配置
选中master mode就行了,我们只用到cubemx生成的引脚初始化代码,其余的包括波特率不用管,这个后面用rtthread的设备驱动设置,最后打开生成的MDK5工程,把stm32f1xx_hal_msp.c中的如下代码复制到rtthread studio的board.c中
1 | /** |
至此完成了CAN驱动配置
参考rtthread官网的CAN设备的示例程序编写代码
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/can/can
根据电机数据手册,设置波特率是1M,8个电机的ID号从0x141到0x148
1 | /*各电机ID定义*/ |
根据数据手册,定义电机命令
1 | /*电机控制指令定义*/ |
1 | /* CAN 设备名称定义 */ |
CAN采用中断的方式接收数据,还是分为顶半处理和底半处理,顶半处理就是CAN接收中断函数,里面只负责释放信号量,底半处理是CAN数据处理线程,负责对CAN接收的数据进行解码,并且把有效信息存放在数组中等待被电机驱动板发送至上位机。
下面是CAN接收中断函数
1 | /* CAN接收数据回调函数 */ |
CAN数据处理线程初始化函数,由于CAN发送控制和查询指令至电机的程序在串口数据处理线程中,优先级为5,每发给一个电机指令,电机就会返回一条指令,为了不让CAN数据接收受到影响,将CAN数据接收线程的优先级调整至比CAN数据发送更高。CAN数据处理线程优先级设为6。这个地方要注意的是,在电机驱动板连接电机时,将CAN工作模式设为正常模式,在未连接电机,单独调试时需要设置为LOOPBACK回环模式
1 | /* CAN接收数据处理初始化 */ |
CAN数据处理线程
1 | /* CAN接收数据处理线程 */ |
上面都是CAN接收数据的部分,下面展示部分CAN发送数据的代码,下面是上一篇所述的串口数据处理函数,对上位机的指令解码,然后通过CAN向电机发送指令
1 | /* 串口处理接收数据线程入口 */ |
总结
通过上述代码,完成了针对stm32的CAN驱动的配置与应用,完成了电机驱动板大部分需求,可以通过电机驱动板控制电机转矩电流并查询电机状态了,详细代码我均已开源至github。下一篇准备实现用两个按键中断向电机发送CAN指令控制电机启停的功能。