首页 > 其他 > 详细

STM32H743 | FDCAN 波特率问题

时间:2021-05-17 13:36:03      阅读:9      评论:0      收藏:0      [点我收藏+]

STM32H743 | FDCAN 波特率问题

 

  直奔主题,最近项目上接触了FDCAN,主控为STM32H743。在开发过程中存在疑点,特此记录。

  疑点:芯片手册上,波特率的相关寄存器位标明硬件将该值解析为编程值加 1,但是实际上通过STM32 HAL库的HAL_FDCAN_Init()函数来初始化FDCAN时,我们给FDCAN初始化结构体的成员变量所赋的值并不是编程值,计算波特率时并不需要加1。

 

  • 一、 波特率计算

  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) + (DTSEG2+1) + 1 )  * (DBPR + 1) )

 

  例如: FDCAN 时钟为 8 MHz,复位值 0x00000A33 会将 FDCAN 的比特率配置为较快的500 kb/s。复位值 0x00000A33,即 DTSEG1 = 0x03, DTSEG2 = 0x0A, DBPR = 0 。则波特率的计算如下:
BaudRate = 8M / ( ( 4 +11+ 1 )  *  1 ) = 500 kb/s

 

技术分享图片

技术分享图片

 

   但是,实际上,在使用官方的HAL库进行开发时,很有可能会出现误解。什么误解呢?就是在配置CAN的通讯波特率时,我们可能会误以为我们给FDCAN初始化结构体的成员变量所赋的值为编程值,即实际计算波特率时还需要加一。这样的话,我们配置的波特率其实并不是你期望的值。

  主要是因为在STM32 HAL库的接口函数中,HAL_FDCAN_Init()函数内部已经做过了处理。做了什么处理呢?就是将我们给FDCAN初始化结构体的成员变量所赋的值减1后再给寄存器赋值,即通过STM32 HAL库的HAL_FDCAN_Init()函数来配置波特率时,波特率的计算就不需要再进行加1了。

  详情请看文末HAL_FDCAN_Init()函数的处理部分代码。

 

  • 三、 STM32CubeMX代码生成

  以下就是在STM32CubeMx环境下初始化STM32H743片上外设FDCAN的简略过程,主要为了更好地描述一下波特率问题。

  • 1、先说明下FDCAN的时钟配置,FDCAN的时钟可由HSE、PLL1Q、PLL2Q提供,在此处我选择用PLL1Q,时钟频率配置为80MHz

技术分享图片

 

 

 

  • 2、以下为在STM32CubeMX下配置FDCAN时Configuration窗口的相关配置。

技术分享图片

   通过上图配置界面,我们很容易就能看出分频Fre = 4,SEG1 = 15,SEG2 = 4,则所配置的波特率BaudRate = 80M / ( ( 1+ 15+ 4 ) * 4 ) = 1Mbps

 

  • 3、通过STM32CubeMX生成的FDCAN初始化代码

技术分享图片

 

  附:HAL_FDCAN_Init()内部减1处理的部分代码图:

技术分享图片

   从上图可以看出,STM32 HAL库的HAL_FDCAN_Init()函数内部已经做过了处理,在给寄存器位赋值之前就将已经我们给FDCAN初始化结构体的成员变量所赋的值减1了。

 

 

原文:https://www.cnblogs.com/Tuple-Joe/p/13278462.html

STM32H743 | FDCAN 波特率问题

原文:https://www.cnblogs.com/pudonglin/p/14776197.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!