STM32 CAN发送邮箱和接收FIFO

本文详细介绍了STM32微控制器的CAN外设,包括其3个发送邮箱的结构与操作,以及2个接收FIFO的机制,包括报文计数器、锁定模式和报文缓存处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32的CAN发送邮箱和接收FIFO

CAN发送邮箱

  • CAN外设一共有3个发送邮箱,即最多可以缓存3个待发送的报文。每个发送邮箱中包含有标识符寄存器CAN_TIxR、数据长度控制寄存器CAN_TDTxR及2个数据寄存器CAN_TDLxR、 CAN_TDHxR,它们的功能如下:
寄存器名功能
标识符寄存器CAN_TIxR存储待发送报文的ID、 扩展ID、 IDE位及RTR位
数据长度控制寄存器CAN_TDTxR存储待发送报文的DLC段
低位数据寄存器CAN_TDLxR存储待发送报文数据段的Data0-Data3这四个字节的内容
高位数据寄存器CAN_TDHxR存储待发送报文数据段的Data4-Data7这四个字节的内容
  • 当要使用CAN外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去。
  • 其中标识符寄存器CAN_TIxR中的STDID寄存器位比较特别。 CAN的标准标识符的总位数为11位,而扩展标识符的总位数为29位的。当报文使用扩展标识符的时候,标识符寄存器CAN_TIxR中的STDID[10:0]等效于EXTID[18:28]位,它与EXTID[17:0]共同组成完整的29位扩展标识符。

CAN接收FIFO

  • CAN外设一共有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文。当接收到报文时, FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的RFLM位,可设置锁定模式,锁定模式下FIFO溢出时会丢弃新报文,非锁定模式下FIFO溢出时新报文会覆盖旧报文。
  • 跟发送邮箱类似,每个接收FIFO中包含有标识符寄存器CAN_RIxR、数据长度控制寄存器CAN_RDTxR及2个数据寄存器CAN_RDLxR、 CAN_RDHxR,其功能如下:
寄存器名功能
标识符寄存器CAN_RIxR存储收到报文的ID、 扩展ID、 IDE位及RTR位
数据长度控制寄存器CAN_RDTxR存储收到报文的DLC段
低位数据寄存器CAN_RDLxR存储收到报文数据段的Data0-Data3这四个字节的内容
高位数据寄存器CAN_RDHxR存储收到报文数据段的Data4-Data7这四个字节的内容
### STM32F407 CAN FIFO 大小配置 STM32F407 的 CAN 控制器支持两个独立的接收 FIFOFIFO0 FIFO1),以及一个发送邮箱用于消息传输。这些 FIFO 的大小是由硬件决定的,具体如下: #### 接收 FIFO 配置 STM32F407 中的 CAN 模块提供了两个接收 FIFO: - **FIFO0**: 可存储 3 条消息。 - **FIFO1**: 同样可存储 3 条消息。 这两个 FIFO 是固定的硬件资源,其容量不可通过软件动态调整[^1]。当接收到的消息数量超过 FIFO 容量时,新消息会被丢弃,除非启用了覆盖模式(Overwrite Mode)。可以通过设置 `CAN_FIFOMailBox` 寄存器来管理 FIFO 数据流。 为了处理接收到的数据,通常需要在初始化阶段启用中断通知机制,并重新定义相应的回调函数。例如,在 HAL 库中可以调用以下函数完成此操作: ```c HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING); ``` 这会激活 FIFO0 的消息待处理中断,以便及时响应新的数据到达事件[^2]。 #### 发送 FIFO 配置 对于发送功能而言,STM32F407 使用的是三个优先级可控的发送邮箱而非传统意义上的 FIFO 结构。这意味着开发者可以根据实际需求指定某条消息具有更高的优先权从而提前发出。同样地,这三个发送邮箱也是固定分配好的硬件单元,无法更改它们的数量或者尺寸[^3]。 如果希望优化发送流程,则应该注意合理安排各条待传信息之间的次序关系,确保重要程度较高的内容能够尽快得到传送机会。 ```c // 示例代码展示如何添加一条消息到发送队列当中去 uint32_t TxMailbox; if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, aData, &TxMailbox) != HAL_OK){ Error_Handler(); } ``` 以上片段展示了向其中一个可用发送邮箱插入新消息的过程。其中包含了目标地址详情以及其他必要参数设定等内容。 --- ### 总结 综上所述,STM32F407 的 CAN 外设有两组分别能容纳三条记录长度的接受缓冲区(FIFO),还有三处可供调度使用的传出请求位置(即所谓的"发送邮箱")。这些都是预先确定下来的设计规格,编程期间仅需依据项目特定状况做适当调配即可达成理想效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YRr YRr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值