STM32H743 | FDCAN 波特率问题

摘要:
STM32H743|FDCAN波特率问题直奔主题,最近项目上接触了FDCAN,主控为STM32H743。主要是因为在STM32HAL库的接口函数中,HAL_FDCAN_Init()函数内部已经做过了处理。就是将我们给FDCAN初始化结构体的成员变量所赋的值减1后再给寄存器赋值,即通过STM32HAL库的HAL_FDCAN_Init()函数来配置波特率时,波特率的计算就不需要再进行加1了。

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

STM32H743 | FDCAN 波特率问题第1张

STM32H743 | FDCAN 波特率问题第2张

但是,实际上,在使用官方的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

STM32H743 | FDCAN 波特率问题第3张

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

STM32H743 | FDCAN 波特率问题第4张

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

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

STM32H743 | FDCAN 波特率问题第5张

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

STM32H743 | FDCAN 波特率问题第6张

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

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

免责声明:文章转载自《STM32H743 | FDCAN 波特率问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#窗体控件DataGridView常用设置idea导入web项目tomcat下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux设置串口波特率等参数

  转自 http://blog.csdn.net/zoomdy/article/details/50921336 mingdu.zheng at gmail dot com stty查看串口参数 stty -F /dev/ttyS0 -a 1 1 查看串口1(/dev/ttyS0)当前的参数,包括波特率、数据位等。 stty设置串口参数 stty -...

菜鸟学STM32之串口通讯

微信公众号:小樊Study关注共同学习,问题或建议,请公众号留言!!! 串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。STM32F4的串口资源相当丰富的,功能也相当强劲。STM32F4开发板所使用STM32F407ZGT6 最多可提供 6 路串口,有分数波特...

spring相关的问题和原因分析

1、Bean的初始化顺序导致的项目启动失败 现象:shua-video项目中引用了配置中台bp-config的SDK,然后在mq消息监听类中使用。如上使用方式,在waterService中引用了bp-config。在测试环境mq中没有消息消费时项目能正常启动,但在线上有消息消费时项目启动报错,提示找不到bp-config类。 @Component @Slf...

Android中RadioGroup的初始化和简单的使用

一简介: RadioGroup作为一个单选按钮组,可以设置为性别选择男或则女,地址选择等等,作为一个android入门级选手,就简单的说一下RadioGroup组中RadioButton的布局和初始化操作,以及禁用整个RadioGroup。 二具体介绍: 布局: <RadioGroup androi...

Java集合之ConcurrentHashMap解析

上一篇介绍了HashMap的数据结构:数组+单链表(jdk 1.8,当链表长度达到8后,链表将会被转换为红黑树结构)。日常开发中我们经常使用,随着业务规模、场景的不断复杂发展,多线程开发越来越多的进入到我们日常开发中,那么问题就来了,HashMap是线程安全的吗?答案是否定的,保证HashMap的线程安全需要我们开发中自行维护。那么有没有线程安全的集合框架...

C99标准

1. 增加restrict指针    C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型不改变程序的语义。    如果某个函数定义了两个restric...