STM32+FreeRTOS移植完整教程(基于CubeMX),从配置到验证一步到位 很多做嵌入式的小伙伴想上 FreeRTOS,但总觉得移植很复杂。其实用STM32CubeMX,配置 FreeRTOS 只需要点几下鼠标。但 CubeMX 生成的代码并不是开箱即用的,这篇文章带你走完从 CubeMX 配置 → 代码生成 → 任务验证的完整流程,并指出那些 CubeMX 不告诉你的关键细节。一、硬件准备本教程基于以下硬件平台,同样适用于 STM32F1/4 系列:MCU:STM32F103C8T6(Blue Pill)IDE:Keil MDK v5 或 STM32CubeIDECubeMX 版本:v6.x(操作步骤通用)二、CubeMX 配置步骤2.1 新建工程,选择 MCU打开 CubeMX,点击New Project搜索STM32F103C8,选中后双击系统会提示初始化外设,点 Yes2.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 NamedefaultTaskPriorityNormalStack Size256 (words)Entry FunctionStartDefaultTaskCode GenerationAs 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