1

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

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

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

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

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

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

于 2017-10-04T23:21:50.363 回答