告别Keil:用VSCode+OpenOCD打造STM32高效开发环境
做嵌入式开发这些年我在 STM32 上花的时间最多最早接触 Keil MDK周围同事也大多用它项目模板、驱动库、网上教程一搜全是.uvprojx。可这套东西用久了编辑器体验实在跟不上代码跳转慢、补全弱、脚本化能力差想接 Git 和命令行构建还得绕来绕去。后来我花了一个周末把环境迁到 VSCode OpenOCD 上从编译、下载到断点调试全部挪过去之后新项目基本不再碰 Keil。这篇文章我把折腾过程中的方案选择、配置文件、踩坑记录都写出来尤其适合受不了老旧界面、想在 Windows 上获得类 Linux 开发体验或者希望工程能被 CI 自动编译的朋友。1. 为什么要完全舍弃 Keil1.1 老派 IDE 的真实痛点Keil 并不是不能用它最大的优势是“开箱即用”。尤其在学校和传统工控项目里大家拿到手就是 Keil 工程点一下编译再点一下下载跑起来很方便。但一旦项目规模变大痛点就很明显了。首先是编辑器体验。Keil 自带的编辑器对代码补全、符号跳转、重构支持都很弱写大文件时会觉得特别吃力。我试过在里面改一个跨文件的结构体定义全局搜索慢跳转还不准最后只能手动翻代码。这个问题在 VSCode 里基本不存在C/C 插件的 IntelliSense 是基于 clangd 或者标签数据库的跳转、补全、悬停提示都跟现代 IDE 一个水平。其次是工程管理。Keil 的.uvprojx是 XML但相当复杂多 target 分组、编译选项、Link 脚本、分散加载都要用图形界面一个个点。想用 Git 做版本管理diff 一下工程文件都费劲想接入自动化编译或者 CI基本只能靠命令行间接调用 UV4.exe而且 Keil 的许可管理有时候也会成为麻烦。我身边好几个朋友都因为换电脑、升级软件后环境出问题白白浪费半天时间。抛开这些不聊单看“工程可复现”这一点Keil 就已经输给 VSCode OpenOCD 这套组合了。还有一个隐性问题Keil 的生态默认一体化它会替你决定编译器和调试器。但是工程一旦上了规模或者涉及到自定义下载算法、外部 Flash 离线烧录、批量生产写入你会希望能够清楚地控制每一步。Keil 虽然也能做到但中间隔了一层又一层界面配置出错后排查起来很痛苦。1.2 VSCode OpenOCD 能解决什么我最初想换环境核心诉求是三条能舒服地写代码能命令行一键编译能统一调试流程。VSCode 解决了写代码的问题。安装 C/C 扩展包、CMake Tools、Cortex-Debug 之后VSCode 就能识别整个工程目录代码补全和跳转都在本地完成流畅度比 Keil 好太多。配合 Remote-SSH、WSL 这类插件我甚至可以在 Windows 上写代码、在 Linux 服务器上编译或者直接在 WSL 里完成整个开发流程。这对于我这种经常在 Windows 和 Linux 之间切换的人来说简直是一种解脱。OpenOCD 解决的是“下载和调试”的问题。它的全称是 Open On-Chip Debugger是一个开源的多架构调试工具。只要你手里有 ST-Link、J-Link、DAP-Link 这类调试器OpenOCD 就能识别目标芯片初始化调试接口然后把程序写进 Flash再启动一个 GDB Server 供调试器连接。VSCode 里的 Cortex-Debug 插件负责跟 GDB 交互把断点、寄存器、外设变量、调用栈这些平时在 Keil 调试界面里看到的东西重新画成一个直观的调试视图。这套方案还有一个好处是跨平台。同一个 CMake 工程在 Windows 下和 Linux 下都能编译OpenOCD 的配置文件里全是文本指令不依赖任何图形界面。无论你是想在本地快速验证还是想在服务器上定时构建这套链路都非常自然。1.3 这套方案到底适不适合你也不是所有场景都适合立刻迁移。如果你手头全是别人维护的老工程甚至还在用比较旧的库那不建议马上把 Keil 删掉。更合理的做法是新项目直接用新流程老项目可以先用 CMake 把工程重建一份两边输出对比等验证没问题再切换。如果你主要工作是写裸机程序、跑 FreeRTOS、做电机控制、电源控制、车载通信这类 STM32 项目VSCode OpenOCD 完全够用。OpenOCD 调试视频里最常见的场景就是打开 GDB Client、点一下 run、然后在 VSCode 里打断点整个过程跟 Keil 没有本质区别。从我个人体会看这套组合的学习曲线主要集中在 CMake 和 OpenOCD 命令上大概两三天就能上手。换来的是编辑器体验和构建流程的彻底改变这笔账非常划算。2. 先别急着装软件把整个工具链想清楚2.1 编译器从 ArmCC 换成 GCC Arm 工具链Keil 默认使用 Arm CompilerArmCC而 VSCode OpenOCD 的常规组合用的是 GNU Arm Embedded Toolchain也就是arm-none-eabi-gcc。为什么选 GCC首先是免费、开放、无授权困扰其次是它可以集成进 CMake 和命令行体验非常一致。你可能会担心 GCC 编译出来的二进制跟 ArmCC 有差异实际上对于绝大多数 STM32 工程核心差异只有编译优化策略和个别扩展语法。只要工程里没有深度依赖 Keil 的__packed、__attribute__((section()))这类私有写法用 GCC 重编基本没有压力。编译命令的核心其实是这几个参数-mcpu指定内核型号-mthumb指定 Thumb 指令集-ffunction-sections -fdata-sections配合链接时的--gc-sections做无用函数裁剪能显著减小 Flash 占用。内存布局则由链接脚本.ld决定和 Keil 里的分散加载文件.sct是一个意思。我见过不少新手卡在“编译过了但下载进去跑不起来”最后发现是链接脚本里的 Flash/RAM 起始地址和芯片不匹配。这个问题在 Keil 里同样存在只不过 Keil 的工程模板替你写好了切到 GCC 以后就要自己留心。2.2 OpenOCD 和 GDB 各自扮演什么角色OpenOCD 这个概念第一次接触时有点绕我尽量用大白话讲。可以把调试过程想象成两个角色的配合。OpenOCD 是一个“翻译官”它负责通过 USB 访问 ST-Link 或 J-Link把上层发来的调试协议翻译成具体的 SWD/JTAG 时序再把目标芯片的状态读回来。OpenOCD 启动后会在本机开一个 3333 端口监听来自 GDB 的连接。GDB 则是“指挥官”它理解 ELF 文件里的调试信息知道你的源码、变量、断点都在什么位置。GDB 连接 OpenOCD 之后用户敲一个continueGDB 就通过 OpenOCD 让芯片跑起来遇到断点GDB 再读寄存器、读内存、更新变量列表。VSCode 里的 Cortex-Debug 插件本质上就是一个帮你操作 GDB 的图形前端。所以整套调试链路是VSCode (Cortex-Debug) - arm-none-eabi-gdb - OpenOCD - ST-Link/J-Link - STM32这条链路上任何一环出问题都会表现为“连接失败”或者“烧录失败”。排查的时候心里有这张图会快很多。2.3 工程目录与构建系统选型我建议一开始就把目录规划好不然后面会很乱。下面是我常用的一个 STM32 工程结构stm32-project/ ├── CMakeLists.txt ├── Core/ │ ├── Inc/ // 头文件 │ └── Src/ // main.c、中断、HAL初始化 ├── Drivers/ │ ├── CMSIS/ │ └── STM32F1xx_HAL_Driver/ ├── openocd/ │ └── stm32f103.cfg // 自定义 OpenOCD 配置可选 ├── build/ // 编译产物 └── .vscode/ ├── tasks.json ├── launch.json └── settings.json构建系统我推荐 CMake而不是单纯写 Makefile。原因很简单CMake 能跨平台生成构建脚本而且 VSCode 的 CMake Tools 插件对它有原生支持配置 cache、选择编译器、一键构建都很顺手。如果你更喜欢极简也可以直接写 Makefile但后续加新源文件、改编译选项时CMake 的处理方式更规范。关于工程文件来源现在 STM32CubeMX 可以直接生成 CMake 工程这一点后面会讲。如果项目已经存在手动整理成上面的结构通常只需要一两个小时。不要在目录整理上偷懒否则后面 OpenOCD 找文件、GDB 找符号的时候会非常痛苦。3. 环境搭建与工程初始化实战3.1 安装工具链和 VSCode 基础配置先从最简单的开始。去 ARM 官网或 GitHub Releases 页下载 GNU Arm Embedded Toolchain安装后把arm-none-eabi-gcc所在的 bin 目录加到系统 PATH。打开命令行输入arm-none-eabi-gcc --version能看到版本号就是成功。然后安装 OpenOCD。Windows 下最省事的是下载预编译版本比如 xPack 发布的 OpenOCD或者从 GitHub 上找别人打包好的版本。注意要选择和你调试器匹配的版本ST-Link 的话官方主线版本基本都支持。解压后同样把bin目录加入 PATH命令验证一下openocd --version接下来装 VSCode 插件。打开 VSCode在扩展面板搜索并安装这几个核心插件C/C提供 IntelliSense、代码导航和调试配置。CMake Tools识别 CMakeLists.txt提供可视化配置工具链。Cortex-Debug专门用于嵌入式调试支持 OpenOCD 作为 GDB Server。Chinese (Simplified) Language Pack如果对英文界面不习惯搜“Chinese”装语言包重启后就是中文菜单。装完之后VSCode 会提示你配置 C/C 环境可以选择“IntelliSense 模式”为gcc-arm并且把arm-none-eabi-gcc所在路径填进编译器路径。这一步不配置也不影响编译但会影响代码补全和错误提示建议顺手设置好。3.2 用 STM32CubeMX 生成干净的代码骨架不要从零手写寄存器代码那太累了。打开 STM32CubeMX选择你的芯片型号比如 STM32F103C8T6配置时钟、GPIO、USART、定时器然后在 Project Manager 里Project Name 填工程名Toolchain/IDE 选 “CMake”如果版本没有 CMake 选项就选 “Makefile” 或 “Other Toolchains”勾选“Generated files”里把“Linker script”保留。CubeMX 生成的工程里会有Core/、Drivers/、CMakeLists.txt、.ld链接脚本等文件。注意检查一下它生成的 CMakeLists.txt默认的编译选项通常是没问题的但源文件列表里不一定包含你后续添加的所有目录。我习惯在 CubeMX 生成之后把CMakeLists.txt整理成自己熟悉的结构把源文件列表改成file(GLOB...)或者显式列出来。如果你用的是比较老的 CubeMX没有 CMake 选项可以选 Makefile 模板生成后手动写 CMake。核心需要的只是Core/、Drivers/和.ld文件其他那些.uvprojx、.ioc只是辅助文件。有一点务必从第一天就养成习惯不要在 CubeMX 生成的文件里手动改大量业务代码。HAL 初始化逻辑比如MX_GPIO_Init()后续如果要重新生成CubeMX 会覆盖。业务代码应该放在单独的模块里由你自己的源文件管理。这一点和 Keil 下的开发习惯一样。3.3 手写一份能用的 CMakeLists.txtCubeMX 生成的 CMakeLists 通常可以用但会把所有源文件列得又长又碎。我更推荐手动维护一份精简版本。下面给一个 STM32F103C8T6 的示例其他型号只需要改 CPU 型号和链接脚本。cmake_minimum_required(VERSION 3.16) project(stm32_demo C ASM) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) # 编译选项F103 是 Cortex-M3其他型号对应修改 set(CMAKE_C_FLAGS -mcpucortex-m3 -mthumb -stdgnu11 -Wall -ffunction-sections -fdata-sections) set(CMAKE_EXE_LINKER_FLAGS -mcpucortex-m3 -mthumb -T ${CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld -Wl,--gc-sections) add_executable(${PROJECT_NAME} Core/Startup/startup_stm32f103c8tx.s Core/Src/main.c Core/Src/stm32f1xx_hal_msp.c Core/Src/system_stm32f1xx.c Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c ) target_include_directories(${PROJECT_NAME} PRIVATE Core/Inc Drivers/STM32F1xx_HAL_Driver/Inc Drivers/CMSIS/Device/ST/STM32F1xx/Include Drivers/CMSIS/Include ) # 用 OpenOCD 一键下载到芯片 add_custom_target(flash COMMAND openocd -f board/st_nucleo_f103rb.cfg -c program ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.elf verify reset exit DEPENDS ${PROJECT_NAME} )这个文件有几个关键点解释一下。链接脚本路径一定要和你的.ld文件位置一致。如果链接脚本在别的目录就写相对路径或者绝对路径。--gc-sections必须配合-ffunction-sections -fdata-sections才能生效否则虽然能编过但 Flash 占用会大不少。add_custom_target(flash ...)里的 OpenOCD 命令使用了限速官方板配置文件board/st_nucleo_f103rb.cfg如果你的板子不是 Nucleo建议改成接口配置和目标配置单独写。对于手头没有现成 CMake 工程的人可以直接在工程根目录跑一下cmake -S . -B build -G Ninja cmake --build build -j8Ninja 比 Make 快Windows 下需要安装并加入 PATH。如果不想装 Ninja直接用-G MinGW Makefiles或者-G Unix Makefiles也行。3.4 OpenOCD 烧录配置OpenOCD 本身的配置文件是分层的先加载调试器接口配置再加载目标芯片配置最后可以执行一些自定义命令。最常见的一条烧录命令是openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c transport select hla_swd -c program build/stm32_demo.elf verify reset exit这条命令做了几件事初始化 ST-Link选择 SWD 传输协议初始化 STM32F1 目标芯片然后把.elf文件下载到 Flash校验后复位运行。不同芯片对应的 target 配置不同F4 系列用target/stm32f4x.cfgG0 系列用target/stm32g0x.cfg在 OpenOCD 的scripts/target目录下都能看到。接口配置也类似J-Link 用interface/jlink.cfgST-Link 用interface/stlink.cfgDAP-Link 用interface/cmsis-dap.cfg。如果你不想每次敲这么长的命令可以把 OpenOCD 配置封装成一个.cfg文件比如openocd/stm32f103.cfgsource [find interface/stlink.cfg] source [find target/stm32f1x.cfg] transport select hla_swd然后在命令行里openocd -f openocd/stm32f103.cfg -c program build/stm32_demo.elf verify reset exit这样清爽很多。有一点要提醒OpenOCD 对transport select hla_swd的处理在不同版本里略有差异。旧版本可能提示unable to find a transport这时检查一下你的接口配置是普通 ST-Link 还是 CMSIS-DAP 模式必要时直接删掉这一行因为新版 stlink.cfg 会自动选 SWD。4. 在 VSCode 里打通编译和调试4.1 tasks.json把 build 和 flash 变成一条命令VSCode 的任务系统非常强大我们可以在工程根目录.vscode/tasks.json里配置常用的构建和烧录命令。我习惯定义两个任务一个 build一个 flash。{ version: 2.0.0, tasks: [ { label: build, type: shell, command: cmake --build build -j8, group: { kind: build, isDefault: true }, problemMatcher: [ $gcc ] }, { label: flash, type: shell, command: openocd -f openocd/stm32f103.cfg -c \program build/stm32_demo.elf verify reset exit\, group: build } ] }配置之后按CtrlShiftB可以直接编译或者打开命令面板输入 “Tasks: Run Task” 选择 flash。由于 task 里的命令是手心写死的 shell 命令所以代码里所有的编译路径问题都会在这里暴露。比如没把 OpenOCD 加入 PATH就会出现openocd 不是内部或外部命令遇到这种情况先回到命令行验证环境变量。如果你用的是 CMake Tools 插件也可以直接用插件底部的状态栏按钮构建tasks 配置主要方便后续把“构建烧录”绑定成一条自动化流程。4.2 launch.jsonCortex-Debug 连接 GDB调试配置是这套方案里最核心的部分。在.vscode/launch.json里新建一个 Cortex-Debug 配置示例{ version: 0.2.0, configurations: [ { name: OpenOCD Debug, type: cortex-debug, request: launch, servertype: openocd, serverpath: C:/OpenOCD/bin/openocd.exe, searchDir: [C:/OpenOCD/scripts], configFiles: [ openocd/stm32f103.cfg ], gdbPath: C:/GNU Arm Embedded Toolchain/10 2021.10/bin/arm-none-eabi-gdb.exe, executable: ${workspaceRoot}/build/stm32_demo.elf, svdFile: ${workspaceRoot}/STM32F103.svd, runToMain: true, cwd: ${workspaceRoot} } ] }这个配置的关键字段是servertype和serverpath。servertype必须是openocdserverpath指向 OpenOCD 可执行文件。configFiles里写你自己的 OpenOCD 配置文件Cortex-Debug 启动时会在后台拉起 OpenOCD然后自动连接 GDB。svdFile是可选但强烈推荐的字段。SVD 文件由芯片厂商提供里面描述了每个外设寄存器的地址、位域含义。加载之后调试时打开“外设寄存器”视图能看到 GPIOA、USART1、TIM2 这些外设的实时寄存器状态像 Keil 的 System Viewer 一样直观。SVD 文件可以从 ST 官方仓库或者网上找到保存到工程目录后填相对路径就行。配置好按 F5 启动调试VSCode 会弹出调试工具栏程序会在 main 函数入口停下。此时可以直接打点断点、单步、看变量、看调用栈体验已经非常接近主流 IDE。4.3 日常调试时我喜欢用的几个操作有了基础调试能力之后真正提升效率的是几个细节。第一个是runToMain。这个选项会在启动 GDB 后自动在main函数入口放下临时断点然后直接运行到那里。否则你会发现程序停在一个毫无含义的汇编启动代码位置对调试没有帮助。第二个是用调试控制台输入 GDB 命令。很多以前在 OpenOCD 里敲的命令可以直接在 VSCode 调试控制台执行。比如我想立刻停住芯片monitor halt想复位芯片monitor reset halt想查看某个外设寄存器p/x *(unsigned long*)0x40010800这些命令对排查启动流程、检查外设状态非常有用。Cortex-Debug 还会输出 OpenOCD 的日志连接出问题时第一条线索往往就在调试控制台里。第三个是配合 FreeRTOS 调试。如果你移植了 FreeRTOSCortex-Debug 会在调试时自动检测 RTOS 内核任务列表、任务栈使用情况都能在变量视图里看到。前提是工程里需要保留相关符号编译时不要把调试信息裁剪掉也就是不要使用-DNDEBUG或过度优化。默认的-O0或-Og是调试首选。5. 常见问题与排查实录5.1 编译链接报错的几个方向新的工具链刚上手时编译报错是最容易劝退人的。我遇到最多的问题可以归成三类。第一类是找不到头文件。CubeMX 生成的工程目录里有些头文件路径隐藏在 Makefile 或者 IDE 配置里切到 CMake 后如果没有把Inc目录加进target_include_directories就会报一堆No such file or directory。解决办法是先对照原工程把 include 目录全部列出来再逐个加进 CMake。第二类是链接脚本路径写错。报错通常是cannot open linker script file ...或者undefined symbol Reset_Handler。前者是路径问题后者极有可能是启动文件没有参与链接。STM32 的启动文件是.s汇编文件必须在 CMake 里明确列给add_executable否则中断向量表缺失程序下载后也跑不起来。第三类是内存超限。GCC 链接时如果报section .text will not fit in region FLASH优先检查是否忘了加-ffunction-sections -fdata-sections和--gc-sections然后才考虑裁剪代码。把优化等级从-O0提高到-O1也是一个办法但调试体验会差一点。5.2 “OpenOCD server is not running”和连接失败这个问题在 openocd 调试相关搜索里非常常见英文报错原话是cant perform jtag flash, because openocd server is not running!看到这句话时第一反应是检查 OpenOCD 是否真的活着。如果你在 VSCode 里按 F5 调试时查看调试控制台会发现 Cortex-Debug 会先启动 OpenOCD然后才连 GDB。如果 OpenOCD 启动失败比如配置文件写错、端口被占用、ST-Link 驱动异常后续烧录和调试都会报这个错。常见的触发原因有两个。一个是之前某个调试会话没关干净旧 OpenOCD 进程还占着 3333 端口新会话起不来。解决方法很简单任务管理器里结束所有openocd.exe再重新启动。另一个是 ST-Link 驱动问题。Windows 下比较坑的一点是 ST-Link 必须用 WinUSB 驱动否则 OpenOCD 无法访问 USB 设备。这种情况通常会伴随“openocd 已停止”的弹窗或者在日志里看到libusb相关错误。处理方式是下载 Zadig把 ST-Link 的驱动切换到 WinUSB 模式。还有一种是芯片配置导致连接不稳定。如果你在 CubeMX 里把 SWD 引脚PA13/PA14重新复用了程序一旦跑起来OpenOCD 可能就断连。解决办法是在下载前按住板子复位键OpenOCD 启动后立刻发reset halt让芯片停住再释放复位键。进阶做法是在工程里保留 SWD 功能不要在初始化代码里把这两个引脚占掉。5.3 程序下载到外部 Flash 的注意事项“OpenOCD 下载到外部 Flash”是一个比普通烧录复杂一点的话题主要场景是程序太大、内部 Flash 不够或者产品设计上要求把代码放到外部 SPI Flash然后通过 Bootloader 加载执行。OpenOCD 默认只操作芯片内部的 Flash Bank。对于外部 Flash需要额外定义一个新的 flash bank并且指定外部 Flash 的读写算法。以常见的 W25Qxx 为例OpenOCD 里要写类似这样的配置flash bank spi_ext0 stm32f1x 0x90000000 0 0 0 $_TARGETNAME其实不同型号的外扩 Flash 驱动差异很大不建议直接用别人的配置。正确做法是去 OpenOCD 源码或社区仓库里找对应 Flash 型号的驱动或者参照已有工程里的写法调整。这里有一个容易踩的坑外部 Flash 映射的内存地址不是随意填的它由你的 MCU 和硬件设计决定填错了就算下载成功程序也执行不起来。我的建议是如果没有特殊需求先老老实实把内部 Flash 烧录这套流程跑通再考虑外扩方案。外扩方案涉及 Bootloader 跳转、地址重映射、部分链接脚本重写和 Keil 里的 Flash Algorithm 操作逻辑差别很大需要单独做实验验证。5.4 常见错误速查表下面是我整理的一个常用问题表遇到类似问题可以直接照着排查。现象可能原因解决方法arm-none-eabi-gcc: command not found工具链没加入 PATH检查环境变量新开终端窗口No such file or directoryCMake include 目录缺失把所有头文件路径加进 target_include_directoriessection .text will not fit in region FLASHFlash 空间不足或未开裁剪增加-ffunction-sections -fdata-sections和--gc-sectionscannot open linker script fileLD 文件路径错误修正 CMake 里的-T参数cant perform jtag flash...server is not runningOpenOCD 未启动或端口占用杀掉残留 OpenOCD 进程重新启动openocd 已停止ST-Link 驱动异常或 libusb 问题用 Zadig 把 ST-Link 驱动切成 WinUSB连接后能识别芯片但烧录失败芯片读保护已开启执行 OpenOCD 的unlock命令擦除保护程序下载成功但没反应启动文件缺失或时钟配置错误确认.s文件参与编译检查 CubeMX 时钟树烧录之前如果发现读保护OpenOCD 的处理方式比 Keil 直接也更容易误操作。一定确认你确实需要解锁因为解锁会擦掉整个 Flash生产板上的数据可就不保了。6. 从 Keil 平滑迁移的一些个人建议如果你现在还在犹豫我的建议是先并行不要一步到位。把现有 Keil 工程先导成 CMake用 VSCode 编译生成.elf然后用 OpenOCD 手动烧录到板子跑一个简单的 GPIO 翻转程序验证时钟和启动是否正常。这一步通过后再配置 Cortex-Debug试一下断点调试。等这两步都稳定了Keil 基本就可以退居二线了。迁移过程中最容易让人焦虑的是“原来 Keil 一点就下载现在怎么要敲命令”。我的体会是把经常用的命令固化进tasks.json之后每天的工作流就变成了改代码 → CtrlShiftB 编译 → CtrlShiftP 运行 flash → F5 调试。操作次数比 Keil 多一点点但换来的是对工程流程的完全掌控。这套方案的弹性也很大。以后如果你换了芯片平台比如切到其他厂商的 ARM 核只要改改 CMake 和 OpenOCD 配置编辑器和调试流程完全不用动如果你的项目要量产烧录脚本可以直接接入产测流程不需要在每台电脑上都装一个图形 IDE。对于一个需要长期维护的嵌入式项目来说这种“去工具化”的收益会越来越大。最后再分享一个小技巧第一次用 OpenOCD 的时候先在命令行单独启动它不要急着在 VSCode 里按 F5。你会看到 OpenOCD 打印出很多初始化日志包括检测到的芯片 ID、Flash 大小、hla 接口类型。这些日志能帮你确认硬件连接、驱动是否正常以后再看到网络上的 openocd 调试视频基本就能一眼判断出问题出在哪一层。先把这一条跑稳后面就不会有大麻烦了。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →