Nucleo STM32H723开发板FreeRTOS的osDelay延时为预期3倍问题求助
问题根因
- 延时偏差是FreeRTOS滴答定时器初始化时机早于系统时钟配置时机导致的:
- CubeIDE默认生成的代码会先初始化FreeRTOS内核、配置Timer7作为滴答时钟源,此时
SystemCoreClock还停留在HSI的64MHz初始值,Timer7的重载值、分频系数都是基于64MHz计算的 - 后续才会执行
SystemClock_Config()将系统主频拉高到216MHz,Timer7的实际计数频率随总线时钟同步升高,但FreeRTOS配置的configCPU_CLOCK_HZ引用的SystemCoreClock已经更新为216MHz,内核计算tick时长的基准和Timer7实际计数频率不匹配 - 你手动将
configCPU_CLOCK_HZ固定为64000000后,内核计算基准和Timer7初始化时的基准一致,所以延时恢复正常,本质是掩盖了初始化顺序错误的问题
- CubeIDE默认生成的代码会先初始化FreeRTOS内核、配置Timer7作为滴答时钟源,此时
CubeIDE配置修复方案
不需要手动修改FreeRTOSConfig.h,仅需调整生成代码的执行顺序即可:
- 打开CubeIDE的Pinout & Configuration界面,进入Project Manager > Advanced Settings
- 在
Generated Function Calls列表中,拖动SystemClock_Config()项,将其调整到MX_FREERTOS_Init()之前 - 确认FreeRTOS配置中
configCPU_CLOCK_HZ保持默认的SystemCoreClock、滴答源保持为Timer7 - 重新生成代码下载运行即可
验证
调用osDelay(10000)测量实际延时,确认已经恢复为10秒的正常水平。
内容的提问来源于stack exchange,提问作者Michael Ringkøbing Jensen
相关产品推荐
相关产品推荐

