在 STM32 上使用 FreeRTOS 处理多个中断

Posted

技术标签:

【中文标题】在 STM32 上使用 FreeRTOS 处理多个中断【英文标题】:Handling multiple interrupts with FreeRTOS on STM32 【发布时间】:2021-01-16 20:53:53 【问题描述】:

我的基于 MCU 的控制系统必须快速检查 18 个开关触点状态。我将使用 STM32F7 MCU,它最大有 16 个 int。处理程序。所以我决定使用IO expendar IC 和分组。现在我有 12 个 IO 外部中断,另外 2 个中断来自 IO 扩展器。此外,FreeRTOS 将具有用于通信的以太网、uart 和 canbus 任务。中断对系统来说非常重要。它们之间存在毫秒差异,我必须正确检测所有引脚状态。我需要针对这种情况的专家建议。

我的问题是:

这是正确的方法吗?在FreeRTOS上使用14个外部中断处理多个通信任务 有没有更好的办法?

【问题讨论】:

您提到“毫秒差”。这样比较轻松。您可以轻松地使用每毫秒触发一次中断然后检查所有开关的计时器。不需要额外的部件或许多中断处理程序。 您说创建一个任务,该任务具有一个循环,用于每 0.5 毫秒或 1 毫秒检查一次所有 GPIO 状态。在后端,其他任务(以太网、UART 等)运行是否清晰? “其他任务运行清晰”是什么意思? 我的 mcu 有 1 个核心,因此在现实世界中的任务不会同时运行。很多中断可能会伤害以太网或我认为的其他任务 1ms 非常接近默认的 FreeRTOS 调度程序时钟 1kHz。因此,您可以使用硬件计时器检查输入级别,然后在需要任何进程时将消息或邮件发送到睡眠任务。我在设计中经常使用这个系统。如果您需要确保“ 【参考方案1】:

使用 IO 扩展器似乎是解决问题的错误方法(额外的复杂性和成本)。您不必为每个引脚分配一个专用的 ISR。只要在任何 GPIO 中断后读取 GPIOx_IDR 寄存器,然后检查相关位STM32 Datasheet

【讨论】:

以上是关于在 STM32 上使用 FreeRTOS 处理多个中断的主要内容,如果未能解决你的问题,请参考以下文章

禁用中断让freeRTOS在stm32上运行

FreeRTOS STM32 集成

移植FreeRTOS到STM32

移植FreeRTOS到STM32

移植FreeRTOS到STM32

在 stm32f7 上使用 freeRTOS 的 sprint/printf 问题