STM32CubeMX实现STM32 CAN总线
一、CAN原理
参考:STM32 的 CAN 通讯全攻略_stm32的can通信-CSDN博客
STM32入门教程(CAN通信篇)_stm32 can-CSDN博客
STM32CubeIDE——CAN中断接收、阻塞发送_mcu can通信中断函数-CSDN博客
二、STM32CubeMX配置can
参考:STM32CubeMX 配置CAN通信 HAL库_stm32cubemx can-CSDN博客
- RCC开启外部高速时钟(略)
- 配置STLink调试口(略)
- 配置串口方便调试输出(略)
- 配置工程名、生成路径,之后生成工程(略)
- 配置CAN
CAN波特率 = 时钟频率 / ((时间单元1+时间单元2+重新同步跳跃时间单元)* 分频系数)
上图设置波特率为:500kbps = 36M/((8+9+1)*4)
- 时间触发模式(Time Triggered Communication Mode):会自动为报文生成时间戳,没有研究过,暂时默认关闭。
- 自动总线关闭管理(Automatic Bus-Off Management):没有研究过,暂时默认关闭。
- 自动唤醒模式(Automatic Wake-Up Mode):使能后,当CAN外设在休眠状态时如果CAN总线有数据,则自动唤醒CAN外设。建议使能。
- 自动重发(Automatic Retransmission):使能后,如果因为仲裁失败(总线冲突)或是其他原因导致发送失败,会自动重发。建议使能。
- 接收FIFO锁定模式(Receive Fifo Locked Mode):如果使能,当接收FIFO满时,下一条数据会被丢失。如果不使能,则覆盖前面的数据。
- 发送FIFO优先级(Transmit Fifo Priority):当发送邮箱中同时有多个帧,是按照先进先出的顺序发送还是按照ID的优先级发送。如果不使能,则按照ID优先级发送。如果使能,则按照先进先出优先级发送。
- 这一项主要是用来调试用的,如果只是正常使用,选择 Normal 模式。
- 正常模式:CAN外设正常地向CAN总线发送数据并从CAN总线上接收数据。
- 回环模式:CAN外设正常向CAN总线发送数据,同时接收自己发送的数据,但不从CAN总线上接收数据。
- 静默模式:CAN外设不向CAN总线发送数据,仅从CAN总线上接收数据,但不会应答。一般用于检测CAN总线的流量。
- 静默回环模式:CAN外设不会往CAN总线收发数据,仅给自己发送。一般用于自检。
生成的代码:
三、配置过滤器
可参考:STM32 CAN过滤器细节_stm32can过滤器详解-CSDN博客
STM32 CAN过滤器配置详解_stm32can过滤器详解-CSDN博客
typedef struct
{
uint32_t
FilterIdHigh
;
/*
过滤器标识符高位
*/uint32_t
FilterIdLow
;
/*
过滤器标识符低位
*/uint32_t
FilterMaskIdHigh
;
/*
过滤器掩码号高位(列表模式下,也是属于标识符)
*/uint32_t
FilterMaskIdLow
;
/*
过滤器掩码号低位(列表模式下,也是属于标识符)
*/uint32_t
FilterFIFOAssignment
;
/*
与过滤器组管理的
FIFO */uint32_t
FilterBank
;
/*
指定过滤器组,单
CAN
为
0~13
,双
CAN
可为
0~27 */uint32_t
FilterMode
;
/*
过滤器的模式 标识符屏蔽位模式
/
标识符列表模式
*/uint32_t
FilterScale
;
/*
过滤器的位宽
32
位
/16
位
*/uint32_t
FilterActivation
;
/*
禁用或者使能过滤器
*/uint32_t
SlaveStartFilterBank
;
/*
双
CAN
模式下,规定
CAN
的主从模式的过滤器分配
*/}
CAN_FilterTypeDef
;
FilterIdHigh+FilterIdLow 与 FilterMaskIdHigh+FilterMaskIdLow形成过滤器判定条件,如
FilterId=0XFFFF0000,FilterMaskId=0XFF00FF00。其中存放到 FilterId的值就是期望收到的
ID
,即我们希望收到的映像(
STID+EXTID+IDE+RTR
)最好是:
0XFFFF0000。而 0XFF00FF00
就是设置我们需要必须关心的
ID
,表示收到的映像,其位
[31:24]
和位
[15:8],
这16个位的必须和 FilterId中对应的位一模一样,而另外的 16 个位则不关心,可以一样,也可以不一样,都认为是正确的
ID
,即收到的映像必须是
0XFFxx00xx
,才算是正确的(
x 表示不关心),这里需要注意的是标识符选择位
IDE
和帧类型
RTR
需要一致。
四、CAN相关函数
HAL_CAN_Start(&hcan); /* 启动CAN外围设备 */
HAL_CAN_GetRxMessage(); /* 读取接收到的数据 */
HAL_CAN_GetRxFifoFillLevel(); /* 获取邮箱中的消息数 */
HAL_CAN_AddTxMessage(); /* 将要发送数据放进邮箱 */
HAL_CAN_GetTxMailboxesFreeLevel();/* 判断发送是否成功 返回值=3表示发送完成*/
作者:决战嵌入式