一. 前言

要在STM32H7上使用FDCAN控制器,需要配置很多参数。例如,波特率,CAN模式,工作模式,TXFIFO,RXFIFO,Message RAM Offset等等。今天我想聊聊Message RAM Offset这个“大坑”,这个”坑“只有当你需要同时使用两路FDCAN控制器的时候才会出现。所以,想让STM32H7上的两路FDCAN同时正常工作的话,理解Message RAM Offset是很必要的。
STM32CubeMX1

二. 消息RAM

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

三. “错误”配置之同时使用两路FDCAN

3.1 FDCAN1

FDCAN1,WRONG

3.2 FDCAN2

FDCAN2,WRONG

3.3 消息RAM的分布

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

四. “正确”配置之同时使用两路FDCAN

4.1 FDCAN1

FDCAN1,RIGHT

4.2 FDCAN2

FDCAN2,RINGHT

4.3 消息RAM的分布

RAM分布
按照这样去设置两路FDCAN的Message RAM Offset的话,就能正常工作了。FDCAN1与FDCAN2各有自己的消息RAM了。
这里还有一个疑问,FDCAN2的Message RAM Offset为什么要设置0x214呢?依据是什么?接着,就要从SRAMCAN_BASE与hfdcan1.msgRam.EndAddress入手了。

五. 计算FDCAN2的Message RAM Offset

5.1 SRAMCAN_BASE

SRAMCAN_BASE的值是0x4000AC00,在《STM32H7x3编程参考手册》的第103页能找到。
SRAMCAN
在HAL库也能找到。
HAL

5.2 hfdcan1.msgRam.EndAddress

hfdcan1.msgRam.EndAddress需要用MDK或者IAR在DEBUG模式下才能看到具体的值,因为hfdcan1.msgRam.EndAddress的值跟FDCAN1的配置参数有关,如果改变FDCAN1的配置参数的话,那么hfdcan1.msgRam.EndAddress也很可能变化。
hfdcan1.msgRam.EndAddress

计算过程

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

在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