VSCode+arm-none-eabi-gcc交叉编译+CMake构建+OpenOCD(基于Raspberry Pico RP2040)

settings.json:

json 复制代码
{
  // 字符集编码选择
  "files.encoding": "utf8",
  // 自动保存任意文件
  "files.autoSave": "afterDelay",
  // 文件图标主题:"material-icon-theme"
  "workbench.iconTheme": "material-icon-theme",
  // 颜色主题设置
  "workbench.colorTheme": "Default Dark Modern",
  //粘贴时格式化代码
  "editor.formatOnPaste": true,
  //保存时格式化代码
  "editor.formatOnSave": true,
  //设置字体的大小,最小值能设置为6
  "editor.fontSize": 15,
  //设置字体的粗细
  "editor.fontWeight": "500",
  //设置字体的样式
  // "terminal.integrated.fontFamily":"Courier New",
  //使用Ctrl+滚轮缩放编辑区的字体大小
  "editor.mouseWheelZoom": true,
  //使用Ctrl+滚轮缩放终端Terminal的字体大小
  "terminal.integrated.mouseWheelZoom": true,
  //设置为false,这样打开新的文件时,不会自动关闭旧的文件
  "workbench.editor.enablePreview": false,
  //*************************************************************************//
  "cmake.buildBeforeRun": true,
  "cmake.configureOnOpen": true,
  "cmake.configureSettings": {
    "CMAKE_MODULE_PATH": "${env:PICO_INSTALL_PATH}/pico-sdk-tools"
  },
  //该行配置很重要!!!在tasks.json中的任务类型如果是"shell",则这里的shell选择,关系到对应shell命令的使用适配与否。
  "terminal.integrated.defaultProfile.windows": "Command Prompt", //You can also choose from the following three shells:"PowerShell" or "Git Bash" or "Windows PowerShell"
  "terminal.explorerKind": "integrated",
  /****************************VSCode的CMake默认构建生成器为Ninja******************************/
  /******************************************************************************************/
  /******************************************************************************************/
  /******************************************************************************************/
  // "makefile.makePath": "D:/Software/embedded_dev_tools/xpack-ninja-build-1.12.1-1/bin/ninja.exe",
  // "cmake.generator": "Ninja",
  /******************************************************************************************/
  /******************************************************************************************/
  /****************************VSCode的CMake默认构建生成器为Ninja******************************/
  // "makefile.makePath": "D:/Software/embedded_dev_tools/make/bin/make.exe",
  // "cmake.generator": "Unix Makefiles",
  //*************************************************************************//
  "cmake.statusbar.advanced": {
    "debug": {
      "visibility": "visible"
    },
    "launch": {
      "visibility": "visible"
    },
    "build": {
      "visibility": "visible"
    },
    "buildTarget": {
      "visibility": "visible"
    },
  },
  "MicroPython.executeButton": [
    {
      "text": "▶",
      "tooltip": "运行",
      "alignment": "left",
      "command": "extension.executeFile",
      "priority": 3.5
    }
  ],
  "MicroPython.syncButton": [
    {
      "text": "$(sync)",
      "tooltip": "同步",
      "alignment": "left",
      "command": "extension.execute",
      "priority": 4
    }
  ],
  "files.associations": {
    "stdio.h": "c",
    "stdlib.h": "c"
  }
}

c_cpp_properties.json:

json 复制代码
{
  "configurations": [
    {
      "name": "Pico-RP2040_ARM_GCC",
      "includePath": [
        "${workspaceFolder}/**"
        // "${env:PICO_SDK_PATH}/**"
      ],
      "defines": [
        "__GNUC__"
      ],
      "compilerPath": "D:/Software/embedded_dev_tools/xpack-arm-none-eabi-gcc-13.3.1-1.1/bin/arm-none-eabi-gcc.exe",
      "compileCommands": "${workspaceFolder}/build/compile_commands.json",
      //这一配置在目前所搭建的环境下没用,但是如果你使用的是SDK,库和驱动文件与项目工程不在一个文件夹中,这一步就很有用了,它能让你在当前项目就能向库代码跳转。
      "cStandard": "gnu17",
      "cppStandard": "gnu++14",
      "intelliSenseMode": "gcc-arm",
      "configurationProvider": "ms-vscode.cmake-tools"
    }
  ],
  "version": 4
}

tasks.json:

