ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

用VS Code搭建STM32开发环境:替代Keil的完整指南

用VS Code搭建STM32开发环境:替代Keil的完整指南 折腾过几年 STM32 的朋友应该都有过这样的体验拿着 Keil MDK 吭哧吭哧写代码函数跳转卡顿代码补全靠记忆想用点现代的代码分析工具基本别想。尤其是现在嵌入式软件 AI 编程越来越普及很多人开始用各种 AI 辅助插件提升开发效率Keil 这种老牌 IDE 在生态整合上明显跟不上节奏。这也是我强烈建议你用 VS Code 做 STM32 开发的原因——编辑器层面免费、轻量、插件生态丰富配合上 STM32 的扩展工具链完全能应付从工程编译、代码跳转到在线调试的完整流程。这篇博文就是把“安装 VS Code 与 STM32 扩展工具”这件事彻底讲透。我会从环境选型思路讲起带你一步步把编辑器、编译器、调试器、烧录工具串起来最后附上这些年我踩过的坑和排查方法。不管你是刚入坑的嵌入式小白还是被 Keil 折磨多年的老手照着做基本都能搭出一套顺手、现代、还能接 AI 编程工具的开发环境。1. 整体设计思路为什么是 VS Code 而不是别的 IDE1.1 从 Keil 到 VS Code到底在迁移什么很多人的第一个疑问是Keil MDK 明明也是主流项目模板现成下载器配置好点一下 Download 就能烧录为什么要折腾 VS Code我的回答是Keil 解决的是“能不能编译烧录”的问题而 VS Code 解决的是“开发体验和生产力”的问题。举几个最直观的例子。Keil 的代码补全基本等于摆设写结构体成员时不会像现代编辑器那样弹出候选列表跨文件跳转函数定义Keil 最新版虽然有提升但和 VS Code 的 C/C 插件比流畅度和准确性差距明显更不用说 Git 集成、代码格式化、多光标编辑、远程开发这些现代开发标配功能。你如果尝试过在 Keil 里接 AI 编程插件比如通义灵码、CodeGeeX 这类会发现兼容性很差因为它们基本都为 VS Code、JetBrains 这类主流编辑器做适配。换句话说嵌入式软件 AI 编程这个方向VS Code 几乎是当前最顺滑的入口。但这里要澄清一个关键点VS Code 本身只是一个编辑器它不认识 STM32更不会编译。我们做的事情本质上是把原来 Keil 里集成的几个组件拆开各自单独安装后再组合起来。这些组件包括编译器GCC 交叉编译工具链、调试器OpenOCD 或 ST-Link 驱动、构建工具CMake 或 Make、以及 VS Code 里的各种插件。理解了这个思路后面每一步你都会清楚自己在装什么、为什么装。1.2 环境构成的四个核心角色把 STM32 开发环境拆开看其实就四个角色编辑器VS Code 负责写代码、看代码、跳转、补全。编译器把 C 代码编译成 ARM Cortex-M 芯片能跑的机器码。常用的是 Arm GNU Toolchaingcc-arm-none-eabi这是 ARM 官方推荐的 GCC 版本免费、开源、社区活跃。构建工具把多个源文件、头文件路径、链接脚本组织起来调用编译器完成最终的 .elf 和 .hex 生成。现在主流是 CMake 配合 Ninja 或者 Make也有不少人直接用 STM32CubeMX 生成 Makefile 再配 tasks.json。调试与烧录工具OpenOCDOpen On-Chip Debugger是开源调试器支持 ST-Link、J-Link、DAP-Link 等常见调试器烧录则是通过调试器把固件写入芯片 Flash。VS Code 里的 STM32 扩展工具本质上是把以上几个角色“缝”在一起的粘合剂。比如 C/C 插件提供语法解析和跳转Cortex-Debug 插件负责和 OpenOCD 通信实现断点调试ARM 插件则提供了对 Cortex-M 芯片的一些专用功能。这套组合搭建完毕你会得到一个完全可复现、可配置、可移植的开发环境。换电脑的时候不用再装几百 MB 的 Keil 然后担心注册码丢失只要把配置文件同步到云端两个小时就能恢复全部开发环境。2. VS Code 安装与基础配置实操2.1 在 Windows 上安装 VS Code 的细节VS Code 的安装本身不算难但有几个细节直接决定后续好不好用。官网下载用户版User Installer还是系统版System Installer我自己的习惯是直接用系统版因为后续要配合 STM32 官方命令行工具、串口驱动等系统级安装能少一些权限路径的坑。不过用户版也有优势就是不用管理员权限公司电脑受限时也能装。安装向导走到“选择附加任务”这一步时建议把以下三个选项都勾上“将‘使用 Code 打开’操作添加到文件和目录上下文菜单”——这样在文件夹上右键就能直接用 VS Code 打开工程非常方便。“将 code 命令添加到 PATH”——这个必须勾。后面我们需要在终端里输入 code 命令来打开工程如果没有加 PATH命令行会提示找不到命令。“检查关联项”那一步保持默认就好不用让它成为各种文件的默认打开程序。装完之后第一次启动会进入欢迎页。这里建议做两件事第一按 CtrlShiftP 打开命令面板输入 “shell command” 确认 code 命令是否可用第二确认左下角显示的版本号。后续很多插件对 VS Code 版本有最低要求保持更新到最新版可以省掉很多兼容性麻烦。之前有人问过VS Code 官网下载速度慢怎么办。这个我一般直接通过国内镜像源下载具体域名不方便展开但思路是去找微软官方的代理镜像注意不要随便在第三方网站下载安装包避免包被篡改。安装包弹出安全警告时看清文件名和来源没问题的再运行。2.2 界面汉化、字体与主题设置装完默认是英文界面习惯中文的可以去扩展商店搜索 “Chinese (Simplified) Language Pack”安装后右下角会提示重启。这个中文包是微软官方出的放心装。字体这块嵌入式开发读写代码经常涉及中文注释、特殊符号建议把编辑器字体设置成能同时显示中英文的配置。我个人常用的设置是{ editor.fontFamily: Cascadia Code, JetBrains Mono, Consolas, Microsoft YaHei, monospace, editor.fontSize: 15, editor.lineHeight: 22, files.autoGuessEncoding: true }其中files.autoGuessEncoding这个很关键。很多 STM32 工程是从 Keil 迁移过来的源码文件可能是 GBK 编码VS Code 默认按 UTF-8 解码就会显示乱码。开了自动猜测编码之后大部分情况能自动识别。如果还是乱码可以点击右下角编码按钮手动改成 GBK。主题方面我推荐先装 “One Dark Pro” 或 “Material Icon Theme”一个是语法高亮颜色好看另一个是文件图标辨识度高。这些都不是必需品但好的主题和图标能明显减少长时间盯代码的疲劳感。3. STM32 扩展工具链安装与配置3.1 必备插件清单及其分工VS Code 的插件非常丰富但搞 STM32 开发别贪多装多了反而互相干扰。我的必备清单如下插件名称作用是否必需C/Cms-vscode.cpptools提供代码跳转、IntelliSense 补全、断点调试配置必需Cortex-Debug与 OpenOCD 配合实现 STM32 在线调试、寄存器查看、外设寄存器可视化必需ARM针对 Cortex-M 的辅助调试和 SVD 文件支持强烈推荐CMake Tools可选如果工程用 CMake 构建这个插件能自动解析并调用构建按需Serial Monitor串口监视器直接在 VS Code 里看串口输出不用再开额外工具强烈推荐Hex Viewer查看 .bin / .hex 固件文件的十六进制内容排查固件生成是否正常按需Embedded Tools一站式嵌入式工具包含 CMSIS 配置等辅助功能可选逐个解释一下为什么是这几个。C/C 插件是 VS Code 里嵌入式开发的绝对核心代码跳转、错误提示、智能补全都靠它。它的一个重要机制是配置c_cpp_properties.json里面指定编译器路径和头文件搜索路径这个文件配置不对就会出现满屏红色波浪线的“假报错”。Cortex-Debug 是调试环节的核心。它不像 C/C 插件自带调试功能而是专门为 ARM Cortex-M 芯片设计的调试器前端能连接调试器ST-Link、J-Link、读取 SVD 外设描述文件把外设寄存器按名字展示出来。这个体验其实是超过了 Keil 的因为 Keil 的外设窗口还要一个个点开找。ARM 插件则是配合用的它会在你选中 Cortex-Debug 调试配置时自动识别内核类型减少手动填参数的工作。SVD 文件的加载也是在这类插件里配置的SVD 文件可以从芯片厂商官方获取例如 STM32F4 系列对应有 stm32f4xxx.svd。3.2 编译器工具链Arm GNU Toolchain 安装没有编译器VS Code 就是空壳。STM32 开发的主流免费编译器是gcc-arm-none-eabi安装包由 ARM 官方发布。下载时需要留意选择对应操作系统的版本Windows 下一般是.exe或者.zip包。安装过程有个特别容易踩的坑安装包默认可能会要求你同意某种许可协议并勾选“添加环境变量”选项不同版本名称有差异有的叫 “Add path to PATH”有的叫 “Add environment variable to PATH”。一定要确保勾上否则后面在终端里输入arm-none-eabi-gcc -v会提示找不到命令。如果你用的是压缩包版本非安装向导解压后需要手动把 bin 目录加入 PATH。具体操作是“此电脑”右键 - 属性 - 高级系统设置 - 环境变量在用户变量或者系统变量的 Path 中添加那一行路径。环境变量设置后新开的终端才会生效VS Code 重启终端后才能读到。验证是否安装成功打开终端输入arm-none-eabi-gcc -v如果看到类似gcc version 10.3.1 20210824 (release)的输出就说明编译器装好了。版本号不重要只要有输出就说明工具链正常工作。顺带说一句如果你之前安装过 STM32CubeMX 或者某家芯片厂商的 IDE也可能自带一份arm-none-eabi-gcc路径不同但效果差不多只要别搞混就行。3.3 调试烧录工具OpenOCD 与 ST-Link 驱动写代码总要烧录调试。VS Code 本身不会烧录我们需要用 OpenOCD 或者 STM32CubeProgrammer 来做。这里我建议两条路都配一下因为使用场景不同烧录固件用 STM32CubeProgrammerSTM32 官方工具命令行烧录稳定可靠还支持加密和选项字节配置。调试断点用 OpenOCD配合 Cortex-Debug 插件能实现设断点、看变量、看寄存器、单步执行这些操作。OpenOCD 在 Windows 上需要自己下载预编译版本。解压后同样要把 bin 目录加入 PATH。它本身不带 ST-Link 驱动所以你还得确保 Windows 能识别 ST-Link。正常做法是安装 ST 官方的 ST-Link 驱动如果你装过 STM32CubeProgrammer它一般会附带装好 ST-Link 驱动。OpenOCD 的配置文件怎么指定以 STM32F103C8T6 为例常用命令是openocd -f interface/stlink.cfg -f target/stm32f1x.cfginterface/stlink.cfg表示使用 ST-Link 调试器target/stm32f1x.cfg表示目标芯片是 STM32F1 系列。如果你的板子用的调试器是 DAP-Link就把 interface 换成cmsis-dap.cfg。不同系列芯片只需改 target 文件比如 STM32F4 就是stm32f4x.cfg。这个配置在 Cortex-Debug 插件里也要填写后面调试章节再细说。4. 工程创建、IntelliSense 与一键编译配置4.1 用 STM32CubeMX 生成 Makefile 工程搭建好工具链之后总得有个工程才能真正“跑出一把火”。虽然很多人还在 GitHub 上一堆老项目的标准外设库模板上自己改但新项目我更推荐用 STM32CubeMX 生成然后用它导出 Makefile 构建工程。这样一是时钟树、引脚复用这些直接在图形界面里配好二是生成的工程结构规范能省很多低级错误。STM32CubeMX 的操作不在本文展开太细但关键点要说在 Project Manager 标签页里Toolchain 那一栏选择 “Makefile”这样生成出来的工程就是一套可以直接由 make 或 CMake 调用的源码树而不是 Keil 的 .uvprojx。生成后打开工程目录你会看到Makefile文件、Core/、Drivers/等目录。其中核心目录是Core/Src里的 main.c 和Core/Inc里的头文件。这个工程本身已经带好了启动文件和链接脚本不需要你去碰底层的汇编启动文件。4.2 配置 C/C IntelliSense消灭红色波浪线打开 VS Code 打开工程目录后第一件要做的事就是配置 IntelliSense。创建一个.vscode文件夹在里面生成c_cpp_properties.json。通常的做法是CtrlShiftP输入 “C/C: Edit Configurations (UI)” 打开可视化配置页然后手动填几个关键字段。最核心的是includePath和compilerPath。includePath 要包含所有头文件目录尤其要包含 STM32CubeMX 生成工程里的这些路径{ configurations: [ { name: STM32, includePath: [ ${workspaceFolder}/**, ${workspaceFolder}/Core/Inc, ${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc, ${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F1xx/Include, ${workspaceFolder}/Drivers/CMSIS/Include ], defines: [ STM32F103xB, USE_HAL_DRIVER ], compilerPath: C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/10.3 2021.10/bin/arm-none-eabi-gcc.exe, cStandard: c11, intelliSenseMode: gcc-arm } ] }把defines配置对非常重要。STM32 的 HAL 库里大量使用了#ifdef STM32F103xB这类条件编译判断如果你没有在配置里定义对应宏头文件里的代码会被编译器预处理器“跳过”IntelliSense 就会漏报、误报一堆东西。compilerPath写的是 arm-none-eabi-gcc 的完整路径VS Code 会调用它来解析系统头文件和内置宏定义。如果你装了多个版本的编译器这里最容易搞混建议务必填绝对路径不要只填文件名。配置完成后等待 C/C 插件索引完毕打开 main.c 应该就没有红色波浪线了。如果还有常见原因是头文件路径漏了或者宏定义不对。4.3 tasks.json 一键编译与错误跳转有了 Makefile编译其实已经很接近“一条命令”了。我们只需要让 VS Code 里的 CtrlShiftB 能直接触发编译即可。在.vscode/tasks.json里配置一个任务{ version: 2.0.0, tasks: [ { label: Build STM32 Project, type: shell, command: make, args: [-j4], group: { kind: build, isDefault: true }, problemMatcher: [$gcc] } ] }这里的-j4是并行编译4 个任务同时跑多核 CPU 下编译速度能明显提升。如果你的电脑核心更多可以写到-j8。problemMatcher设置为$gcc是为了把 make 输出的编译错误信息解析成 VS Code 能识别的问题面板这样双击错误信息就能直接跳转到出错的代码行调试效率提升明显。配置好之后按下 CtrlShiftB终端里会开始跑编译。编译成功会生成.elf和.hex文件。如果编译报错问题面板会列出错误位置和原因直接点进去就能看源码。5. 调试配置、AI 编程接入与串口输出5.1 Cortex-Debug 调试配置详解编译过了还不算完嵌入式开发最值钱的是在线调试。VS Code 结合 Cortex-Debug OpenOCD 的调试体验很接近商用 IDE而且可配置性更强。在.vscode/launch.json里配置调试参数。以 STM32F103C8T6 和 ST-Link 为例一个最小可用配置是{ version: 0.2.0, configurations: [ { name: Cortex Debug, cwd: ${workspaceFolder}, executable: ${workspaceFolder}/build/stm32f103-project.elf, request: launch, type: cortex-debug, servertype: openocd, device: STM32F103C8T6, interface: swd, configFiles: [ interface/stlink.cfg, target/stm32f1x.cfg ], svdFile: ${workspaceFolder}/STM32F103.svd } ] }executable要指向你实际生成的 .elf 文件路径。configFiles要和你在终端里手动敲 openocd 命令时的配置保持一致。svdFile是可选的但强烈建议配上它能让你在调试时看到定时器、串口等外设寄存器的实时状态非常直观。启动调试的方式是 F5。VS Code 会先启动 OpenOCD 作为后台服务然后连接 ST-Link 并下载固件到芯片再停在main函数入口处。注意第一行通常停在 Reset_Handler需要你手动设置一些断点再按 F5 继续或者把调试器配置里加上stopAtEntry: false让它直接跑起来。调试过程中你可以在“监视”窗口添加变量表达式在“调用堆栈”里看函数调用层次在“外设”窗口需要 SVD看寄存器。比 Keil 更舒服的是变量修改和表达式求值响应很快断点数量也不受什么限制。5.2 AI 编程插件接入让辅助写代码成为现实现在回到这个项目标题里的“AI 编程”。VS Code 相比 Keil 最大的红利就是可以无缝接入各种 AI 编程辅助插件。这部分我实际操作最多的方案有三种通义灵码、CodeGeeX、以及通过统一接口接入 OpenAI 兼容 API 的插件。它们的核心使用方式都很类似安装插件后在设置里填一个 API Key如果使用云端服务或者本地模型的地址比如 Ollama 启动的本地模型。在代码文件里选中一段代码右键选择 AI 生成注释、解释代码、生成单元测试。或者在对话框里描述“生成一个用 HAL 库初始化 USART2 的代码”AI 会直接生成带有引脚的代码片段。接入之后最大的体会是写底层初始化代码省了很多时间。比如 STM32 的 GPIO 初始化不是不会写而是每次都要翻 HAL 手册确认参数枚举值。AI 生成的代码虽然不是 100% 能编译过但至少骨架和注释是现成的我再根据实际情况改。这个模式非常适合处理一下场景写结构体、枚举定义、常量表这类机械性代码。将一段死代码转换成更高效的写法。查找一个具体寄存器位的含义AI 训练数据里有很多 STM32 的手册内容。生成 Makefile、CMakeLists.txt、Keil 工程描述等辅助文件。顺带提醒一句AI 生成的代码一定要过编译器和实际板子验证。这里不只是说语法还有逻辑正确性。尤其涉及时钟树、中断优先级这类敏感配置时AI 容易想当然地生成与你的芯片不完全匹配的代码。所以 AI 是效率工具不是可靠性来源测试还是要自己做。5.3 串口监视器调试日志的最后一公里嵌入式开发离不开串口打印日志。VS Code 里装一个 Serial Monitor 插件点一下就能看到芯片通过 UART 发出的数据。比普通串口助手好的地方在于串口输出可以直接和代码行对应。比如你在代码里加了printf(temp%d, temp);在串口监视器里就能看到实时数值。当然首先要在代码里重定向 fputc把 printf 的输出重定向到串口。串口监视器安装后在 VS Code 底部命令面板选择端口和波特率通常和代码初始化保持一致比如 115200然后就能实时滚动看到日志。如果用 OpenOCD 调试时同时开串口别忘了串口和调试器不要同时占用同一个 USB 转串口芯片否则会冲突。6. 常见问题与排查技巧实录6.1 “头文件红色波浪线”的根因与排查顺序这个问题是在 VS Code 里写 STM32 遇到率最高的问题。红色波浪线到底怎么消除记住一个原则IntelliSense 的报错和真正的编译报错是两套系统。IntelliSense 依靠c_cpp_properties.json里的 includePath 和 defines 来“理解”代码一旦路径不完整它就会误报。排查顺序我总结成三步看includePath是否包含所有头文件目录。遗漏一个目录这个目录下的头文件被引用时就会报“无法打开源文件”。看启动文件或 main.c 中是否有条件编译宏比如STM32F103xB、USE_HAL_DRIVER。漏掉宏定义时半个工程都会变成灰色或报未定义。看编译器路径compilerPath是否正确指向了arm-none-eabi-gcc。这一点很多人会忽略IntelliSense 需要根据编译器内置宏来判断代码行为如果编译器路径指向了 x86 的 gcc很多 ARM 特有的寄存器地址宏就会解析失败。6.2 终端提示“arm-none-eabi-gcc 不是内部或外部命令”这个问题的本质是 PATH 环境变量没生效。排查步骤如下终端里直接输入arm-none-eabi-gcc -v看是否输出。如果提示找不到命令确认安装目录下是否真的有这个文件在bin目录里。如果文件存在检查 PATH 是否包含这个 bin 目录。修改 PATH 后所有已打开的终端都要重新打开才能读到新环境变量。VS Code 里如果是老的终端按垃圾桶图标关闭再新建一个。另外要注意Windows 也有自带的 gcc比如 MinGW 的 gcc如果 PATH 顺序里先找到了它也可能会出现“arm-none-eabi-gcc”不被识别但其实装了的情况。这种情况少但排查时值得留意。6.3 OpenOCD 启动失败报无法找到设备这是烧录调试环节最常见的错误。典型的报错是Error: open failed或者Cannot find device。按照这个顺序排查确认 ST-Link 已经插到电脑并且驱动正确安装。在设备管理器里看到“STMicroelectronics STLink dongle”之类的设备就正常。确认接线。SWDIO、SWCLK、GND 三条线必须连好VCC 不是必须的但有些板子的 ST-Link 需要读取目标板电压所以也建议连上。确认 OpenOCD 的 interface 配置是否和你手里的调试器匹配。如果你的板载调试器是 CMSIS-DAP但配置interface/stlink.cfg那是肯定找不到设备的。检查芯片是否锁死。如果之前烧录过程异常中断或者选项字节设置错误芯片可能进入读保护状态。解决方式是按住复位键在 OpenOCD 连接瞬间松开或者用 STM32CubeProgrammer 做全擦除。6.4 代码能编译但烧录后不运行先检查启动文件和时钟有时候 VS Code 环境下编译生成的文件烧录后没反应现象是不跑、不进 main。这种问题 90% 出在启动文件或链接脚本上。先说启动文件。如果你的工程是从旧项目里拷贝的注意核对启动文件是否和你的芯片匹配。比如 STM32F103C8T6 用的是startup_stm32f103xb.s如果你错用了startup_stm32f103xe.s中断向量表偏移不同跑起来就会异常。再一个就是时钟配置。如果你在 STM32CubeMX 里选择了外部高速晶振HSE但实际板子上没有焊晶振芯片在启动时就可能卡在等待 HSE 就绪导致永远到不了 main。解决办法在 ifdef 里捕获取消外部晶振的初始化或者直接换成内部 HSI 时钟。这个经验非常实用很多“板子不跑”的问题其实都是时钟和外设没对上的问题。7. 实操步骤总结与便捷设定整套环境搭建下来做一个最简化的流程总结方便新人“抄作业”从官网下载并安装 VS Code推荐系统版勾选 PATH 和右键菜单。安装 C/C 插件、Cortex-Debug、ARM 插件、Serial Monitor。下载并安装 Arm GNU Toolchain确保arm-none-eabi-gcc -v可用。下载并安装 STM32CubeProgrammer附带 ST-Link 驱动和 OpenOCD。用 STM32CubeMX 生成 Makefile 工程。配置.vscode/c_cpp_properties.json的头文件路径和宏定义。配置.vscode/tasks.json让 CtrlShiftB 直接跑 make。配置.vscode/launch.jsonF5 启动 Cortex-Debug 在线调试。接上串口用 Serial Monitor 看日志。选一个 AI 编程插件接入你的代码辅助工作流。这里还有一个我个人很推荐的细节把这些.vscode/配置文件提交到 Git 仓库。这样团队新成员拉下代码后只要保证编译器路径一致就能直接编译调试不用每个人从头配一遍环境变量。虽然机器差异会导致编译器路径有细微差别但结构化的配置总比几个人在微信群里传截图强。另外VS Code 的 workspace 文件.code-workspace可以配置成多根目录工作区。如果你同时开发 Bootloader 和 App 两个工程在同一个窗口里切换会非常舒服。反正进入这个环境之后你会越来越觉得 Keil 就是个“能用的古董”VS Code 这条路线才是嵌入式开发走向现代化的性价比之选。从编译、调试、AI 辅助、版本管理到团队协作这套环境真正把嵌入式开发的“工具体验”拉到了和互联网开发一个水准。按照上面的步骤操作你应该在两小时内就能搭完一套后面的效率提升是长期的。
返回列表