HPM
首先,创建一个环境变量 HPM_SDK_BASE 指向sdk_env内的hpm_sdk,,后续若SDK升级,仅需更改该变量就可以一键迁移。随后,在VSCode中安装C/C++ extensions pack,写入如下配置文件到.vscode/settings.json。这不仅将使得CMake拓展自动感知到HPM_SDK中自带的工具链,也配置C/C++拓展以激活语言服务器。
{
    "cmake.cmakePath": "${env:HPM_SDK_BASE}/../tools/cmake/bin/cmake.exe",
    "cmake.additionalCompilerSearchDirs": [
        "${env:HPM_SDK_BASE}/../toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin",
    ],
    "cmake.generator": "Ninja",
    "cmake.configureArgs": [
        "-DCMAKE_MAKE_PROGRAM=${env:HPM_SDK_BASE}/../tools/ninja/ninja.exe",
    ],
    "cmake.configureEnvironment": {
        "GNURISCV_TOOLCHAIN_PATH": "${env:HPM_SDK_BASE}/../toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/",
    },
    "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}在VSCode配置完成后,使用如下CMakeLists.txt以完成项目配置,其中有预留的sdk和组件设置,USB_DEVICE和HPM5300EVK可以更改为您需要的选项。这将自动探测/src下的c和cpp文件并添加进构建目标中,同时将/include作为头文件目录加入进去。
cmake_minimum_required(VERSION 3.13)
# setup sdk 
set(BOARD hpm5300evk)
set(HPM_BUILD_TYPE flash_xip)
# setup compoenents
set(CONFIG_USB_DEVICE TRUE)
message(STATUS "HPM SDK Base: $ENV{HPM_SDK_BASE}")
message(STATUS "HPM SDK Toolchain: ${GNURISCV_TOOLCHAIN_PATH}")
find_package(hpm-sdk REQUIRED HINTS $ENV{HPM_SDK_BASE})
project(hello_world)
file(GLOB_RECURSE SOURCES src/*.c src/*.cpp)
sdk_inc(${CMAKE_CURRENT_SOURCE_DIR}/include)
sdk_app_src(${SOURCES})至此,已经可以通过VSCode构建和自动高亮HPM固件代码。随后,配置.vscode/tasks.json,写入下载和挂起等待调试的算法:(注意,此处传给OpenOCD的参数外侧还有一层花括号,这是因为TCL默认将反斜杠解释为转义字符。对于WIndows路径,OpenOCD推荐使用花括号避免转义 https://openocd.org/doc/html/FAQ.html)
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "download_and_attach",
            "type": "shell",
            "dependsOn": "CMake: build",
            "command": "${env:HPM_SDK_BASE}/../tools/openocd/openocd.exe",
            "args": [
                "-c",
                "set HPM_SDK_BASE {${env:HPM_SDK_BASE}}; set BOARD hpm5300evk; set PROBE ft2232;",
                "-f",
                "${env:HPM_SDK_BASE}/boards/openocd/hpm5300_all_in_one.cfg",
                "-c",
                "program {${workspaceFolder}/build/output/demo.elf} verify; reset_soc"
            ],
            "isBackground": true,
            "problemMatcher": [
                {
                "pattern": [
                    {
                    "regexp": ".",
                    "file": 1,
                    "location": 2,
                    "message": 3
                    }
                ],
                "background": {
                    "activeOnStart": true,
                    "beginsPattern": ".",
                    "endsPattern": ".",
                }
                }
            ],
        },
        {
            "label": "kill_openocd",
            "command": "echo ${input:terminate}",
            "type": "shell",
            "problemMatcher": []
        }
    ],
    "inputs": [
        {
            "id": "terminate",
            "type": "command",
            "command": "workbench.action.tasks.terminate",
            "args": "terminateAll"
        }
    ]
}添加一个.vscode/launch.json以拉起gdb服务器并附加到openocd:
{
    "configurations": [
    {
        "name": "(hpm_sdk) Flash&Debug",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/build/output/demo.elf",
        "cwd": "${workspaceFolder}",
        "preLaunchTask":"download_and_attach",
        "postDebugTask": "kill_openocd",
        "miDebuggerPath": "${env:HPM_SDK_BASE}/../toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gdb.exe",
        "setupCommands": [
            {
                "text": "target remote localhost:3333",
                "description": "Connect to the target",
                "ignoreFailures": false
            },
        ],
    }
    ]
}便可以优雅的调试程序:

STM32
1、安装https://marketplace.visualstudio.com/items?itemName=stmicroelectronics.stm32-vscode-extension。
2、切换到预发布模式。
3、完成。
随后即可使用
1、ST拓展生成工程,无需额外配置。
2、STM32CubeMX生成工程,生成时选择CMake,随后在VSCode中打开即可自动识别工程,再在右下角点击确定即可。如果有任何高亮错误,在左下角点击Build后就可以消除。编译后选择Run&Debug并选择您所需要的调试器,如果需要一键下载和重构建,添加如下脚本(以STLink为例):
{
    "version": "0.2.0",
    "configurations": [
        
        {
            "type": "stlinkgdbtarget",
            "request": "launch",
            "name": "STM32Cube: STM32 Launch ST-Link GDB Server",
            "origin": "snippet",
            "cwd": "${workspaceFolder}",
            "runEntry": "main",
            "imagesAndSymbols": [
                {
                    "imageFileName": "${command:st-stm32-ide-debug-launch.get-projects-binary-from-context1}"
                }
            ],
            "preBuild": "${command:st-stm32-ide-debug-launch.build}"
        }
    ]
} 
			