拓冰建站拓冰建站
首页 / 资讯中心 / 正文

VSCode配置Keil MDK嵌入式开发环境完全指南

1. 为什么要折腾在VSCode里配Keil做嵌入式开发的老哥们尤其是搞STM32、GD32、NXP这些Cortex-M内核芯片的几乎没有哪个能绕开Keil MDK。Keil的编译器和调试器本身确实能打但那个编辑器界面属实有点跟不上时代——代码补全聊胜于无配色看久了眼睛疼看代码跳转经常失灵更别提什么Git集成、远程开发这些现代IDE标配功能了。我最初入坑嵌入式那会儿天天对着Keil那个暗蓝色的编辑器写代码总觉得效率上不来。后来试着在VSCode里配了一套环境把编辑、补全、格式化、Git提交全都在VSCode里解决编译和烧录仍然调用Keil的后端工具链用下来简直是打开了新世界的大门。这个方案并不是让大家彻底抛弃Keil而是让Keil回归到它最擅长的编译和调试环节日常写代码的体验交给VSCode来提升。这篇文章就从零开始把我实际搭建这套开发环境的过程完整拆开讲一遍包含插件选择、路径配置、编译烧录全流程以及我踩过的各种坑。不管你是刚接触嵌入式的小白还是被Keil编辑器折磨多年的老油条按着这篇文章走一遍基本都能搭出一套顺手又稳定的VSCode Keil联合开发环境。2. 核心思路VSCode负责写Keil负责编译烧录2.1 这个方案的整体架构是什么样的先说清楚这套环境的运行逻辑别一上来就盲目装一堆插件。嵌入式的代码最终要变成芯片里跑的机器码靠的还是Keil MDK自带的ARMCCAC5或ARMCLANGAC6编译器以及Keil的工程文件.uvprojx里配置的一大堆编译选项、宏定义、头文件路径。VSCode在这里面扮演的是前台角色负责代码编辑、语法高亮、智能补全、错误提示、Git版本管理。编译和烧录这些需要跟工具链深度交互的活儿还是交给Keil在后台完成。实际操作上有两种典型姿势方式说明适用场景方式一VSCode里直接调用Keil命令行通过插件或脚本在VSCode终端里执行Keil的UV4.exe命令行编译命令追求全流程都在VSCode里完成的开发者方式二VSCode写代码 Keil编译调试日常编辑在VSCode编译和烧录用Keil的IDE操作只想改善编辑体验、不想折腾太深的入门用户这篇文章重点讲方式一因为既然都决定折腾了干脆一步到位。实测下来VSCode里调命令行编译的速度和Keil界面里点Build是没区别的因为底层编译流程完全一样只是少了个图形界面而已。2.2 为什么前端编辑器选了VSCode而不是别的有人可能会问Source Insight、Clion、VS2019这些不也能写嵌入式代码吗为什么偏偏选VSCode。我的理由很简单VSCode在嵌入式领域有三大不可替代的优势。第一是插件生态碾压级的丰富。Keil Assistant、C/C、Cortex-Debug、Embedded IDE这几个关键插件组合起来能实现从代码补全到烧录调试的全链路支持目前没有任何一个编辑器能把这些功能整合得这么顺手。第二是跨平台一致性。Windows上开发Linux服务器上编译Mac上写代码VSCode的配置和快捷键完全一致换机器零学习成本。这对我这种经常在多个设备间切换的人来说特别重要。第三是免费开源加轻量。VS2019功能确实强但启动慢、吃内存、配置繁琐对嵌入式这种轻量级开发场景来说显得笨重。VSCode启动快、占内存小、配置全在JSON文件里出了问题方便排查。而且VSCode有个非常关键的杀手级功能——IntelliSense智能补全配合Cortex-Debug插件做在线调试体验比Keil自带的编辑器好了好几个档次。3. 环境准备与工具链选型3.1 软件安装清单配置这套环境之前先把下面的软件全部装好缺一个都会导致后面流程跑不通。软件版本建议用途说明Keil MDK5.27以上推荐5.36或更新必须包含AC5和AC6编译器负责真正的编译链接VSCode最新稳定版即可前端编辑器VSCode插件C/C微软官方插件IntelliSense、语法高亮、调试VSCode插件Keil Assistant国产开发者做的插件读取.uvprojx工程文件、调用UV4命令行编译VSCode插件Cortex-Debug可选用配合ST-Link/J-Link做在线调试STM32CubeMX可选最新版生成初始化代码规范芯片外设配置ST-Link或J-Link驱动对应官方驱动烧录和调试必须的硬件驱动Keil MDK安装的时候有几个注意点装不对后面会闹脾气。第一安装路径不要带中文和空格最好就装默认的C:\Keil_v5因为后面命令行调用UV4.exe的时候路径里有空格很容易触发各种奇怪问题。第二尽量装全AC5和AC6两套编译器老项目用的是AC5新项目用AC6两套共存最稳妥。VSCode的安装在Windows上就是一路Next没什么好说的。不过有一点如果你完全不懂VSCode的使用方式建议先花半小时熟悉一下工作区、设置面板、快捷键这些基本概念不然后面配置起来会一头雾水。3.2 编译器和下载器的选择细节Keil MDK从5.36版本开始AC5编译器不再被默认打包了新装的MDK可能只有AC6。很多老项目——尤其是一些芯片厂提供的SDK——还依赖AC5编译。如果你遇到编译报错说“cannot open file core_cm3.h”或者一堆跟编译器版本相关的奇怪问题很可能是AC5没装或者没配置好。检查电脑上装了哪些编译器的方法打开Keil MDK安装目录下的ARM文件夹看看里面是ARMCCAC5和ARMCLANGAC6都有还是只有ARMCLANG。AC5作为独立安装包可以从Keil官网单独下载安装装完会自动识别。下载器这块ST-Link是ST芯片开发最常用的选择便宜稳定国内能找到大量兼容版本虽然J-Link在调试性能和兼容性上确实更好但对一般项目来说ST-Link已经绰绰有余。如果你用的是CH32、AT32这些国产芯片很多配套的下载器也是兼容ST-Link协议的驱动直接用ST-Link的就能识别。还有个细节现在很多电脑只有一个USB口能识别ST-Link的虚拟串口烧录排查的时候容易误判是接线问题。遇到这种情况控制面板的设备管理器里看看有没有出现STM32 STLink dongle这个设备没有的话说明驱动没装好或者线有问题。3.3 为什么必须建一个干净的测试工程配置环境之前强烈建议先用STM32CubeMX生成一个最简单的点灯工程或者直接用Keil自带的例程。为什么因为环境搭建过程中最大的问题就是“分不清是自己配置错了还是工程本身有问题”。我第一次搭建的时候直接拿公司老项目的代码来试结果IntelliSense报了一堆错误折腾了好久才发现是项目的代码用了很多自定义宏定义和编译链接脚本跟插件默认配置对不上。后来用一个干净的LED点灯工程把环境跑通了再一步步增加复杂度就很顺了。新建测试工程的时候记得在CubeMX里选择生成MDK-ARM V5格式的工程然后指定一个全英文路径比如D:\EmbeddedProjects\LED_Test。工程生成后先用Keil编译一次确认能出hex文件再开始VSCode的配置流程可以把变量控制在一个。4. VSCode里配置Keil开发环境的具体操作4.1 安装和配置Keil Assistant插件Keil Assistant是我目前用过的最顺手的Keil工程管理插件它最大的价值是能直接读取.uvprojx工程文件并在VSCode的侧边栏里显示工程结构同时提供编译、下载、重新构建等操作按钮完全替代了在VSCode和Keil之间来回切换。安装方法VSCode扩展商店里搜“Keil Assistant”作者是CL。安装完成后打开设置面板找到Keil Assistant相关的配置项需要指定UV4.exe的路径。这个路径一般在C:\Keil_v5\UV4\UV4.exe。关键配置项如下配置项建议值说明Keil Assistant: Keil PathC:\Keil_v5\UV4\UV4.exeUV4主程序路径Keil Assistant: ARMCC PathC:\Keil_v5\ARM\ARMCC\binAC5编译器路径Keil Assistant: ARMClang PathC:\Keil_v5\ARM\ARMCLANG\binAC6编译器路径Keil Assistant: Workbench Path留空或指定旧版MDK用的一般不用动配置好以后用VSCode打开项目文件夹注意是包含.uvprojx文件的文件夹不是Keil工程文件本身左侧资源管理器面板底部会出现Keil Assistant的图标点击就能看到工程文件。右键工程文件可以直接选“Rebuild”或者“Download”。这个插件的底层原理其实就是调用了UV4.exe的一些命令行参数。-b表示build-f后面跟工程文件名-j0是并行编译的线程数。理解了这个原理以后就算Keil Assistant哪天抽风不工作了你也能自己在VSCode终端里敲命令编译心里有底。4.2 头文件路径、宏定义和C/C插件的联动配置Keil Assistant解决了编译的问题但代码编辑时的智能补全和错误提示是C/C插件负责的。C/C插件需要一个配置文件叫c_cpp_properties.json它定义了编译器路径、头文件路径和预处理宏定义这些信息决定了IntelliSense能不能正常工作。生成这个文件最简单的方式在VSCode里按F1输入“C/C: Edit Configurations (UI)”在图形界面里配置。配置完以后VSCode会在项目根目录的.vscode文件夹下生成c_cpp_properties.json。里面最核心的几项配置长这样{ configurations: [ { name: STM32, includePath: [ ${workspaceFolder}/**, C:/Keil_v5/ARM/PACK/ARM/CMSIS/5.7.0/CMSIS/Core/Include, C:/Keil_v5/ARM/PACK/Keil/STM32F1xx_DFP/2.3.0/Drivers/CMSIS/Device/ST/STM32F1xx/Include ], defines: [ STM32F103xB, USE_HAL_DRIVER ], compilerPath: C:/Keil_v5/ARM/ARMCC/bin/armcc.exe, cStandard: c11, intelliSenseMode: windows-gcc-x64 } ], version: 4 }这里有个非常容易踩的坑includePath是给IntelliSense用的路径必须和Keil工程里配置的头文件路径保持一致。如果你发现VSCode里代码补全正常、但有很多红色波浪线标着找不到头文件十有八九是includePath没配对。另一个坑是defines。STM32的HAL库代码里全是#if defined(STM32F103xB)这样的条件编译如果宏定义没配全IntelliSense会报一堆找不到函数或变量的错。宏定义从哪看打开Keil工程在Options for Target的C/C选项卡里Preprocessor Symbols那栏的Define就是原样抄过来就行。4.3 配置编译任务和快捷操作VSCode的Tasks功能可以让我们在编辑器里一键编译按CtrlShiftB触发。这个功能配合Keil Assistant可以做到“一个按键编译整个工程”。在项目根目录的.vscode文件夹下创建tasks.json文件配置一个编译任务{ version: 2.0.0, tasks: [ { label: Keil Build, command: C:/Keil_v5/UV4/UV4.exe, args: [ -b, ${workspaceFolder}/LED_Test.uvprojx, -j0, -o, ${workspaceFolder}/build_log.txt ], type: process, group: { kind: build, isDefault: true }, problemMatcher: [] } ] }这里的参数含义说一下。UV4.exe是Keil的命令行入口-b表示执行编译-j0是让编译器用全部核心并行编译-o后面跟的文件的编译日志的输出文件。编译产生的错误信息会写到build_log.txt里C/C插件可以根据这个文件做错误解析在VSCode的Problems面板里展示报错。但我在实际使用中发现一个更好的方案把编译命令做成批处理或PowerShell脚本因为Keil的老命令行工具在输出编码上有时候会乱码而且编译日志的格式跟VSCode的problemMatcher匹配起来很费劲。写个build.bat脚本每次编译前自动清空日志编译完自动把日志里头的error和warning筛选出来显示在终端里用起来更爽。实际用下来我现在的工作流是这样的在VSCode里写代码写完按CtrlShiftB触发行编译终端里直接看错误信息双击错误信息还能跳转到对应的代码行需要在tasks.json里配好problemMatcher的fileLocation。编译无误后点击Keil Assistant面板里的Download按钮烧录到开发板。5. 烧录环节的完整配置与踩坑经验5.1 Keil里配置烧录器参数Keil的烧录功能虽然集成在IDE里但配置项藏得比较深新人经常搞不定。打开Options for Target对话框切到Debug选项卡这里要干两件事。下拉框里选择调试器ST-Link就选ST-Link DebuggerJ-Link就选J-Link/J-Trace。选完以后点旁边的Settings按钮确认能正确识别到设备。如果识别不到会提示No ULINK Device found或者是No ST-LINK detected。切到Utilities选项卡这个地方才是真正配置烧录的核心。勾选Use Debug Driver然后点Settings进入Flash Download配置这里需要配置烧录算法。STM32F103系列要选STM32F10x High-density Flash容量不同的芯片选的算法不一样烧录算法不能通用。烧录算法选错是最常见的烧录失败原因。你在烧录的时候弹窗提示“No Algorithm found for address range”或者“Erase Failed”基本就是Flash算法和芯片型号不匹配。比如STM32F103C8T6是中容量选成高容量的算法就会出错。还有个很隐蔽的坑Reset and Run选项勾选这个选项后烧录完成会自动复位运行程序。如果你烧录完发现程序没跑起来十有八九是这个选项没勾选。5.2 用命令行工具烧录Keil Assistant插件里的Download按钮其实就是调用了UV4.exe的-f命令加烧录参数。但有的时候Keil Assistant的Download按钮会失灵或者你想在生产线场景下用脚本批量烧录这时候就需要直接调用ST-Link的命令行工具。ST-Link官方提供了一套命令行工具在安装ST-Link驱动的时候会一起装到C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility目录下核心程序叫ST-LINK_CLI.exe。典型的一条烧录命令长这样C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe -c SWD UR1000 -P D:\EmbeddedProjects\LED_Test\LED_Test.hex -V PROGRAM DISPLAY -Rst各个参数的用途是-c SWD表示用SWD模式连接目标板UR1000是设置连接速度-P后面跟要烧录的hex文件路径-V后面跟的是校验选项-Rst是烧录完成后复位芯片。我习惯把这个命令写成一个Flash.bat脚本放在工程目录下配合VSCode的任务或终端真正实现一键烧录彻底不用打开Keil界面。用命令行烧录还有个好处排查问题方便。命令行工具会输出详细的连接日志比如SWD频率、设备ID、Flash起始地址等等。如果连不上芯片日志里会明确告诉你No target connected或者Target is not responding这些信息比Keil的图形界面好用得多。5.3 烧录失败排查实录烧录失败是嵌入式开发中最常遇到的拦路虎。我把实际项目中遇到过的典型问题整理成了一张排查表按频率排序。错误表现常见原因解决方法No target connected接线错误、芯片供电异常、SWDIO/SWCLK接反检查杜邦线连接确认3.3V和GND正常Target is not respondingSWD频率太高在ST-LINK_CLI加UR100降低速率重新连No Algorithm foundFlash烧录算法与芯片型号不匹配在Utilities设置里选对Flash算法Erase Failed芯片读保护开启先用ST-LINK Utility解除读保护Verify Failed at address烧录文件与芯片不对应、时钟频率异常确认hex文件正确检查芯片供电电压RDDI-DAP ErrorST-Link固件版本过旧或山寨版ST-Link升级ST-Link固件换原装或兼容性好的下载器这里重点说一下RDDI-DAP Error这个错误在国内的嵌入式社区里被讨论得非常多。出现这个错误最典型的原因是ST-Link的固件版本和Keil的驱动版本不匹配或者是USB口供电不稳。解决方法是先把ST-Link从USB口拔下来安装好最新驱动后再重新插入然后在Keil的Settings里点一下Firmware Update把ST-Link固件升级到最新版本。还有一点容易被忽略有些ST-Link同时作为调试器和串口工具使用非国产品牌的USB转串口芯片比如CH340偶尔会跟ST-Link抢资源导致烧录失败。如果你的板子既有ST-Link又有CH340烧录的时候把没用的那个USB线拔掉减少干扰。6. 提高日常开发效率的进阶技巧6.1 多工程工作区管理嵌入式项目往往不止一个工程文件调试板、主板、Bootloader可能各有一套.uvprojx。用Keil Assistant管理多个工程的时候可以新建一个VSCode的多根工作区把所有相关工程文件夹都加进来方便统一管理。多根工作区文件的后缀是.code-workspace本质上是一个JSON文件里面记录了所有工作区文件夹的路径。配置好之后打开VSCode就自动加载所有工程Keil Assistant面板里能看到所有工程的编译和下载入口。我实际喜欢的用法是Bootloader和App分成两个独立工程代码放在同一个仓库里用VSCode的工作区管理。烧录Bootloader用第一个下载按钮烧录App用第二个按钮两边互不干扰。对于需要Bootloader跳转的OTA项目来说这个工作流效率提升非常明显。6.2 配置代码格式化和Git集成Keil自带的编辑器几乎没法谈代码风格一致性团队协作的时候代码风格千奇百怪。VSCode配好格式化工具以后CtrlShiftI一键格式化整个项目的代码风格就能统一起来。嵌入式C代码推荐用Clang-Format它支持Keil风格和自定义风格配置。在项目根目录放一个.clang-format文件配置缩进、大括号换行、指针位置这些规则。VSCode的C/C插件原生支持Clang-Format只要在设置里把Format On Save打开每次保存代码自动格式化。如果你需要格式化机械地保留某些Keil特有的代码段比如__attribute__和汇编内嵌可以在代码里加// clang-format off和// clang-format on注释来局部禁用格式化。Git集成是另一个提升效率的大杀器。VSCode左侧的源代码管理面板直接展示所有改动的文件点一下diff查看改动写提交信息的时候比在命令行里舒服太多。配合.gitignore把Keil生成的Objects文件夹、Listings文件夹、build_log.txt这些编译产物忽略掉仓库干净整洁团队协作代码审查也被快捷。6.3 在线调试配置VSCode不仅能编译和烧录配合Cortex-Debug插件还能做在线调试。如果只打算用VSCode写代码、用Keil调试可以跳过这一节但想体验一下古时候VSCode调试的同学配置好之后真的会感叹这才是现代调试器应该有的样子。在.vscode文件夹下创建一个launch.json文件配置一个Cortex-Debug的调试会话{ version: 0.2.0, configurations: [ { name: Cortex Debug STM32, cwd: ${workspaceFolder}, executable: ${workspaceFolder}/Objects/LED_Test.axf, request: launch, type: cortex-debug, servertype: stlink, device: STM32F103C8, svdFile: ${workspaceFolder}/STM32F103xx.svd, runToEntryPoint: main } ] }这个配置文件里最容易被坑的两个点是executable和svdFile。executable必须是编译出来的.axf文件包含了调试符号表。如果路径不对调试会话直接打开失败。svdFile是芯片外设寄存器的描述文件在Keil安装目录的ARM\PACK\Keil\下能找到对应芯片型号的.svd文件。配置好这个文件调试时鼠标悬停在外设寄存器上就能看到具体寄存器的含义不再是一堆十六进制数。配置完成后按F5启动调试。设置断点、查看变量、单步执行这些基本调试操作跟Keil的Debug模式差不多但界面友好度和数据可视化能力要好得多。Cortex-Debug还能实时显示外设寄存器状态和内存内容对于排查硬件相关Bug非常有帮助。用断点调试中断函数时有一个实用技巧在中断函数的入口处设置断点然后用Cortex-Debug的栈窗口查看调用栈可以直接看到是哪个外设触发了中断以及中断发生时主程序正在干什么。这在排查中断抢占和死锁问题的时候效率极高。7. 常见报错和解决方案速查整理一份这段时间搭建和使用过程中最常遇到的报错汇总每个都附上排查思路。这张表里的内容都是我实际遇到的不是网上随便抄来的。7.1 编译阶段报错报错信息排查思路Target uses ARM-Compiler while “AC6” is not installedKeil的工程配置了AC6但电脑没装AC6编译器#include stm32f1xx_hal.h not found头文件路径未找到检查includePath配置L6218E: Undefined symbol链接阶段找不到函数定义检查源文件是否被正确编译error: #5: cannot open source input file源文件路径错误或文件名大小写不对Error: L6406E: No space in execution regionsFlash或RAM空间溢出检查代码体积Compiler not foundUV4.exe路径配错或Keil没装对应编译器Multi-threaded compile with -j0 requires ARMCLANG并行编译参数仅适用于AC6编译器7.2 编码和IntelliSense问题问题表现解决方案代码注释中文乱码Keil工程文件使用GB2312编码VSCode里把files.encoding设为gbkIntelliSense找不到头文件在c_cpp_properties.json里补全includePath红色波浪线误报确认defines宏定义与Keil工程一致跳转定义不工作项目代码里右键生成compile_commands.json或手动配置includePath7.3 Keil Assistant插件失灵Keil Assistant偶尔会抽风右键工程文件没有编译和下载选项。这种情况基本是插件读不到工程配置或者UV4路径失效。我的处理办法是直接删掉插件重装然后在设置里重新配置UV4.exe路径90%的情况能恢复。剩下10%的情况是Keil工程文件损坏用Keil打开一次工程后保存再回到VSCode刷新就能修复。如果Keil Assistant干脆编译不执行可以在VSCode终端里手动跑一次命令验证问题是否出在插件本身C:/Keil_v5/UV4/UV4.exe -b LED_Test.uvprojx -j0 -o build_log.txt如果命令行能正常出hex文件说明问题出在插件配置重新配置插件即可如果命令行也报错那就是工程或编译器的问题排查方向就不一样了。8. 最后的几点心得搭建这套VSCode Keil环境最大的收获不是让代码编辑界面变好看了而是真正理解了嵌入式工具链各环节的关系。Keil的编译器、链接器、烧录算法、Flash下载算法这些组件是可以被独立调用的图形界面只是一个壳而已。明白了这一点以后不管遇到什么环境问题脑子里都有一条清晰的排查链路工程配置对不对、编译器路径对不对、头文件路径对不对、烧录参数对不对。我个人的建议是新项目直接上AC6编译器别再用AC5了。AC6对C99和C11的支持更好编译速度也快得多代码体积和运行效率都有优势。老项目如果编译没问题就继续用AC5别为了升级而升级稳定压倒一切。还有一个小技巧最后分享给大家在VSCode的终端里配置一个Keil的命令行别名比如把C:/Keil_v5/UV4/UV4.exe映射成keil每次编译的时候直接输入keil -b xxx.uvprojx比点击任何插件的按钮都来得快。这年头芯片型号越来越多项目环境千差万别把工具链的本质理解透了再花哨的环境都能靠自己搭出来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门