【问题标题】:STM32 HAL CAN TX mailboxesSTM32 HAL CAN TX 邮箱
【发布时间】:2016-09-01 20:34:35
【问题描述】:

我正在开发一个使用 STM32 HAL 驱动程序的项目,尤其是中断模式下的 CAN 驱动程序。

据我了解,STM32F407xx 微控制器有三个 CAN 发送邮箱,允许用户一次“排队”三个消息进行发送。

然而,当 HAL_CAN_Transmit_IT() 在第二次调用中快速调用时,HAL CAN 驱动程序似乎返回 HAL_BUSY;查看源代码,该函数在将句柄状态设置为 BUSY_TX 之前似乎没有检查任何其他邮箱是否为空(即使另一个邮箱可以用于以下消息),从而防止添加后续调用将消息发送到另一个邮箱。

我是否错过了有关此驱动程序工作方式的某些信息?过去有人遇到过这种情况吗?

【问题讨论】:

    标签: stm32 can-bus hal


    【解决方案1】:

    我的大部分 STM32 工作都是裸机或开放库,所以我不熟悉官方的 STM32 工具集,比如我假设你正在使用的 STM32CubeMX

    除了那个免责声明,我认为这与邮箱的使用方式有关。

    在 STM32F413/423 的文档(第 32.3.3 节)中,它说:

    软件提供了三个发送邮箱用于设置消息。传输调度器决定首先传输哪个邮箱。

    在第32.7.1节中,它说发送邮箱优先级

    按标识符:当多个发送邮箱处于挂起状态时,发送顺序由邮箱中存储的消息的标识符给出。根据 CAN 协议的仲裁,具有最低标识符值的消息具有最高优先级。如果标识符值相等,则将首先安排较低的邮箱号。

    按发送请求顺序:通过设置 CAN_MCR 寄存器中的 TXFP 位,可以将发送邮箱配置为发送 FIFO。在这种模式下,优先级顺序由传输请求顺序给出。

    效果是,如果您加载邮箱 0,然后是 1,然后是 2,它们可能会根据消息的 CAN id 以任何顺序完成。这是因为 CAN id 将双重滚动作为“地址”和消息优先级标记。此邮箱行为允许程序员自动进行此优先级排序。

    但是,对于大多数类型的流量,消息应该按照它们排队的顺序发送。使用单个邮箱可防止打乱消息的顺序。

    所以,也许这就是你所看到的。

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2017-04-07
      • 2017-07-20
      • 2015-09-24
      • 2018-08-26
      • 2021-08-27
      • 2021-05-20
      • 2022-01-13
      • 2018-01-09
      相关资源
      最近更新 更多