STM32 HAL CAN TX 邮箱
Posted
技术标签:
【中文标题】STM32 HAL CAN TX 邮箱【英文标题】:STM32 HAL CAN TX mailboxes 【发布时间】:2016-09-01 20:34:35 【问题描述】:我正在开发一个使用 STM32 HAL 驱动程序的项目,尤其是中断模式下的 CAN 驱动程序。
据我了解,STM32F407xx 微控制器有三个 CAN 发送邮箱,允许用户一次“排队”三个消息进行发送。
然而,当 HAL_CAN_Transmit_IT() 在第二次调用中快速调用时,HAL CAN 驱动程序似乎返回 HAL_BUSY;查看源代码,该函数在将句柄状态设置为 BUSY_TX 之前似乎没有检查任何其他邮箱是否为空(即使另一个邮箱可以用于以下消息),从而防止添加后续调用将消息发送到另一个邮箱。
我是否错过了有关此驱动程序工作方式的某些信息?过去有人遇到过这种情况吗?
【问题讨论】:
【参考方案1】:我的大部分 STM32 工作都是裸机或开放库,所以我不熟悉官方的 STM32 工具集,比如我假设你正在使用的 STM32CubeMX。
除了那个免责声明,我认为这与邮箱的使用方式有关。
在 STM32F413/423 的文档(第 32.3.3 节)中,它说:
软件提供了三个发送邮箱用于设置消息。传输调度器决定首先传输哪个邮箱。
在第32.7.1节中,它说发送邮箱优先级
按标识符:当多个发送邮箱处于挂起状态时,发送顺序由邮箱中存储的消息的标识符给出。根据 CAN 协议的仲裁,具有最低标识符值的消息具有最高优先级。如果标识符值相等,则将首先安排较低的邮箱号。
按发送请求顺序:通过设置 CAN_MCR 寄存器中的 TXFP 位,可以将发送邮箱配置为发送 FIFO。在这种模式下,优先级顺序由传输请求顺序给出。
效果是,如果您加载邮箱 0,然后是 1,然后是 2,它们可能会根据消息的 CAN id 以任何顺序完成。这是因为 CAN id 将双重滚动作为“地址”和消息优先级标记。此邮箱行为允许程序员自动进行此优先级排序。
但是,对于大多数类型的流量,消息应该按照它们排队的顺序发送。使用单个邮箱可防止打乱消息的顺序。
所以,也许这就是你所看到的。
【讨论】:
以上是关于STM32 HAL CAN TX 邮箱的主要内容,如果未能解决你的问题,请参考以下文章