做嵌入式软件AI编程这段时间,我最大的一个感触是:写STM32代码的场地,正在从传统的Keil一点一点搬到VS Code。原因其实很简单,AI工具越做越强,Kimi、DeepSeek、Codex这些助手基本都住在VS Code里,而Keil对AI插件的支持约等于零。所以不管你是想让AI辅助写驱动、用大模型解释HAL库源码,还是把现有工程接进一套可自动化的构建流程,安装VS Code并配齐STM32扩展工具,都是绕不开的第一步。这篇博文是整个“嵌入式软件AI编程”系列的第7篇,我会把VS Code本体安装、STM32扩展选择、编译调试链路配置、AI助手接入这些环节一口气讲透,保证你跟着做完就能拥有一套真正能写、能编译、能烧录、还能跟大模型聊电路的开发环境。
1. 为什么嵌入式AI编程要把“编辑器”和“工具链”分开看
1.1 传统Keil工作流的三个硬伤
我最早学STM32时用的也是Keil MDK,说实话,Keil在芯片支持、Flash烧录、调试器集成这一块确实成熟,尤其在公司里大量存量工程都挂在Keil上。但把AI编程引入开发流程后,Keil的短板一下子就暴露了。
第一是编辑体验沉旧。Keil的代码补全、高亮、重构能力,跟现代编辑器比差了不止一个时代,而AI编程的本质是“在编辑器里与模型深度交互”,编辑器体验跟不上,AI的能力再强也施展不开。
第二是插件生态封闭。Keil没有开放插件市场,不能直接在编辑器里装Continue、Kimi这类AI助手,想用大模型辅助写代码,只能复制到网页端来回切换,这效率低到令人崩溃。
第三是工程文件不可读。Keil的.uvprojx虽是XML,但IDE绑定太强,命令行脚本、持续集成、AI调参这些操作都很难做。而VS Code打开的是一个普通文件夹,所有配置文件都是JSON,既能让AI理解,也能写脚本控制,天然适合被程序和模型驱动。
1.2 编辑器、编译器、调试器:三件被混在一起的事
很多新手会有一个误区:认为STM32开发环境就等于KEIL。其实STM32开发流程可以拆成三层,分别是编辑层、编译层、调试烧录层。
- 编辑层:负责写代码、看代码、搜索代码,这是VS Code的主场。
- 编译层:把C代码变成二进制固件,在STM32上用的编译器是
arm-none-eabi-gcc,它本身是开源工具链,和编辑器完全解耦。 - 调试烧录层:负责把固件写进芯片,并支持断点、查看寄存器。常用的是OpenOCD,也可以直接用ST-LINK GDB Server。
Keil做的是把这三层全部捆在一起,开箱即用。VS Code的做法是只负责编辑层,编译和调试通过扩展去调用外部工具链。很多人第一次听到“要自己配工具链”会觉得麻烦,但看一下后面的配置过程就会明白,这套链路一旦搭好,比Keil更透明、更可维护,而且能被AI编程工具顺畅调用。
1.3 这条学习路径在本系列中的位置
本系列前面几篇已经梳理了嵌入式AI编程的整体思路,包括AI选型、代码生成策略、硬件基础等内容。这篇是环境篇,解决的是“工具就绪”问题。只有把VS Code和STM32扩展装好,后续才能跑通“AI生成驱动代码 → 自动编译 → 自动烧录调试”这套闭环,所以这篇是整个系列的地基。
如果你是纯新手,前面几篇还没看,也不用担心,这篇内容不依赖前面细节,只要你手上有一块STM32开发板、一台Windows电脑,就能直接照着做。
2. 动手前先搞懂STM32工具链的完整拼图
2.1 你实际需要哪几样东西
在装VS Code之前,我建议先理清楚STM32开发的工具链拼图,这样后面装扩展时就不会一头雾水。整个系统里需要这几样东西:
| 组件 | 作用 | 常见选择 |
|---|---|---|
| 编辑器 | 编写、查看、搜索代码 | VS Code |
| 编译器 | 把C代码编译成固件 | arm-none-eabi-gcc |
| 构建工具 | 管理编译过程、依赖关系 | CMake、Make |
| 调试烧录工具 | 连接ST-LINK,烧录和调试 | OpenOCD、ST-LINK GDB Server |
| 芯片支持包 | 提供寄存器定义、启动文件、HAL驱动 | STM32Cube系列,CMSIS |
| 固件生成器 | 生成初始化代码、配置时钟和引脚 | STM32CubeMX |
有一点要强调:VS Code只占第一行,其他部分需要你单独准备。好消息是,ST官方已经提供了STM32CubeCLT,它把编译器、调试器、烧录工具打包在一起,可以一次装完。也就是说,你要额外准备的东西并不多。
2.2 STM32CubeCLT:ST官方的一条龙命令行工具
STM32CubeCLT的全称是STM32 Command Line Toolset,是ST官方推出的命令行工具集。它里面包含了:
- GNU Tools for STM32,本质就是
arm-none-eabi-gcc编译器; - OpenOCD,调试和烧录工具;
- ST-LINK GDB Server,ST官方的调试服务程序;
- STM32CubeProgrammer命令行版,用于烧录。
安装STM32CubeCLT的路径是:去ST官网搜索STM32CubeCLT下载,或者在STM32CubeMX的Help页里找到入口,下载后按默认路径安装即可。安装完成后,需要把编译器目录和工具目录加进系统PATH,例如默认目录类似C:\ST\STM32CubeCLT_1.15.0\GNU-tools-for-STM32\bin。目录名里的版本号以你实际安装的为准。
注意:在Windows上装完STM32CubeCLT之后,务必打开一个新的PowerShell窗口,输入
arm-none-eabi-gcc --version验证一下。如果提示找不到命令,说明PATH没生效或者路径加错了。
很多教程会绕开STM32CubeCLT,手把手教你从ARM官网下载编译器,再把OpenOCD分开安装。也能装,但版本匹配容易出问题。我用STM32CubeCLT的一个明显好处是:版本都是ST统一测试过的组合,踩坑少,适合新手。
2.3 用CubeMX生成可被VS Code打开的工程
STM32CubeMX是ST的图形化初始化配置工具,它最强大的地方是:你可以在图形界面里选好芯片、配置时钟树、打开需要的串口或SPI外设,然后一键生成初始化代码。
CubeMX生成的工程,IDE一栏可以选很多种,包括MDK-ARM、STM32CubeIDE,但这里要选CMake。选CMake之后,CubeMX会生成一个完整的CMake工程,里面有CMakeLists.txt、Core目录、Drivers目录,以及启动文件和链接脚本。
VS Code对这种工程非常友好,直接用“File > Open Folder”打开工程根目录,再配合CMake Tools扩展,就能一键编译。这种方式的优势很明显:CubeMX负责芯片底层初始化和订阅驱动,你自己只写业务逻辑,VS Code负责编辑和构建,AI负责帮你分析代码和生成算法逻辑,分工非常清晰。
3. VS Code本体安装:5分钟搞定并保持干净
3.1 官网下载与版本选择
VS Code的下载地址是它的官网code.visualstudio.com,这是微软官方的唯一入口。请一定认准官网,不要从第三方下载站获取安装包。
在Windows上,官网一般会提供两个版本:User Installer和System Installer。简单来说,User Installer安装到当前用户目录,不需要管理员权限,适合公司电脑或权限受限环境;System Installer安装到系统目录,所有用户都能用,适合自己长期使用的开发机。
我自己的习惯是:个人开发机用System Installer,这样后面装任何工具都不容易被权限问题卡住。如果你在学校机房或公司电脑上使用,选User Installer更省心。
3.2 安装环节最容易忽略的三个勾选项
VS Code安装过程中,有一个页面会询问附加任务,很多人看都不看直接下一步,这个习惯建议改改。其中几个勾选项对嵌入式开发很关键:
- “添加到PATH”必选。勾上之后,你可以在命令行里直接敲
code打开VS Code,后续配置tasks.json时也方便。 - “将‘通过Code打开’操作添加到文件和目录上下文菜单”建议勾选。这个能在右键菜单里直接用VS Code打开文件夹,效率很高。
- “创建桌面快捷方式”随意,按个人喜好来。
安装完之后不要急着装扩展。先启动一次VS Code,确认能正常运行,再做后面的配置。这样如果后面出了问题,排查范围会更小。
3.3 首次启动的三分钟配置
VS Code默认是英文界面,我们先把语言改成中文。点击左侧“扩展”按钮,搜索“Chinese Language Pack”,安装由微软官方发布的简体中文语言包,安装后右下角会提示重启,重启后界面就是中文了。
然后建议做两个基础设置。第一个是自动保存,进入设置搜索files.autoSave,选择onFocusChange,这样当光标离开当前文件时自动保存,避免AI生成代码后没保存导致版本混乱。第二个是格式化开关,搜索editor.formatOnSave,建议勾选,配合后续的C/C++扩展,代码风格会统一很多。
提示:首次配置时,千万别一口气装十几个推荐扩展。VS Code的启动速度和扩展数量直接挂钩,刚上手只装后面文章里提到的必需扩展就够了。
4. 安装与配置STM32扩展工具
4.1 STM32开发相关的四类扩展
现在到了整个主题最关键的部分。VS Code扩展非常多,但真正支撑STM32开发的,其实是下面四类。我分别说一下它们的用途和选择逻辑。
第一类:C/C++扩展。这是微软官方出品,提供代码高亮、智能提示、调试支持,是整个C/C++嵌入式开发的基础。打开扩展市场,搜索“C/C++”,认准发布者是Microsoft的那个。
第二类:Cortex-Debug。这是嵌入式调试的核心扩展,它支持OpenOCD、pyOCD等多种调试服务,可以让你在VS Code里直接打断点、查看寄存器和外设值。发布者是marus25,虽然是非官方扩展,但社区口碑非常好。
第三类:CMake Tools。这同样是微软官方扩展,专门用于加载CMake工程,配置编译器Kit,执行构建任务。如果你的工程是CubeMX生成的标准CMake结构,装上它基本就完成了一大半配置。
第四类:Keil Assistant或EIDE。如果你的项目暂时不想迁移到CMake,还是保留Keil的.uvprojx工程,那么可以装Keil Assistant,直接在VS Code里调用Keil编译和烧录;如果你希望创建一套纯VS Code的嵌入式工程,也可以使用EIDE扩展。这一块要看你自己项目的路线选择。
4.2 C/C++扩展的配置细节
装完C/C++扩展后,直接打开工程并不代表智能提示就会正常工作。C/C++扩展需要知道三件事:头文件在哪、编译器是什么、预定义宏是哪些。
这三件事都写在.vscode/c_cpp_properties.json文件里。最简单的方式是按下Ctrl+Shift+P,输入“C/C++: Edit Configurations”,VS Code会自动生成一个配置文件。
针对STM32F103系列的CubeMX工程,一个典型的配置如下:
{ "version": 4, "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": [ "STM32F103xE", "USE_HAL_DRIVER" ], "compilerPath": "C:/ST/STM32CubeCLT_1.15.0/GNU-tools-for-STM32/bin/arm-none-eabi-gcc.exe", "cStandard": "c11", "intelliSenseMode": "gcc-arm" } ] }这里有个关键点:compilerPath一定要指向你在2.2节安装的STM32CubeCLT里的编译器路径,因为VS Code需要借助编译器来判断宏定义和系统头文件。如果这个路径没配好,哪怕includePath写遍了,还是会报一堆红波浪线。
注意:不同型号芯片的预定义宏不一样。比如STM32F429就应写
STM32F429xx,如果你不确定,可以打开CubeMX生成的stm32f1xx_hal_conf.h,看它开头判断了哪些宏即可。
另外,如果工程是CMake构建,我强烈建议在c_cpp_properties.json里加一行:
"compileCommands": "${workspaceFolder}/build/compile_commands.json"CMake在编译时会自动生成这个文件,里面包含了每个源文件的真实编译参数、头文件路径和宏定义。加上后C/C++扩展会直接读取,几乎不会再出现找不到头文件的问题,这个技巧能帮你省掉大量手动配置时间。
4.3 一键构建:tasks.json与CMake Tools
构建任务的本质是调用编译器把代码变成固件。CubeMX生成的CMake工程,构建命令本身很简单:在工程根目录下执行cmake --build build。但在VS Code里,我们希望用快捷键或按钮完成这件事,这就需要配置任务。
打开工程根目录的.vscode/tasks.json,可以写成这样:
{ "version": "2.0.0", "tasks": [ { "label": "STM32 Build", "type": "shell", "command": "cmake --build build --config Debug", "options": { "cwd": "${workspaceFolder}" }, "group": { "kind": "build", "isDefault": true }, "problemMatcher": [] } ] }保存后按Ctrl+Shift+B就能触发编译。group里的isDefault字段很重要,它把该任务设为默认构建任务,这样不需要每次选择任务名称。problemMatcher留空是因为当前阶段我们只需要看到编译输出,等熟练后再用更高级的解析器捕捉编译错误。
我自己也试过不用tasks.json,直接依赖CMake Tools的“CMake: Build”按钮,效果是一样的。区别只在于tasks.json更像是VS Code原生机制,方便后续扩展更多命令,比如烧录。如果你决定用CMake Tools,记得第一次打开工程时,让它“Configure”一遍,它会自动探测STM32CubeCLT里的编译器,生成build目录。这个过程如果卡住,多半是CMake没找到编译器,检查一下PATH配置。
4.4 下载与调试:launch.json与OpenOCD
调试是整个环境配置里最容易被留下的一环。STM32的在线调试逻辑是:VS Code里的Cortex-Debug扩展作为一种前端,去连接一个GDB Server,由这个Server操作ST-LINK硬件访问目标芯片。OpenOCD就充当这个GDB Server。
在.vscode/launch.json里,一个配合OpenOCD的典型配置如下:
{ "version": "0.2.0", "configurations": [ { "name": "OpenOCD STM32", "cwd": "${workspaceRoot}", "executable": "./build/项目名.elf", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "device": "STM32F103C8", "interface": "swd", "configFiles": [ "interface/stlink.cfg", "target/stm32f1x.cfg" ], "svdFile": "${workspaceRoot}/STM32F103.svd" } ] }逐个解释一下重点字段:
executable是编译产出的ELF文件路径,注意要对应你CubeMX工程的实际名称,且不要填hex或bin,GDB只能用ELF。servertype填的是openocd,表示由OpenOCD提供调试服务。configFiles里的两个cfg文件,是OpenOCD针对不同硬件做的配置。第一行interface/stlink.cfg,意思是使用ST-LINK调试器;第二行target/stm32f1x.cfg,意思是目标芯片是STM32F1系列。如果你的芯片是F4,就写target/stm32f4x.cfg,其他系列以此类推。svdFile比较关键。SVD文件是芯片寄存器的描述文件,如果把STM32的SVD文件放进去,调试时就能在“外设寄存器”窗口里直接看到各外设每个寄存器的值。ST官方通常会随固件包提供,或者可以在社区里找到。
提示:如果你的电脑上没装单独OpenOCD,但装了STM32CubeCLT,那么OpenOCD是随CLT自带的。在launch.json里通常还需要指定它的路径,可以在
.vscode/settings.json里写"cortex-debug.openocdPath": "C:/ST/STM32CubeCLT_1.15.0/OpenOCD/bin/openocd.exe",这样Cortex-Debug才能找到它。
配好之后,按F5就能启动调试会话。第一次调试会看到OpenOCD在终端里输出一串日志,里面有目标芯片的信息,看到这个就说明环境已经通了。
5. 让AI编程工具真正融入STM32开发
5.1 VS Code里的嵌入式AI助手怎么选
工具链已经就绪,接下来是这篇博文最想讲的部分:怎么把AI编程工具接进来。
VS Code里的AI编程助手分成两类。一类是直接在编辑器侧边栏对话、也能做补全的插件,比如Kimi、通义灵码、文心快码、Continue;另一类是跑在终端里的CLI工具,比如Codex CLI、Claude Code,它们和VS Code的集成方式是“在VS Code终端里运行”。
| 工具 | 类型 | 特点 | 接入方式 |
|---|---|---|---|
| Kimi | 编辑器扩展 | 中文理解好,适合解释代码、查资料 | 在扩展市场搜Kimi,登录Moonshot账号 |
| 通义灵码 | 编辑器扩展 | 阿里出品,中文代码场景优化好 | 扩展市场搜通义灵码,登录阿里云账号 |
| 文心快码 | 编辑器扩展 | 百度的AI助,中文语法纠错不错 | 扩展市场搜Comate |
| Continue | 编辑器扩展 | 开源,可自由配置DeepSeek等多种模型 | 扩展市场搜Continue,设置里选模型 |
| Codex CLI | 终端CLI | OpenAI官方,Agent式自主修改 | npm全局安装后终端运行 |
| Claude Code | 终端CLI | Anthropic官方,长上下文,适合改大工程 | npm全局安装后终端运行 |
我的建议是:如果你希望AI帮你读代码、解释HAL库逻辑、生成驱动模板,优先用Kimi或通义灵码这类编辑器扩展,因为它们对话框形式更友好,中文回答更贴近语义。如果你想让它自主完成“改代码、跑编译、看报错”的循环,可以试试Codex CLI或Claude Code,这类工具能自己调用终端命令,但同时也更考验你对工程的掌控力。
注意:涉及公司核心机密或未公开的固件代码,不要直接贴给云上的AI模型。敏感环境建议用私有化部署或脱敏后再问。
5.2 AI在STM32开发中最常用的三个场景
从实际体验看,AI编程助手在嵌入式开发里帮到我的地方,主要集中在三个场景。
第一个场景是解释代码。STM32的HAL库里,一个简单的HAL_UART_Receive_IT背后其实有一串状态机和中断逻辑。把函数体贴给AI,让它解释各个状态标志怎么流转,几秒钟就能得到一份清晰说明,比翻参考手册快得多。
第二个场景是生成驱动模板。比如你需要初始化一个I2C接口读取传感器,AI可以直接生成带错误处理的初始化函数。但一定记得,AI生成的代码不能直接烧进去,需要把引脚号、时钟频率、地址经过核对后再用。AI是“提效”,不是“替你做”。
第三个场景是编译报错翻译与排查。刚换到VS Code时,编译器错误信息常常让人头大,把报错粘贴给AI,它会告诉你错误发生在哪一行、很可能是什么原因、怎么修。这个用法对新手最友好。
5.3 给AI写一份“嵌入式专属提示词模板”
很多人说AI写代码效果差,其实问题往往出在提示词太笼统。嵌入式开发的上下文很重,比如芯片型号、库版本、是否使用RTOS、硬件引脚分配,这些信息不给AI,它只能靠猜。
我为你准备了一个可以复制使用的提示词模板,实测效果不错:
你是资深嵌入式软件工程师。请用C语言和STM32HAL库帮我完成以下任务: 芯片型号:STM32F103C8 开发环境:VS Code + STM32CubeCLT + OpenOCD 编译标准:C11 约束:不引入RTOS,只使用ST官方HAL库 任务:实现一个通过I2C1读取MPU6050的初始化函数,包含错误处理。 要求:先输出实现思路,再给出完整代码,最后指出需要注意的寄存器配置。这个模板有两层逻辑:先给模型定位角色,再给出硬件和软件上下文,最后明确输出格式。你会发现,加了这些约束后,AI生成的代码可读性会明显提高,编译通过率也高很多。
6. 常见问题与排查技巧实录
6.1 include红色波浪线,IntelliSense失灵
这个问题数量最多,我统计过我在多个技术社区里看到的求助,有超过一半的“VS Code写STM32遇到问题”都是这个。
出现红色波浪线基本可以锁定为三类原因:includePath没配好、compilerPath指向错误或不存在的路径、以及该配置的预定义宏没配。排查步骤很简单,先是打开.vscode/c_cpp_properties.json,确认是否包含工程里Core/Inc和Drivers下所有头文件目录;然后打开终端执行arm-none-eabi-gcc --version,确认编译器路径真实可用。如果这两步都没问题,直接在c_cpp_properties.json里加"compileCommands": "${workspaceFolder}/build/compile_commands.json",然后执行一次完整构建,让CMake生成编译数据库。
提示:改完
c_cpp_properties.json后,VS Code不一定会立刻刷新,可以执行“C/C++: Reset IntelliSense Database”命令,强制重新加载。
6.2 编译时提示找不到arm-none-eabi-gcc
这个问题的根源只有一个:PATH环境变量没生效。很多时候你装完STM32CubeCLT后,是在已打开的VS Code里编译,但VS Code没有重新读取系统PATH。解决办法是先彻底关闭VS Code,再重新打开,让进程重新加载环境变量。如果还是不行,就在终端里执行$env:Path += ";C:\ST\STM32CubeCLT_1.15.0\GNU-tools-for-STM32\bin",临时把路径加进去,然后把VS Code里的CMake Tools重新配置一遍。
6.3 Cortex-Debug连接不上目标板
调试器连接不上,原因多半是硬件层和软件层两类。硬件层方面,检查ST-LINK是否被正确识别,可以在设备管理器里确认,如果驱动有问题,需要重装ST-LINK驱动;然后检查接线:SWDIO、SWCLK、GND、3.3V有没有接对,目标板有没有独立供电。
软件层方面,最常见的是cfg文件选错。interface/stlink.cfg是接口配置,如果你用的不是ST-LINK而是DAP-Link,就要改成interface/cmsis-dap.cfg;target/stm32f1x.cfg是目标芯片配置,芯片型号选错会导致连接时识别不到内核。打开OpenOCD日志,如果出现Info : STM32F1xx - connected说明已经连上了,如果报Error: open failed,基本是接口或接线问题,按上面顺序逐步排查即可。
6.4 中文注释乱码
Keil工程里的文件默认是GB2312编码,VS Code默认按UTF-8打开,中文注释就会变成乱码。解决方式有两种:一种是将所有源文件统一转成UTF-8,适合新工程;另一种是在.vscode/settings.json里加"files.encoding": "gbk",适合短期兼容旧工程。后者方案一改全局,如果你的工程里面同时混有GBK和UTF-8文件,会一直有某个文件乱码,所以新工程还是尽早统一到UTF-8。
6.5 编译成功但烧录后不运行
这类问题最隐蔽,因为工具链本身没毛病,问题多半出在芯片配置或启动环节。先看CubeMX生成的.ld链接脚本有没有被动过,很多AI生成的代码喜欢顺手改链接脚本,其实完全没有必要,默认的Flash和RAM布局对绝大多数项目是够用的;再检查CubeMX里的时钟树配置,内部RC振荡器和外部晶振不能满足某些外设时序时,程序会在初始化阶段死循环;最后检查启动文件是否在工程里,CubeMX生成的CMake工程里默认包含startup_stm32f103xb.s,如果被无意排除或改名,芯片上电后根本无法运行。
结尾
最后说几句我个人的实际体会。整套环境刚搭完时,你可能会觉得“不过是把Keil换成了另一个编辑器”,但用上两三周之后,区别会越来越明显。我现在写驱动时,先用AI生成初始版本,再把编译错误原样贴回去让它修,最后用VS Code直接打断点看寄存器,整个过程完全在一个窗口里完成。比起以前在Keil和网页版AI之间来回切换,效率提升非常直观。
还有一点小建议:最好不要一上来就强迫自己把旧工程全部迁移到VS Code,风险太大。可以先让Keil和VS Code共存,旧维护任务继续用Keil,新写的模块或新开的项目用VS Code走一遍完整流程,等顺手了再逐步迁移。工具永远是为效率服务的,千万不要为了换工具而换工具,让新环境真正帮你把嵌入式开发流程走顺,这才是这套配置最有价值的地方。