1. 问题现象与初步排查
当你在Keil或STM32CubeIDE中基于FreeRTOS创建工程后,编译通过但LED灯不闪烁时,这种问题通常发生在STM32初学者身上。我自己在2016年第一次移植FreeRTOS到STM32F103时就遇到过完全相同的状况。LED不亮这个看似简单的现象,背后可能隐藏着至少5个不同层面的问题。
首先用逻辑分析仪抓取TIM4的输出引脚(假设LED接在PB6/TIM4_CH1),会发现两种情况:要么根本没有PWM信号输出,要么PWM参数异常。通过ST-Link的SWD接口查看RTOS任务运行状态,通常会看到xTaskCreate创建的任务处于"Ready"状态但从未被执行。
关键检查点:在main()函数中调用HAL_TIM_PWM_Start()之后,立即插入HAL_GPIO_TogglePin()测试。如果GPIO能正常翻转,说明问题出在RTOS任务调度上。
2. FreeRTOS工程配置陷阱
2.1 堆栈分配误区
在CubeMX配置FreeRTOS时,默认的Heap Size只有3072字节。对于包含多个任务的工程,这个值远远不够。我建议使用heap_4.c内存管理方案,并将configTOTAL_HEAP_SIZE设置为至少10240字节。修改FreeRTOSConfig.h时要注意:
c复制#define configTOTAL_HEAP_SIZE ((size_t)10240) // 必须强制类型转换
2.2 时钟源配置冲突
CubeMX生成的HAL初始化代码可能和FreeRTOS的时钟需求冲突。特别是当使用TIM4作为PWM输出时,需要检查:
- APB1定时器时钟是否使能
- TIM4的时钟预分频值与FreeRTOS的SysTick是否倍数关系
- 在stm32f1xx_hal_conf.h中确保
#define HAL_TIM_MODULE_ENABLED
2.3 优先级设置问题
新手常犯的错误是给LED闪烁任务设置过低的优先级。建议这样配置:
c复制xTaskCreate(led_task, "LED", 128, NULL, 3, NULL); // 优先级3比较合适
同时检查FreeRTOSConfig.h中的配置
