paotangsan 发表于 2025-8-16 21:19

使用FreeRTOS时,需要将HAL时基从SysTick切换到定时器(如 TIM6、TIM7)

问题背景:
在STM32开发中,HAL库会默认使用SysTick定时器作为系统时基,提供1ms的时钟节拍,用于实现HAL_Delay()等功能。加入FreeRTOS后,RTOS也会使用SysTick作为调度系统时钟源,负责任务切换和时间片管理。这就导致HAL与RTOS同时竞争使用SysTick中断资源.

问题原因:
中断优先级问题引发HAL_Delay()死等,FreeRTOS 默认使用SysTick作为自己的心跳,并将设置为SysTick最低中断优先级,以保证高优先级中断正常执行。当FreeRTOS与HAL库共用SysTick作为系统时基时,如果在一个高于SysTick优先级的中断中(如串口、DMA等)调用 HAL_Delay(),SysTick 无法打断当前中断,也就无法递增 uwTick。结果:HAL_Delay() 中死等,造成该中断函数卡死,导致系统无法调度。

某些 HAL 驱动(如 I2C、SPI、SDIO 等)中也会用到延时判断,一旦 uwTick 无法更新,这些外设可能异常或超时失败。

解决方案:
将 HAL 的时基切换为其他定时器(如 TIM6、TIM7),尽量不要在中断中使用延时HAL_Delay()







————————————————
版权声明:本文为CSDN博主「rain042233」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aa25012/article/details/148113949

页: [1]
查看完整版本: 使用FreeRTOS时,需要将HAL时基从SysTick切换到定时器(如 TIM6、TIM7)