先楫 HPM6E8Y开发环境的搭建(三)Vscode平台
摘要本文以已经完成 Flash XIP 启动验证的 HPMicro HPM6E8Y 自定义开发板工程为基础介绍如何将后续代码编辑、编译、烧写与调试工作迁移到 Visual Studio Code。整个开发流程继续使用 HPM SDK v1.12.1 提供的 CMake、Ninja、RISC-V GCC、RISC-V GDB 和 OpenOCD仅将 Segger Embedded Studio 替换为 VSCode 作为主要开发界面。本文从 VSCode 工程目录选择、插件安装、工具路径确认、编译任务配置、OpenOCD 调试配置以及 IntelliSense 代码索引配置等方面展开并给出完整的tasks.json、launch.json和c_cpp_properties.json示例。完成配置后可在 VSCode 中实现 Flash XIP 工程编译、外部 QSPI NOR Flash 烧写、源码断点、单步调试、变量观察、头文件识别和函数定义跳转。关键词HPM6E8YVSCodeFlash XIPCMakeNinjaOpenOCDCortex-DebugIntelliSense1. 配置目标本次配置建立在以下条件之上HPM6E8Y 自定义开发板已经可以运行 LED 闪烁程序flash_xip工程已经能够在 SES 中正常编译和烧写自定义开发板的 YAML 与 CFG 文件已经配置完成外部 QSPI NOR Flash 已经可以被 OpenOCD 正常访问工程根目录为D:\HPW\workspace\hpm_led最终目标是在 VSCode 中实现代码编辑 ↓ CMake Ninja 编译 ↓ 生成 demo.elf ↓ OpenOCD 烧写外部 Flash ↓ RISC-V GDB 调试 ↓ 源码断点、单步和变量查看2. 软件与工程环境2.1 软件环境项目配置操作系统Windows 10HPM SDK Envv1.12.1IDEVisual Studio Code编译系统CMake Ninja编译器riscv32-unknown-elf-gcc调试器riscv32-unknown-elf-gdb调试服务OpenOCDVSCode 调试插件Cortex-Debug构建类型flash_xip编译类型debug2.2 工程目录VSCode 打开的工作区根目录为D:\HPW\workspace\hpm_led推荐目录结构如下D:\HPW\workspace\hpm_led ├─ .vscode │ ├─ tasks.json │ ├─ launch.json │ └─ c_cpp_properties.json │ ├─ hpm_led │ ├─ hpm_led.yaml │ ├─ hpm_led.cfg │ ├─ board.c │ ├─ clock.c │ ├─ pinmux.c │ └─ pinmux.h │ └─ user_app ├─ CMakeLists.txt ├─ src │ └─ main.c └─ hpm_led_flash_xip_debug ├─ compile_commands.json └─ output └─ demo.elf工作区必须打开到D:\HPW\workspace\hpm_led而不是只打开D:\HPW\workspace\hpm_led\user_app原因是 VSCode 配置需要同时访问${workspaceFolder}/user_app ${workspaceFolder}/hpm_led/hpm_led.cfg3. VSCode 插件安装在 VSCode 中打开扩展界面Ctrl Shift X安装以下三个插件。3.1 C/C名称C/C 发布者Microsoft 扩展 IDms-vscode.cpptools主要作用C/C 代码补全语法检查宏和类型识别头文件搜索函数定义跳转IntelliSense 数据库管理。3.2 CMake Tools名称CMake Tools 发布者Microsoft 扩展 IDms-vscode.cmake-tools主要作用CMake 工程辅助构建目录识别CMake 配置和编译支持工程状态显示。本工程主要通过tasks.json调用 CMake因此不依赖 CMake Tools 自动接管工程但保留该插件有利于后续扩展。3.3 Cortex-Debug名称Cortex-Debug 发布者marus25 扩展 IDmarus25.cortex-debug主要作用启动 OpenOCD启动 RISC-V GDB加载 ELF 调试符号设置源码断点单步调试查看寄存器和变量控制目标 MCU 复位、暂停和运行。虽然插件名称中带有 Cortex但它允许指定自定义 GDB 和 OpenOCD因此可用于当前 HPM6E8Y RISC-V 调试环境。4. 工具路径确认在 VSCode 中打开命令提示符终端终端 ↓ 新建终端使用以下命令搜索 HPM SDK Env 中的工具where /R D:\HPW\sdk_env_v1.12.1 cmake.exe where /R D:\HPW\sdk_env_v1.12.1 ninja.exe where /R D:\HPW\sdk_env_v1.12.1 openocd.exe where /R D:\HPW\sdk_env_v1.12.1 riscv32-unknown-elf-gdb.exe当前实际路径如下CMake D:\HPW\sdk_env_v1.12.1\tools\cmake\bin\cmake.exe Ninja D:\HPW\sdk_env_v1.12.1\tools\ninja\ninja.exe OpenOCD D:\HPW\sdk_env_v1.12.1\tools\openocd\openocd.exe RISC-V GDB D:\HPW\sdk_env_v1.12.1\toolchains\ rv32imac_zicsr_zifencei_multilib_b_ext-win\ bin\riscv32-unknown-elf-gdb.exe另外VSCode 代码索引使用的编译器为D:\HPW\sdk_env_v1.12.1\toolchains\ rv32imac_zicsr_zifencei_multilib_b_ext-win\ bin\riscv32-unknown-elf-gcc.exe5. 配置 Flash XIP 编译任务5.1 创建.vscode文件夹在工程根目录下创建D:\HPW\workspace\hpm_led\.vscode5.2 创建tasks.json文件路径D:\HPW\workspace\hpm_led\.vscode\tasks.json 填写以下内容 json { version: 2.0.0, tasks: [ { label: HPM6E8Y Build Flash XIP, type: shell, command: D:/HPW/sdk_env_v1.12.1/tools/cmake/bin/cmake.exe, args: [ --build, D:/HPW/workspace/hpm_led/user_app/hpm_led_flash_xip_debug, --parallel ], options: { cwd: D:/HPW/workspace/hpm_led }, problemMatcher: [ $gcc ], group: { kind: build, isDefault: true } } ] }5.3tasks.json参数分析labellabel:HPM6E8Y Build Flash XIP定义任务名称。该名称后续还会被launch.json中的preLaunchTask引用。commandcommand:D:/HPW/sdk_env_v1.12.1/tools/cmake/bin/cmake.exe指定 HPM SDK Env 中实际使用的 CMake。argsargs:[--build,D:/HPW/workspace/hpm_led/user_app/hpm_led_flash_xip_debug,--parallel]相当于执行cmake --build ^ D:/HPW/workspace/hpm_led/user_app/hpm_led_flash_xip_debug ^ --parallel其中--build → 编译已经生成好的 CMake 构建目录 --parallel → 使用并行编译提高编译速度problemMatcherproblemMatcher:[$gcc]表示 VSCode 使用 GCC 的输出格式解析编译警告和错误。编译信息会直接显示在问题 终端 源代码行标记默认编译任务group:{kind:build,isDefault:true}表示该任务为默认编译任务。之后可直接按Ctrl Shift B完成 Flash XIP 工程编译。6. 编译结果验证执行Ctrl Shift B成功输出示例[68/68] Linking C executable output\demo.elf Memory region Used Size Region Size %age Used FLASH: 49760 B 16 MB 0.30% ILM: 1952 B 256 KB 0.74% DLM: 32 KB 256 KB 12.50% AXI_SRAM: 496 B 512 KB 0.09% AXI_SRAM_NONCACHEABLE: 0 B 256 KB 0.00% SHARE_RAM: 0 B 16 KB 0.00% AHB_SRAM: 0 B 32 KB 0.00%最终生成D:\HPW\workspace\hpm_led\user_app\ hpm_led_flash_xip_debug\output\demo.elf这说明以下编译链路已经建立VSCode ↓ tasks.json ↓ CMake ↓ Ninja ↓ RISC-V GCC ↓ demo.elf7. 配置 Flash XIP 下载与调试7.1 创建launch.json文件路径D:\HPW\workspace\hpm_led\.vscode\launch.json填写以下内容{version:0.2.0,configurations:[{name:HPM6E8Y Flash XIP Debug,type:cortex-debug,request:launch,cwd:D:/HPW/workspace/hpm_led,executable:D:/HPW/workspace/hpm_led/user_app/hpm_led_flash_xip_debug/output/demo.elf,servertype:openocd,serverpath:D:/HPW/sdk_env_v1.12.1/tools/openocd/openocd.exe,gdbPath:D:/HPW/sdk_env_v1.12.1/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gdb.exe,objdumpPath:D:/HPW/sdk_env_v1.12.1/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-objdump.exe,toolchainPrefix:riscv32-unknown-elf,interface:jtag,configFiles:[D:/HPW/sdk_env_v1.12.1/hpm_sdk/boards/openocd/probes/ft2232.cfg,D:/HPW/sdk_env_v1.12.1/hpm_sdk/boards/openocd/soc/hpm6e80-single-core.cfg,D:/HPW/workspace/hpm_led/hpm_led/hpm_led.cfg],searchDir:[D:/HPW/sdk_env_v1.12.1/hpm_sdk/boards/openocd,D:/HPW/sdk_env_v1.12.1/tools/openocd/tcl],preLaunchTask:HPM6E8Y Build Flash XIP,runToEntryPoint:main,showDevDebugOutput:raw}]}8.launch.json参数分析8.1 调试类型type:cortex-debug表示使用 Cortex-Debug 插件执行嵌入式调试。8.2 启动方式request:launch表示调试时启动新的 OpenOCD 和 GDB 会话并加载当前 ELF 文件。8.3 ELF 文件executable:D:/HPW/workspace/hpm_led/user_app/hpm_led_flash_xip_debug/output/demo.elf该文件同时用于Flash 下载加载调试符号地址与源码映射变量和函数定位断点设置反汇编显示。8.4 OpenOCD 路径serverpath:D:/HPW/sdk_env_v1.12.1/tools/openocd/openocd.exe必须使用 HPM SDK Env 自带的 OpenOCD。该版本包含 HPMicro 的目标配置和 XPI Flash 编程支持。8.5 RISC-V GDB 路径gdbPath:D:/HPW/sdk_env_v1.12.1/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gdb.exe该路径指定 HPM6E8Y 使用的 RISC-V GDB。8.6 OpenOCD 配置文件configFiles:[.../probes/ft2232.cfg,.../soc/hpm6e80-single-core.cfg,.../hpm_led/hpm_led.cfg]配置顺序为FT2232 调试器配置 ↓ HPM6E80 SoC 配置 ↓ hpm_led 自定义板配置三层配置的职责如下配置文件作用ft2232.cfg配置电脑端 JTAG 调试器hpm6e80-single-core.cfg配置 HPM6E80 CPU 和调试目标hpm_led.cfg配置板载 XPI Flash、时钟和复位事件8.7 OpenOCD 搜索路径searchDir:[D:/HPW/sdk_env_v1.12.1/hpm_sdk/boards/openocd,D:/HPW/sdk_env_v1.12.1/tools/openocd/tcl]用于告诉 OpenOCD 到哪里查找Probe 配置SoC 配置OpenOCD Tcl 脚本Flash 驱动脚本Target 配置。8.8 自动编译preLaunchTask:HPM6E8Y Build Flash XIP表示每次按F5前自动执行编译任务。完整流程为F5 ↓ 自动执行 HPM6E8Y Build Flash XIP ↓ 生成最新 demo.elf ↓ 启动 OpenOCD ↓ 启动 GDB ↓ 烧写并调试8.9 运行到mainrunToEntryPoint:main表示程序下载完成后运行到intmain(void)并暂停。8.10 调试日志showDevDebugOutput:raw表示显示 Cortex-Debug 的完整启动配置和原始调试日志。配置验证完成后可改成showDevDebugOutput:none也可以直接删除该项使调试输出更简洁。9. VSCode 调试操作按F5选择HPM6E8Y Flash XIP Debug调试链路如下VSCode ↓ Cortex-Debug ↓ RISC-V GDB ↓ OpenOCD ↓ FT2232 ↓ JTAG ↓ HPM6E8Y ↓ XPI0 ↓ 外部 QSPI NOR Flash成功进入调试后可使用快捷键功能F5继续运行F10单步跳过F11单步进入Shift F11单步跳出Shift F5停止调试Ctrl Shift B编译工程在源代码左侧单击可设置断点。例如在gpio_toggle_pin(HPM_GPIO0,GPIO_DO_GPIOA,9U);处设置断点后程序运行到该行会暂停LED 闪烁也会暂时停止。继续按F5后程序恢复运行。这说明以下调试链路已经建立源码断点 ↓ ELF 调试符号 ↓ RISC-V GDB ↓ OpenOCD ↓ HPM6E8Y 硬件断点10. 配置头文件识别与函数跳转10.1compile_commands.jsonHPM SDK 的 CMake 构建目录中已经生成D:\HPW\workspace\hpm_led\user_app\ hpm_led_flash_xip_debug\ compile_commands.json该文件包含每个.c文件真实使用的编译器路径宏定义头文件搜索路径编译选项架构参数源文件路径。VSCode 的 C/C 插件读取该文件后可正确识别 HPM SDK 的头文件和函数定义。10.2 创建c_cpp_properties.json文件路径D:\HPW\workspace\hpm_led\.vscode\c_cpp_properties.json填写{configurations:[{name:HPM6E8Y,compilerPath:D:/HPW/sdk_env_v1.12.1/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gcc.exe,compileCommands:D:/HPW/workspace/hpm_led/user_app/hpm_led_flash_xip_debug/compile_commands.json,cStandard:c11,cppStandard:c17}],version:4}11.c_cpp_properties.json参数分析11.1compilerPathcompilerPath:D:/HPW/sdk_env_v1.12.1/toolchains/.../riscv32-unknown-elf-gcc.exe告诉 VSCode 当前工程使用的是 RISC-V GCC。C/C 插件可根据该编译器识别内建宏数据类型宽度目标架构编译器语法扩展。11.2compileCommandscompileCommands:D:/HPW/workspace/hpm_led/user_app/hpm_led_flash_xip_debug/compile_commands.json该配置直接导入 CMake 生成的真实编译数据库。相比手动填写大量includePath这种方式更准确因为 HPM SDK 中包含大量由 CMake 自动加入的SDK 头文件路径SoC 头文件路径Board 头文件路径构建目录生成文件路径功能宏定义架构参数。11.3 C 与 C 标准cStandard:c11,cppStandard:c17分别指定 VSCode IntelliSense 使用的 C 和 C 语言标准。当前工程主要使用 C 语言核心配置为C1112. 刷新 IntelliSense 数据库保存c_cpp_properties.json后执行Ctrl Shift P选择C/C: Reset IntelliSense Database然后再次执行Ctrl Shift P选择Developer: Reload WindowVSCode 重新加载后C/C 插件会重新读取compile_commands.json重新建立头文件索引函数索引类型索引宏定义索引代码跳转数据库。完成后#includehpm_clock_drv.h不再出现无法打开源文件的提示。将光标放在clock_cpu_delay_ms或其他 SDK 函数上按F12即可跳转到函数定义。也可使用Alt F12在当前窗口内预览函数定义。13. VSCode 与构建系统的关系配置完成后VSCode 本身并不直接编译 HPM6E8Y 程序。实际关系为VSCode ↓ tasks.json ↓ CMake ↓ Ninja ↓ RISC-V GCC调试关系为VSCode ↓ Cortex-Debug ↓ RISC-V GDB ↓ OpenOCD ↓ FT2232 JTAG ↓ HPM6E8Y代码索引关系为CMake ↓ compile_commands.json ↓ VSCode C/C 插件 ↓ 头文件识别与函数跳转因此三个配置文件分别承担不同职责文件主要作用tasks.json编译工程launch.json下载和调试c_cpp_properties.json代码补全、头文件识别和函数跳转最终展示