一,认识 Message RAM

消息 RAM 是 FDCAN 里面非常重要的一个点,这也是和之前的 STM32 bxCAN 最大的不同。
STM32H7 自带了 10K 的消息 RAM,消息 RAM 的配置用来实现以下功能:

  1. 过滤器
  2. 接收 FIFO
  3. 接收 BUFF
  4. 发送事件 FIFO
  5. 发送 BUFF
  6. TTCAN

系统 不会 对 Message RAM 配置进行检查。Message RAM 在 FDCAN1 和 FDCAN2 模块之间共用,,用户在配置的时候需要注意,如果配置错误将会导致发生异常情况。

寄存器 功能 元素大小 描述
SIDFC.FLSSA 最大支持128个元素 最多占用 128个 word 11 bit 标准帧滤波器设置
XIDFC.FLESA 最大支持64个元素 最多占用 128 个 word 29 bit 扩展帧滤波器设置
RXF0C.F0SA 最大支持64个元素 最多占用 1152 个 word RX FIFO0 的设置
RXF1C.F1SA 最大支持64个元素 最多占用 1152 个 word RX FIFO1 的设置
RXBC.RBSA 最大支持64个元素 最多占用 1152 个 word RX BUFF 的设置
TXEFC.EFSA 最大支持32个元素 最多占用 64 个 word TX EVENT FIFO 的设置
TXBC.TBSA 最大支持32个元素 最多占用 576 个 word TX BUFF 的设置
TMC.TMSA 最大支持64个元素 最多占用 128 个 word TT CAN 的设置

二,配置 Message RAM

Message RAM 的大小是 10K Bytes,也就是 2560 个 word。如果都按照最大的配置去计算则会超出 Message RAM 的可配置范围。
128 + 128 + 1152 + 1152 + 1152 + 64 + 576 + 128 = 4480
在未开启 FDCAN2 的情况下,4480 word 已经远远超过了 2560 word 的大小,所以只有对 Message RAM 的大小进行合理的配置才能保证 FDCAN 的正常工作。

  uint32_t MessageRAMOffset;             /*!< Specifies the message RAM start address.This parameter must be a number between 0 and 2560           */uint32_t StdFiltersNbr;                /*!< Specifies the number of standard Message ID filters.This parameter must be a number between 0 and 128            */uint32_t ExtFiltersNbr;                /*!< Specifies the number of extended Message ID filters.This parameter must be a number between 0 and 64             */uint32_t RxFifo0ElmtsNbr;              /*!< Specifies the number of Rx FIFO0 Elements.This parameter must be a number between 0 and 64             */uint32_t RxFifo0ElmtSize;              /*!< Specifies the Data Field Size in an Rx FIFO 0 element.This parameter can be a value of @ref FDCAN_data_field_size  */uint32_t RxFifo1ElmtsNbr;              /*!< Specifies the number of Rx FIFO 1 Elements.This parameter must be a number between 0 and 64             */uint32_t RxFifo1ElmtSize;              /*!< Specifies the Data Field Size in an Rx FIFO 1 element.This parameter can be a value of @ref FDCAN_data_field_size  */uint32_t RxBuffersNbr;                 /*!< Specifies the number of Dedicated Rx Buffer elements.This parameter must be a number between 0 and 64             */uint32_t RxBufferSize;                 /*!< Specifies the Data Field Size in an Rx Buffer element.This parameter can be a value of @ref FDCAN_data_field_size  */uint32_t TxEventsNbr;                  /*!< Specifies the number of Tx Event FIFO elements.This parameter must be a number between 0 and 32             */uint32_t TxBuffersNbr;                 /*!< Specifies the number of Dedicated Tx Buffers.This parameter must be a number between 0 and 32             */uint32_t TxFifoQueueElmtsNbr;          /*!< Specifies the number of Tx Buffers used for Tx FIFO/Queue.This parameter must be a number between 0 and 32             */uint32_t TxFifoQueueMode;              /*!< Tx FIFO/Queue Mode selection.This parameter can be a value of @ref FDCAN_txFifoQueue_Mode */uint32_t TxElmtSize;                   /*!< Specifies the Data Field Size in a Tx Element.This parameter can be a value of @ref FDCAN_data_field_size  */} FDCAN_InitTypeDef;

