VSCode EIDE 开发 STM32 (FreeRTOS) 教程 —— Makefile 工程导入篇
一、 环境说明
- 目标芯片:STM32F407ZET6 (Cortex-M4F)
- 生成工具:STM32CubeMX
- 开发环境:VSCode + Embedded IDE (EIDE) 插件
- 工具链:ARM GCC
二、 工程创建与整合
由于 EIDE 暂不支持直接解析 Makefile,我们需要采用“新建空工程 + 手动整合源码”的方式。
1. STM32CubeMX 生成代码
- 配置工程:在
Project Manager->Toolchain / IDE中选择Makefile。 - 生成代码:点击
GENERATE CODE。2. EIDE 新建空工程
- VSCode 中点击 EIDE 图标 ->
New Project。 - 选择
STM32 Cube Project(或对应的 GCC 空工程模板)。 - 填写工程名,并在芯片选择界面选定具体型号(如
STM32F407ZET)。- 注意:这一步决定了后续的编译参数和下载算法。
3. 文件整合
将 CubeMX 生成的文件复制到 EIDE 工程目录下:
- 注意:这一步决定了后续的编译参数和下载算法。
- 复制项:
Core(源码/头文件)Drivers(HAL库/CMSIS)Middlewares(FreeRTOS 源码)STM32F407ZETX_FLASH.ld(链接脚本)startup_stm32f407xx.s(启动文件)
- 操作:将上述文件/文件夹直接复制到 EIDE 工程的根目录中。
三、 关键配置 (手动搬运)
这是 Makefile 方式最繁琐的一步,需要参考 CubeMX 生成的 Makefile 文件,将配置“搬”到 EIDE 中。
1. 添加源文件
在 EIDE 项目面板中,添加以下目录的 .c 文件:
Core/SrcDrivers/STM32F4xx_HAL_Driver/SrcMiddlewares/Third_Party/FreeRTOS/Source(及其子目录)Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4FMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V22. 配置头文件路径
打开 EIDE ->Builder Options->Include Paths,添加:Core/IncDrivers/STM32F4xx_HAL_Driver/IncDrivers/STM32F4xx_HAL_Driver/Inc/LegacyDrivers/CMSIS/Device/ST/STM32F4xx/IncludeDrivers/CMSIS/IncludeMiddlewares/Third_Party/FreeRTOS/Source/includeMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4FMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V23. 配置宏定义
打开Builder Options->Preprocessor Definitions,添加:USE_HAL_DRIVERSTM32F407xx4. 指定链接脚本
打开Linker Options->Linker Script File,选择:STM32F407ZETX_FLASH.ld
四、 核心报错排查与修复
Makefile 导入方式下,有两个极易触发的编译/链接错误,必须手动修复。
报错一:FPU 指令集不支持 (编译错误)
【报错日志】
C:\Users\haday\AppData\Local\Temp\ccVCR7cX.s: Assembler messages:
C:\Users\haday\AppData\Local\Temp\ccVCR7cX.s:529: Error: selected FPU does not support instruction -- `vstmdbeq r0!,{s16-s31}'
C:\Users\haday\AppData\Local\Temp\ccVCR7cX.s:551: Error: selected FPU does not support instruction -- `vldmiaeq r0!,{s16-s31}'
ERROR compilation failed at : ".../ARM_CM4F/port.c", exit code: 1
注:命令行中可见参数 -mfloat-abi=soft。
【错误分析】
- 原因:STM32F407 带有硬件 FPU。CubeMX 生成的 FreeRTOS 移植文件
port.c(位于ARM_CM4F目录) 使用了硬件浮点指令 (vstmdb等)。 - 冲突:EIDE 新建工程默认 FPU 设置为 "None" 或 "Soft",导致编译器不支持硬件浮点指令,从而报错。
【解决方案】
- 单精度浮点数

报错二:链接脚本语法错误 (链接错误)
【报错日志】
.../arm-none-eabi/bin/ld.exe: .../STM32F407ZETX_FLASH.ld:56: syntax error
.../arm-none-eabi/bin/ld.exe: .../STM32F407ZETX_FLASH.ld:147: syntax error
collect2.exe: error: ld returned 1 exit status
【错误分析】
STM32CubeMX 生成的 GCC 链接脚本存在固定的语法缺陷,主要涉及内存区域参数缺失。
【解决方案】
打开 STM32F407ZETX_FLASH.ld 文件,进行以下 4 处修改:
- 第 56 行 (栈顶地址):
/* 修改前 */ _estack = ORIGIN() + LENGTH(); /* 修改后 */ _estack = ORIGIN(RAM) + LENGTH(RAM); - 第 147 行 (.data 段):
/* 修改前 */ } > AT> FLASH /* 修改后 */ } >RAM AT> FLASH - 第 183 行 (.bss 段):
/* 修改前 */ } > /* 修改后 */ } >RAM - 第 194 行 (堆栈段):
/* 修改前 */ } > /* 修改后 */ } >RAM
五、 总结
采用 Makefile 方式导入 EIDE,核心在于“手动对齐配置”与“修正工具链默认参数”。
| 步骤 | 关键操作 | 常见遗漏 |
|---|---|---|
| 源码整合 | 复制 Core, Drivers, Middlewares | 漏复制 .ld 或启动文件 |
| 编译配置 | 添加 Include Paths, Defines | 漏加 FreeRTOS 的 portable 路径 |
| FPU 设置 | Target Options -> FPU 选 fpv4-sp-d16 |
默认为 Soft,导致 port.c 报错 |
| 链接修复 | 修改 .ld 文件 4 处语法错误 |
漏改会导致链接失败 |
完成以上步骤后,STM32CubeMX (FreeRTOS) 的 Makefile 工程即可在 VSCode EIDE 中正常编译运行。