直奔主题,最近项目上接触了FDCAN,主控为STM32H743。
在开发过程中存在了几点疑惑,特此记录。
- 波特率设置问题
CAN通讯的波特率计算方式为:
BaudRate = Tq *(SYNC_SEG + BS1 + BS2)
其中 SYNC_SEG 段固定长度为 1Tq,而 BS1及 BS2 段可以在相应寄存器 设置它们的时间长度。
在芯片手册上,FDCAN_DBTP寄存器中,DBRP、DTSEG1、DTSEG2分别为时钟分频值、BS1 及 BS2 段的长度。
对于以上寄存器值,硬件将该值解析为编程值加 1,也就是说,实际上我们在计算波特率时,需要将寄存器值加上1来进行计算,即
BaudRate = CLK / ( ( (DTSEG1+1) + (DTSEG1+1) + 1 ) * (DBPR + 1) )
但是,实际上,在使用官方的HAL库进行开发时,很有可能会出现误解。
什么误解呢?就是在配置CAN的通讯波特率时,我们可能会误以为我们给FDCAN初始化结构体的成员变量所赋的值为编程值,即实际计算波特率时还需要加一。
这样的话,我们配置的波特率其实并不是你期望的值。
主要是因为在STM32 HAL库的接口函数中,HAL_FDCAN_Init()函数内部已经做过了处理。
做了什么处理呢?就是将我们给FDCAN初始化结构体的成员变量所赋的值减1后再给寄存器赋值,即通过STM32 HAL库的HAL_FDCAN_Init()函数来配置波特率时,波特率的计算就不需要再进行加1了。
以下就是在STM32CubeMx环境下初始化STM32H743片上外设FDCAN的简略过程,主要说明以下波特率问题。
通过STM32CubeMX生成的FDCAN初始化代码 HAL_StatusTypeDef HAL_FDCAN_Init(FDCAN_HandleTypeDef *hfdcan)
从上图可以看出,STM32 HAL库的HAL_FDCAN_Init()函数内部已经做过了处理,在给寄存器位赋值之前就将已经我们给FDCAN初始化结构体的成员变量所赋的值减1了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)