json 复制代码
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "CMake configure",
            "type": "shell",
            "command": "cmake", //要执行的命令,前提是已经在系统环境变量PATH中安装了CMake
            "args": [
                "-D",
                "CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE", //生成compile_commands.json的文件,该文件是为了让vscode有代码导航、自动补全和语法高亮功能。
                "-G", //配置生成器类型
                "Ninja", //"Unix Makefiles",
                "-B", //配置生成Makefile or Ninja脚本及其相关文件的路径, 使得源码和构建过程文件分开,以便更好地管理项目
                "./build" //这条命令会告诉 CMake 创建一个名为 build 的目录(如果它不存在的话),并在该目录下生成构建文件
                //"-DCMAKE_BUILD_TYPE=Debug", //设置构建类型:Debug,Release,RelWithDebInfo,MinSizeRel
                //"--debug-output", //显示详细的CMake 配置 过程信息
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": "$gcc"
        },
        {
            "label": "CMake build",
            "type": "shell", //直接使用shell的手动输入命令行"cmake --build"
            "command": "cmake",
            "args": [
                "--build", //调用CMake的统一命令在某个文件夹下构建,具有跨平台特性。不论后端构建工具是 Make or Ninja
                "${workspaceFolder}/build", //生成可执行文件.elf和进制文件.hex/.bin的路径
                "--config Debug",
                "--target ${workspaceRootFolderName}.elf", //"all", //允许指定单一或多个目标来构建,而不是构建整个项目。这可以显著减少构建时间
                "--parallel 5" //使用-j 5是等效的
                // "--verbose" //让底层的构建工具(如 Make 或 Ninja)输出详细的编译命令,为CMake通用命令,可简写为 -v
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "dependsOn": [
                "CMake configure"
            ],
            "problemMatcher": [
                "$gcc"
            ]
        },
        {
            "type": "shell",
            "label": "CMake cleanRebuild",
            "dependsOrder": "sequence",
            "dependsOn": [
                "CMake clean",
                "CMake build"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": [
                "$gcc"
            ]
        },
        {
            "label": "CMake clean",
            "type": "shell",
            // "command": "Remove-Item -Path ./build/* -Recurse", //powershell(win10系统及以上)可调用
            "command": "rm -rf ./build/*", //cmd(win10系统以下) 或 git bash 都可调用    rm -r -f,Linux用法
            //cmd下:del /q /s build或erase /q /s build仅删除文件,不删除文件夹;rmdir /q /s build或rd /q /s build删除文件夹, /s 递归删除非空的目录及其内容
            "args": [],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": [
                "$gcc"
            ]
        },
        {
            "label": "flash with CMSIS-DAP-Link",
            "type": "shell",
            "command": "openocd",
            "args": [
                "-f",
                "interface/cmsis-dap.cfg",
                "-f",
                "target/rp2040-v1.cfg",
                "-c",
                "adapter speed 2000",
                "-c",
                "program build/${workspaceRootFolderName}.elf verify reset exit"
            ],
            "group": "build",
            "problemMatcher": [
                "$gcc"
            ],
            "dependsOn": [ //任务依赖
                "CMake build"
            ]
        },
        {
            "label": "flash with J-Link",
            "type": "shell",
            "command": "openocd",
            "args": [
                "-f",
                "interface/jlink-swd.cfg",
                "-f",
                "target/rp2040-v1.cfg",
                "-c",
                "adapter speed 1000",
                "-c",
                "program build/${workspaceRootFolderName}.elf verify reset exit"
            ],
            "group": "build",
            "problemMatcher": [
                "$gcc"
            ],
            "dependsOn": [ //任务依赖
                "CMake build"
            ]
        }
    ]
}

launch.json:

json 复制代码
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Pico-rp2040 Debug with cmsis-dap-link",
      "cwd": "${workspaceRoot}",
      "executable": "${command:cmake.launchTargetPath}",
      "request": "launch",
      "type": "cortex-debug",
      "servertype": "openocd",
      "gdbPath": "gdb-multiarch",
      "device": "RP2040",
      "configFiles": [
        "interface/cmsis-dap.cfg",
        "target/rp2040.cfg"
      ],
      "svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd",
      "openOCDLaunchCommands": [
        "adapter speed 5000"
      ],
      "postRestartCommands": [
        "break main",
        "continue"
      ],
      "runToEntryPoint": "main",
      "showDevDebugOutput": "none",
      "preLaunchTask": "flash with CMSIS-DAP-Link" //每次调试之前会先下载程序
    },
    {
      "name": "Pico-rp2040 Debug with j-link",
      "cwd": "${workspaceRoot}",
      "executable": "${command:cmake.launchTargetPath}",
      "request": "launch",
      "type": "cortex-debug",
      "servertype": "openocd",
      "gdbPath": "gdb-multiarch",
      "device": "RP2040",
      "configFiles": [
        "interface/jlink-swd.cfg",
        "target/rp2040.cfg"
      ],
      "svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd",
      "openOCDLaunchCommands": [
        "adapter speed 5000"
      ],
      "postRestartCommands": [
        "break main",
        "continue"
      ],
      "runToEntryPoint": "main",
      "showDevDebugTimestamps": true,
      "showDevDebugOutput": "none",
      "preLaunchTask": "flash with J-Link" //每次调试之前会先下载程序
    }
  ]
}

CMakeLists.txt:

python 复制代码
# Raspberry pi Pico Cmake工程

cmake_minimum_required(VERSION 3.20)

set(CMAKE_SIZE arm-none-eabi-size)

set(CMAKE_C_STANDARD 17)
set(CMAKE_CXX_STANDARD 14)

# 设置pico_sdk
set(PICO_SDK_PATH "D:/Software/embedded_dev_tools/Pico_SDK_v1.5.1/pico-sdk")