在以上的结构体中描述了 Message RAM 的配置。
与 Message RAM 配置表中的对应关系:

Message RAM 配置 STM32 FDCAN 结构体成员 配置举例 RAM 占用(word)
SIDFC.FLSSA(11 bit 标准帧滤波器配置) StdFiltersNbr 1(设置 1 个标准帧滤波器) 1
XIDFC.FLESA(29 bit 标准帧滤波器配置) ExtFiltersNbr 1(设置 1 个扩展帧滤波器 2
RXF0C.F0SA(RX FIFO0 的设置) RxFifo0ElmtsNbr * RxFifo0ElmtSize(可设置的大小是 8 ,12,16,20,24,32,48,64) 10(深度为 10 的 RX FIFO0)* 18(每帧长度是 64 个字节) 180
RXF1C.F1SA(RX FIFO1 的设置) RxFifo1ElmtsNbr * RxFifo1ElmtSize(可设置的大小是 8 ,12,16,20,24,32,48,64) 10(深度为 10 的 RX FIFO0)* 18(每帧长度是 64 个字节) 180
RXBC.RBSA(RX BUFF 的设置) RxBuffersNbr * RxBufferSize(可设置的大小是 8 ,12,16,20,24,32,48,64) 10( 10 个 专用RX BUFF)* 18(每帧长度是 64 个字节) 180
TXEFC.EFSA(TX EVENT FIFO 的设置) TxEventsNbr 1 2
TXBC.TBSA (TX BUFF 的设置) TxBuffersNbr * TxElmtSize + TxFifoQueueElmtsNbr * TxElmtSize 5 * 18(每帧长度是 64 个字节)+ 5 * 18 180
TMC.TMSA(TT CAN 的设置) - 0

STM32H7 的 HAL 库中提供了计算方法:

  hfdcan->msgRam.StandardFilterSA = SRAMCAN_BASE + (hfdcan->Init.MessageRAMOffset * 4U);hfdcan->msgRam.ExtendedFilterSA = hfdcan->msgRam.StandardFilterSA + (hfdcan->Init.StdFiltersNbr * 4U);hfdcan->msgRam.RxFIFO0SA = hfdcan->msgRam.ExtendedFilterSA + (hfdcan->Init.ExtFiltersNbr * 2U * 4U);hfdcan->msgRam.RxFIFO1SA = hfdcan->msgRam.RxFIFO0SA + (hfdcan->Init.RxFifo0ElmtsNbr * hfdcan->Init.RxFifo0ElmtSize * 4U);hfdcan->msgRam.RxBufferSA = hfdcan->msgRam.RxFIFO1SA + (hfdcan->Init.RxFifo1ElmtsNbr * hfdcan->Init.RxFifo1ElmtSize * 4U);hfdcan->msgRam.TxEventFIFOSA = hfdcan->msgRam.RxBufferSA + (hfdcan->Init.RxBuffersNbr * hfdcan->Init.RxBufferSize * 4U);hfdcan->msgRam.TxBufferSA = hfdcan->msgRam.TxEventFIFOSA + (hfdcan->Init.TxEventsNbr * 2U * 4U);hfdcan->msgRam.TxFIFOQSA = hfdcan->msgRam.TxBufferSA + (hfdcan->Init.TxBuffersNbr * hfdcan->Init.TxElmtSize * 4U);hfdcan->msgRam.EndAddress = hfdcan->msgRam.TxFIFOQSA + (hfdcan->Init.TxFifoQueueElmtsNbr * hfdcan->Init.TxElmtSize * 4U);

上面的计算公式很好理解,就是每个 word 是 4 个字节,SRAMCAN_BASE 是 Message RAM 的起始地址。
MessageRAMOffset 在 FDCAN1 的时候一定要设置为 0 ,在 FDCAN2 的时候需要根据配置来进行计算,ST 这里很贴心的帮忙做了一个 EndAddress ,这样 FDCAN2 的 MessageRAMOffset 可以直接设置为 FDCAN1 的 EndAddress - SRAMCAN_BASE 。

以下的例子展示一个 Message RAM 的配置:

    hfdcan->Init.MessageRAMOffset=0;                         //FDCAN1 信息RAM偏移为 0hfdcan->Init.StdFiltersNbr=10;                           //标准信息ID滤波器个数为10hfdcan->Init.ExtFiltersNbr=10;                           //扩展信息ID滤波器个数为10hfdcan->Init.RxFifo0ElmtsNbr=10;                         //接收FIFO0元素个数hfdcan->Init.RxFifo0ElmtSize=FDCAN_DATA_BYTES_64;        //接收FIFO0 :64字节hfdcan->Init.RxFifo1ElmtsNbr=0;                          //接收FIFO1元素个数hfdcan->Init.RxFifo1ElmtSize=FDCAN_DATA_BYTES_64;        //接收FIFO1:64字节hfdcan->Init.RxBuffersNbr=0;                             //接收缓冲区个数hfdcan->Init.RxBufferSize=FDCAN_DATA_BYTES_64;           //接收BUFF:64字节hfdcan->Init.TxEventsNbr=0;                              //发送事件个数hfdcan->Init.TxBuffersNbr=0;                             //发送缓冲区个数hfdcan->Init.TxFifoQueueElmtsNbr=10;                     //发送FIFO个数为10hfdcan->Init.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION;    //发送FIFO模式hfdcan->Init.TxElmtSize=FDCAN_DATA_BYTES_64;             //发送大小:64字节

根据前面的公司计算可以推导 Message RAM 的占用情况:

  1. MessageRAMOffset = 0
  2. StdFiltersNbr 占用 10 word
  3. ExtFiltersNbr 占用 10 * 2 word
  4. RxFifo0ElmtsNbr * RxFifo0ElmtSize 占用 10 * 18 word
  5. RxFifo1ElmtsNbr * RxFifo1ElmtSize 占用 0 * 18 word
  6. RxBuffersNbr * RxBufferSize 占用 0 * 18 word
  7. TxEventsNbr 占用 0 * 2 word
  8. TxBuffersNbr 占用 0 * 18 word
  9. TxFifoQueueElmtsNbr * TxElmtSize 占用 10 * 18 word

共计占用:10 + 20 + 180 + 180 = 390 word = 390 * 4 = 1560 byte = EndAddress = FDCAN2 的 MessageRAMOffset
有兴趣的可以在调试的时候看下手动计算的是否有误。

三,总结

  1. Message RAM 很灵活,为了保证正确 HAL 库做了很多检查,有兴趣的可以去看一下
  2. Message RAM 会影响到滤波器,接收模式,发送模式,后续章节将逐一讲解
  3. 距离第一篇鸽的时间有点久,以后不要再鸽了。

浅析STM32H7 FDCAN(二)相关推荐

  1. 浅析STM32H7 FDCAN(一)

    一,写在前面 目前STM32H7系列全部支持CAN_FD,现在互联网上的关于STM32 CAN_FD的内容基本没有,寥寥几篇也都是关于滤波器的,所以就决定来研究一下,这篇博客就抛砖引玉了,希望大家看完 ...

  2. [转]“Ceph浅析”系列之(二)—Ceph的设计思想

    转载自:http://yizhaolingyan.net/?p=11 分析开源项目,时常遇到的一个问题就是资料不足.有时间写代码的大牛们通常是都是没有时间或者根本不屑于写文档的.而不多的文档通常又是使 ...

  3. 二维动画毕业论文参考文献精选

    随着二维动画制作技术的发展,二维动画在娱乐.广告.教育等很多领域都有着广泛的应用,已成为人们生活中必不可少的一部分.本位精选了200个中英文"二维动画毕业论文参考文献范例",希望对 ...

  4. 深入理解JVM文章合集

    原文地址:http://ddrv.cn/a/88331 Java动态追踪技术探究 在Java虚拟机中,字符串常量到底存放在哪 一次生产 CPU 100% 排查优化实践 聊聊 Java 虚拟机:类的加载 ...

  5. 我最佩服的一位同学!他是哈工大在读NLP博士积累28W粉丝

    今天只给大家介绍我的朋友忆臻,我是在知乎认识他的,解答了我不少问题,他目前在哈工大SCIR实验室读NLP方向博士,一直热心回答问题,知乎粉丝达到3万多人! 忆臻创建的公众号[机器学习算法与自然语言处理 ...

  6. 洛谷日报 2020年3月前索引

    2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https://www.luo ...

  7. 洛谷日报索引(2020、2019、2018)

    历年洛谷日报索引 2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https: ...

  8. [转载]洛谷日报索引

    2019年 6月 #183[朝田诗乃]你以为莫队只能离线?莫队的在线化改造 https://shoko.blog.luogu.org/moqueue #182[Heartlessly ]常用距离算法详 ...

  9. Glide系列(四) — Glide缓存流程分析

    文章目录 一.概述 1.1 背景 1.2 系列文章 二.准备知识 2.1 Glide 的缓存分层结构 2.2 Glide 缓存相关类的关联关系 三.缓存的获取流程 3.1 缓存获取的入口 3.2 内存 ...

最新文章

  1. error:CLEARTEXT communication to api.help.bj.cn not permitted by network security policy
  2. 浅谈.NET(C#)与Windows用户账户信息的获取
  3. saltstack二次开发构建自己的api
  4. mysql 给表起别名_MySQL ------ 高级联结 (自联结,自然联结,外联结,带聚合函数的联结)(十五)...
  5. Fiori UI上创建的note和web client UI上note的对应关系
  6. php伪静态限制网页播放视频,学习猿地-php伪静态后html不能访问怎么办
  7. mysql dml原理_InnoSQL/MySQL DML Flashback功能简介
  8. 《C++面向对象高效编程(第2版)》——4.5 对象复制的语义
  9. 差分进化算法 matlab,差分进化算法之Matlab实现
  10. 我从不劝退,我就是退。
  11. 计算机报名验证码不出现怎么办,电脑显示验证码很慢或验证码显示不出来怎么办...
  12. 语音识别sdk_语音识别 sdk_离线语音识别sdk - 云+社区 - 腾讯云
  13. JavaScript实现手机拍摄图片的旋转、压缩
  14. 加州欧文计算机工程专业,加州大学欧文分校计算机工程专业本科直录申请条件...
  15. html5学生成绩表,学生成绩表
  16. MacBookPro硬盘升级记
  17. Paper reading (八十六):Normalization of the microbiota in patients after treatment for colonic lesions
  18. matlab创新开放性实验,基于MATLAB 的自动控制原理实验仿真系统的设计
  19. Jetson 加装 USB 声卡后设置为默认声卡
  20. 原型的概念以及为什么使用原型

热门文章

  1. Toast 消息提示框
  2. oop 商品信息按商品名称查询 商品按价格排序 内含测试类
  3. excel批量制作条形码_如何在Microsoft Excel中制作条形图
  4. 初识Hadoop(会飞的大象)
  5. android图片叠加方法
  6. redis三种集群方案
  7. 《网络是怎样连接的》-----户根勤,读书笔记
  8. 视频语音转换成文字要怎么操作呢?
  9. [画皮Ⅱ/画皮2][BD-RMVB.720p.国语中字][2012年最新奇幻]
  10. 2018深信服笔试-抓兔子 DP