STM32+FreeRTOS移植完整教程(基于CubeMX),从配置到验证一步到位
很多做嵌入式的小伙伴想上 FreeRTOS,但总觉得移植很复杂。其实用STM32CubeMX,配置 FreeRTOS 只需要点几下鼠标。
但 CubeMX 生成的代码并不是开箱即用的,这篇文章带你走完从 CubeMX 配置 → 代码生成 → 任务验证的完整流程,并指出那些 CubeMX 不告诉你的关键细节。
一、硬件准备
本教程基于以下硬件平台,同样适用于 STM32F1/4 系列:
- MCU:STM32F103C8T6(Blue Pill)
- IDE:Keil MDK v5 或 STM32CubeIDE
- CubeMX 版本:v6.x(操作步骤通用)
二、CubeMX 配置步骤
2.1 新建工程,选择 MCU
- 打开 CubeMX,点击New Project
- 搜索STM32F103C8,选中后双击
- 系统会提示初始化外设,点 Yes
2.2 配置时钟(RCC)
这一步很关键,很多人卡在这里。
Pinout & Configuration → RCC - HSE: Crystal/Ceramic Resonator (外部8MHz晶振) - LSE: 不需要可以不选Clock Configuration 标签页 - HSE: 8MHz - PLL: x9 → 72MHz - APB1: 36MHz (不要超过36MHz) - APB2: 72MHz最终系统时钟SYSCLK = 72MHz。
⚠️ FreeRTOS 的
configCPU_CLOCK_HZ需要和系统时钟一致。项目里见过很多人这里配了 72MHz,但 FreeRTOSConfig.h 里还是默认的 168MHz。
2.3 配置 FreeRTOS
这是核心步骤:
Pinout & Configuration → Middleware → FREERTOS - Interface: CMSIS_V2 ← 选 V2,功能更完整 - Tasks and Queues 标签页添加任务:
点击Add创建第一个任务:
| 参数 | 值 |
|---|---|
| Task Name | defaultTask |
| Priority | Normal |
| Stack Size | 256 (words) |
| Entry Function | StartDefaultTask |
| Code Generation | As weak weak (默认即可) |
可以继续添加更多任务,建议初期只建 1-2 个。
2.4 关键配置(最容易漏的)
Pinout & Configuration → SYS - Timebase Source: TIM1 ← 非常重要!为什么?
CubeMX 让你选择 HAL 的时基源。如果不选 TIM1 而保留 SysTick,那 FreeRTOS 和 HAL 库会共用 SysTick,导致:
- 串口打印乱码(HAL_GetTick 乱掉)
- 任务调度异常
- HAL_Delay 不准确
这个坑我已经见太多人踩了,包括我自己。
2.5 生成代码
Project Manager → Project - Project Name: freertos_demo - Location: 你的工作目录 - IDE: MDK-ARM V5 或 STM32CubeIDE Project Manager