[应用相关] 计算FDCAN2上的MessageRAMOffset(使两路FDCAN正常工作)

[复制链接]
 楼主| 晓伍 发表于 2021-9-4 15:45 | 显示全部楼层 |阅读模式
一. 前言
要在STM32H7上使用FDCAN控制器,需要配置很多参数。例如,波特率,CAN模式,工作模式,TXFIFO,RXFIFO,Message RAM Offset等等。今天我想聊聊Message RAM Offset这个“大坑”,这个”坑“只有当你需要同时使用两路FDCAN控制器的时候才会出现。所以,想让STM32H7上的两路FDCAN同时正常工作的话,理解Message RAM Offset是很必要的。

13359613323d657002.png

 楼主| 晓伍 发表于 2021-9-4 15:46 | 显示全部楼层
二. 消息RAM

在《STM32H7x3编程参考手册》上,有介绍FDCAN1与FDCAN2都共用同一块RAM。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
《STM32H7x3编程参考手册》也强调这一块RAM配置的重要性,而且系统也不会帮你检查。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| 晓伍 发表于 2021-9-4 15:47 | 显示全部楼层
三. “错误”配置之同时使用两路FDCAN3.1 FDCAN1

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| 晓伍 发表于 2021-9-4 15:47 | 显示全部楼层
3.2 FDCAN2

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| 晓伍 发表于 2021-9-4 15:48 | 显示全部楼层
3.3 消息RAM的分布

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
在STM32CubeMX上,FDCAN1与FDCAN2的Message RAM Offset都设置为0。这样的话,FDCAN1的消息RAM与FDCAN2的消息RAM重叠在一起了。最终,会导致FDCAN2无法正常接收报文。


 楼主| 晓伍 发表于 2021-9-4 15:49 | 显示全部楼层
四. “正确”配置之同时使用两路FDCAN4.1 FDCAN1

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| 晓伍 发表于 2021-9-4 15:50 | 显示全部楼层
4.2 FDCAN2

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| 晓伍 发表于 2021-9-4 15:52 | 显示全部楼层
4.3 消息RAM的分布

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg

按照这样去设置两路FDCAN的Message RAM Offset的话,就能正常工作了。FDCAN1与FDCAN2各有自己的消息RAM了。

这里还有一个疑问,FDCAN2的Message RAM Offset为什么要设置0x214呢?依据是什么?接着,就要从SRAMCAN_BASE与hfdcan1.msgRam.EndAddress入手了。



 楼主| 晓伍 发表于 2021-9-4 15:53 | 显示全部楼层
五. 计算FDCAN2的Message RAM Offset5.1 SRAMCAN_BASE

SRAMCAN_BASE的值是0x4000AC00,在《STM32H7x3编程参考手册》的第103页能找到。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
在HAL库也能找到。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| 晓伍 发表于 2021-9-4 15:54 | 显示全部楼层
5.2 hfdcan1.msgRam.EndAddress
hfdcan1.msgRam.EndAddress需要用MDK或者IAR在DEBUG模式下才能看到具体的值,因为hfdcan1.msgRam.EndAddress的值跟FDCAN1的配置参数有关,如果改变FDCAN1的配置参数的话,那么hfdcan1.msgRam.EndAddress也很可能变化。
48139613325576844d.png

 楼主| 晓伍 发表于 2021-9-4 15:55 | 显示全部楼层
计算过程

FDCAN2的Message RAM Offset = hfdcan1.msgRam.EndAddress - SRAMCAN_BASE , = 0x4000AE14 - 0x4000AC00 , = 0x214.
直接用代码编写公式也是不错的方法。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg

您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

4332

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

91

主题

4332

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部