当前位置: 首页 > news >正文

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

settings.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:

{"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:

{"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:

{// 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:

# 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++技术栈的调试

http://www.dtcms.com/a/268133.html

相关文章:

  • C 语言指针与作用域详解
  • 百度文心大模型 4.5 开源深度测评:技术架构、部署实战与生态协同全解析
  • Gitee DevOps:全流程自动化的效率革命
  • DeepSORT算法流程详解
  • 基于Flask+Jinja2的快捷教务系统(后端链接到新版正方教务系统)
  • k8s-服务发布基础
  • 数据结构实验习题
  • 定时器和守护线程
  • 【Guava】1.0.设计虚拟机的方向
  • tensorflow武林志第二卷第九章:玄功九转
  • 广东省省考备考(第四十天7.6)——资料分析(第八节课)
  • Python Bcrypt详解:从原理到实战的安全密码存储方案
  • 【C++】C++四种类型转换操作符详解
  • 【Note】《Kafka: The Definitive Guide》第一章:Meet Kafka
  • LeetCode--41.缺失的第一个正数
  • get: ()=>state 和get: ()=>{state}
  • Java 集合
  • ClickHouse 全生命周期性能优化
  • Java 大视界 -- Java 大数据机器学习模型在金融衍生品创新设计与风险评估中的应用(335)
  • 人工智能在软件开发领域的应用优势劣分析及应对策略
  • js event.preventDefault()的作用
  • Web前端开发-HTML、CSS
  • 【从0-1的CSS】第3篇:盒子模型与弹性布局
  • Application的onLowMemory从Android API 34开始系统不再触发,从API 35开始废弃
  • 网安系列【7】之文件上传漏洞
  • 云服务器环境配置——安装Tomcat
  • Redis集群部署指南:高可用与分布式实践
  • 网关多次读取流问题
  • 老树新花语新颜,汉字筑渠话情流——与ai助手闲聊成诗(智普清言)
  • 程序员在线接单