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博客

  1. RCC开启外部高速时钟(略)
  2. 配置STLink调试口(略)
  3. 配置串口方便调试输出(略)
  4. 配置工程名、生成路径,之后生成工程(略)
  5. 配置CAN

CAN波特率 = 时钟频率 / ((时间单元1+时间单元2+重新同步跳跃时间单元)* 分频系数)

上图设置波特率为:500kbps = 36M/((8+9+1)*4)

  1. 时间触发模式(Time Triggered Communication Mode):会自动为报文生成时间戳,没有研究过,暂时默认关闭。
  2. 自动总线关闭管理(Automatic Bus-Off Management):没有研究过,暂时默认关闭。
  3. 自动唤醒模式(Automatic Wake-Up Mode):使能后,当CAN外设在休眠状态时如果CAN总线有数据,则自动唤醒CAN外设。建议使能。
  4. 自动重发(Automatic Retransmission):使能后,如果因为仲裁失败(总线冲突)或是其他原因导致发送失败,会自动重发。建议使能。
  5. 接收FIFO锁定模式(Receive Fifo Locked Mode):如果使能,当接收FIFO满时,下一条数据会被丢失。如果不使能,则覆盖前面的数据。
  6. 发送FIFO优先级(Transmit Fifo Priority):当发送邮箱中同时有多个帧,是按照先进先出的顺序发送还是按照ID的优先级发送。如果不使能,则按照ID优先级发送。如果使能,则按照先进先出优先级发送。

  1. 这一项主要是用来调试用的,如果只是正常使用,选择 Normal 模式。
  2. 正常模式:CAN外设正常地向CAN总线发送数据并从CAN总线上接收数据。
  3. 回环模式:CAN外设正常向CAN总线发送数据,同时接收自己发送的数据,但不从CAN总线上接收数据。
  4. 静默模式:CAN外设不向CAN总线发送数据,仅从CAN总线上接收数据,但不会应答。一般用于检测CAN总线的流量。
  5. 静默回环模式: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+FilterIdLowFilterMaskIdHigh+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表示发送完成*/

作者:决战嵌入式

物联沃分享整理
物联沃-IOTWORD物联网 » STM32CubeMX实现STM32 CAN总线

发表回复