# 导入pico_sdk,必须放在工程之前
include(pico_sdk_import.cmake)

# 设置工程,名称可以根据需要设置
# project : 定义工程名称,并可以指定工程可支持的语言,语法格式为 project(项目域名 语言)
# .HEX  .bin  .elf  .map的文件名设置
project(rp2040_blink C CXX ASM)


#设置代码调试等级
set(CMAKE_BUILD_TYPE "Debug")
#   +---------------+---------------+--------------+--------------+----------+
#   |               |               | optimization | assert works | stripped |
#   +---------------+---------------+--------------+--------------+----------|
#   |               |     None      |              |              |          |
#   |    -g         |     Debug     |     no       |     yes      |    no    |
#   |-O3 -DNDEBUG   |    Release    |    full      |      no      |   yes    |
#   |-O2 -g -DNDEBUG| RelWithDebInfo|    good      |      no      |    no    |
#   |-Os -DNDEBUG   |   MinSizeRel  |    size      |      no      |   yes    |
#   +---------------+---------------+--------------+--------------+----------+
# Release 进行优化,提高速度 -排除调试信息
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
    message(VERBOSE "Maximum optimization for speed")
    add_compile_options(-Ofast)
# RelWithDebInfo 进行优化,提高速度 -包含调试信息
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
    message(VERBOSE "Maximum optimization for speed, debug info included")
    add_compile_options(-Ofast -g)
# MinSizeRel 优化二进制大小 -排除调试信息
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
    message(VERBOSE "Maximum optimization for size")
    add_compile_options(-Os)
# Debug 禁用优化 -包含调试信息
else ()
    message(VERBOSE "Minimal optimization, debug info included")
    add_compile_options(-Og -g)
endif ()


# 初始化SDK
pico_sdk_init()

#添加头文件路径,即.h文件
include_directories(
                    ./USER/Inc
                    )

file(GLOB_RECURSE SOURCES
     ./USER/Src/*.c
    )

add_link_options(-Wl,--print-memory-usage -Wl,--gc-sections -flto)

# 添加可执行文件
add_executable(${PROJECT_NAME} ${SOURCES})

# 设置工程信息
pico_set_program_name(${PROJECT_NAME} "${PROJECT_NAME}")
pico_set_program_version(${PROJECT_NAME} "0.1")

# 默认打开串口
pico_enable_stdio_uart(${PROJECT_NAME} 0)# 是否使能串口0作为标准输出
pico_enable_stdio_usb(${PROJECT_NAME} 1)# 是否使能USB CDC(使能-------→则关闭内建的USB-CDC支持:提供一个USB虚拟的串口以及JTAG调试器)

# 添加链接标准库
target_link_libraries(${PROJECT_NAME} pico_stdlib)

# Print executable size
add_custom_command(TARGET "${PROJECT_NAME}" POST_BUILD
        # COMMENT "Invoking: Cross ARM GNU Print Size"
        COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}.elf
        )

# 除 ELF 文件外, 生成 map/bin/hex/uf2 文件
pico_add_extra_outputs(${PROJECT_NAME})

.vscode目录的launch.json参考下载的pico-examples例程包,路径如下:\pico-examples\pico-examples\ide\vscode

下载可能遇到的问题:

cmsis-dap-link 方式下载

用的下载器不支持rp2040该款MCU,笔者一开始用的下图这款的PWLINK2 Lite,询问技术人员发现不支持rp2040。

后面笔者换到了下图这款WCH沁恒的WCH-LinkE,这款适用于带有SWD/JTAG接口的ARM芯片在线调试和下载,而rp2040为双核 Arm Cortex-M0 +的MCU。

②修改openocd烧录的目标文件rp2040.cfg

参考这篇文章:合宙RP2040开发板在Windows上使用C++技术栈的调试

相关推荐
Waltt_Qiope3 小时前
关于使用cursor tunnel链接vscode(避免1006 issue的做法)
ide·vscode·issue
Charlene Fung4 小时前
vs code远程自动登录服务器,无需手动输入密码的终极方案(windows版)
运维·服务器·vscode·ssh
旷世奇才李先生5 小时前
PyCharm 安装使用教程
ide·python·pycharm
Imagine Miracle6 小时前
Ubuntu for ARM 更换为阿里云镜像源
arm开发·ubuntu·阿里云
wwwlyj1233216 小时前
arm 精准总线错误与非精准总线错误
arm开发
hero_heart14 小时前
vscode中c_cpp_properities.cpp文件生成和作用
ide·vscode·编辑器
Naiva15 小时前
【小技巧】Python+PyCharm IDE 配置解释器出错,环境配置不完整或不兼容。(小智AI、MCP、聚合数据、实时新闻查询、NBA赛事查询)
ide·python·pycharm
花王江不语17 小时前
android studio 配置硬件加速 haxm
android·ide·android studio
喝可乐的布偶猫18 小时前
韩顺平之第九章综合练习-----------房屋出租管理系统
java·开发语言·ide·eclipse