我正在开发一个使用STM32 HAL驱动程序的项目,特别是处于中断模式的CAN驱动程序。据我所知,STM32F407xx微控制器有三个CAN传输邮箱,允许用户排队"一次传输三条消息。 然而,在第二次调用时,当快速调用HAL_CAN_Transmit_IT()时,HAL CAN驱动程序似乎返回HAL_BUSY;看一下源代码,看起来函数在将句柄状态设置为BUSY_TX之前没有检查是否有其他邮箱是空的(即使另一个邮箱可以用于以下消息),阻止了连续的调用从添加邮件到另一个邮箱。
我错过了这个驱动程序的工作方式吗?过去有人遇到过这种情况吗?任何想法都将不胜感激。
谢谢!
答案 0 :(得分:0)
我的大部分STM32工作都是裸机或者是一个开放的库,所以我不熟悉我认为你正在使用的官方STM32工具集,如cube。
有了免责声明,我认为这与邮箱的使用方式有关。
在STM32F413 / 423(第32.3.3节)的文档中,它说:
Three transmit mailboxes are provided to the software for setting up messages. The transmission Scheduler decides which mailbox has to be transmitted first.
在第32.7.1节中,它说邮箱优先级已发送
按标识符:当多个发送邮箱处于挂起状态时,传输顺序由存储在邮箱中的邮件的标识符给出。根据CAN协议的仲裁,具有最低标识符值的消息具有最高优先级。如果标识符值相等,则将首先安排较低的邮箱号码。
通过发送请求顺序:通过设置CAN_MCR寄存器中的TXFP位,可以将发送邮箱配置为发送FIFO。在此模式下,优先顺序由发送请求顺序给出。
效果是,如果您加载邮箱0,然后加载1,然后加载2,它们可以按任何顺序完成,具体取决于邮件的CAN ID。这是因为CAN ids将双掷作为一个地址'并作为消息优先级标记。此邮箱行为允许为程序员自动执行此优先级排序。
但是,对于大多数类型的流量,预计消息将按其排队的顺序发送。使用单个邮箱可以防止加扰邮件的顺序。
所以,也许这就是你所看到的。