0%

树莓派RP2040开发环境配置集合版(基于Raspberry Pico)

这篇文章是一个测试了多种方法开发RP2040并总结的集合,如果只关心一种方法,我推荐阅读:[RP2040配置VSCODE开发环境 —— 一劳永逸版](RP2040配置VSCODE开发环境 —— 一劳永逸版 | 加载中… (alwaysmy.github.io))。

起初我以为RP2040作为一款树莓派出品的单片机会有很成熟的开发方案,等到我过了两年才开始决定找一下的时候,发现网上的配置方法大多数是照着官方给的方法一抄,完全没有解释里面各个部分需要做什么的原因,以及有什么过程需要了解学习,甚至没有说这个配置方案就是官方入门手册.Chapter 7中给出的方法。

(我最开始看的手册还没更新树莓派以外平台的写法,所以蒙圈了好久,以为这些环境配置方法是他们经验丰富才能总结出来的)。

这些网上的博客基本上都是照着文档来配置,好点的会给几个填坑的说明,然后到了调试配置阶段都是直接默认使用官方给出的picoprobe调试器的配置方法或者压根不走调试,实在是让人看了捉急,难道你们开发单片机都不用开Debug吗?

因此就有了这篇文章。

一些基础前置内容

pico指的是搭载了rp2040单片机的官方出品的PCBA,不过市面上卖的核心开发板基本上兼容官方设计,因此下面文章中不区分pico字样和rp2040字样。

调试使用的Debugger

  • 官方版本 他们做了一个特殊的daplink,叫做picoprobe, 就是直接用pico实现了一个swd的功能,相比ARM开源的DAP更简陋。在大部分博客中以及现在的官方入门文档中,都指出这个picoprobe所使用的openOCD需要raspberry分支下的openocd才能用,同样,配置文件也是专用的。

    在Windows下如果用picoprobe需要使用Zadig为其安装驱动为libusb-win32。(不知道现在还是不是这样,网上有的教程还提到了需要复制一个dll文件,但是我看现在的openocd.exe目录下已经包含了这个dll)

这意味这个版本picoprobe的通用性比较差,因此一般来说没有必要使用这个。

  • 标准CMSIS-DAP 标准的cmsis-dap v2是部分可用的,实测v1的似乎都不能连接上多核,单核似乎也不行。 手上有一个WCH-Link实测是可用的。

        另外也可以使用pico-debug这个固件加载自调试,这个固件同样移植自ARM开源的CMSIS-DAP.

  • Jlink 有官方支持,但是需要氪金购买新版,我没有,所以下面不会说。         

配合Debugger使用的上位机

除了Jlink有官方上位机,PicoProbe和CMSIS-DAP都需要有上位机支持。

PicoProbe使用的是raspberry官方修改的openocd分支,需要单独下载编译。CMSIS-DAP可以使用通用版OpenOCD,也可以使用Pyocd.

尽管PicoProbe和OpenOCD是官方文档提到的方法,但是openocd的bug较多,我不推荐使用,如果使用了发现存在bug,最好办法是更新版本,一般问题会解决。0.12 rc1以及之前版本存在bug。

Openocd下载来源两个:

但是第二个通常版本相比较旧,我在写这篇文章的时候使用是存在bug的。

而pyocd只需要使用pip安装即可。

pip install pyocd

就这么简单,相比来说pyocd的文档也更全面。具体使用放到后面介绍。

下载固件的方法

UF2固件加载

RP2040内建Bootloader支持插上电脑USB拖入固件烧录。

在RP2040运行前按住boot按键然后运行就会让rp2040进入Boot模式。

最简单的方法是按住按键然后上电就进入boot模式了,然后电脑上就会出现一个叫做RP2-PI的硬盘驱动器,右键UF2文件,点发送到树莓派对应的驱动器。 (btw.如果是win11强烈建议改成win10右键菜单)。

如果不希望重新拔插上电,可以拉低Run引脚后按Boot,然后释放Run引脚,不过官方Pico板并没有给Run引脚添加一个按键。

除此之外,也可以通过代码实现实现跳转bootrom进入bootloader模式,在文章(TODO)中解释。 UF2(USB Flashing Format (UF2))格式参考: microsoft/uf2: UF2 file format specification (github.com)

加载ELF或BIN文件

除了通过UF2下载固件,还有传统的SWD烧录的方法,将在环境配置介绍之后的第四章介绍。 后文中可能会提前说到自调试固件这个词,这里提前说一下,是一个用RP2040的一个核作为仿真器来调试另外一个核心的项目。来源:majbthrd/pico-debug: virtual debug pod for RP2040 “Raspberry Pi Pico” with no added hardware (github.com)

环境配置的解释

本文都是默认我们配置了环境变量来说的,如果有的地方没有提到什么程序加入了环境变量就用了,那就是忘了说,除了说了可以不加。当然这个也很好理解,遇到需要用到某个程序但是没有写绝对路径,那么基本上就加环境变量就好了。

这篇文章说了些什么

写这篇文章的时候,我很想知道用什么环境开发RP2040更加顺手,为了具体试一试,所以我找了好几个方案全都列举出来了。

本文主要包含下面几种发开方案:

  • MicroPython
  • PlatformIO的方法
  • 基于第三方IDE的方法
  • 基于官方C-SDk给出的cmake的配置方法和后续的导入IDE的配置方法。

除了最后一种,前面三种基本算是算是开箱即用。

不过如果对于cmake不熟悉,了解一下官方给出的方法还是不错的,已经熟悉的话就很容易明白了。 其中,最后一个方法也就是基于官方给出的C-SDK自行配置,本文中的使用的其中的一种方法是配置VSCODE作为IDE,但是也写了其他的IDE用来作为开发环境的方法。

下面就开始一个一个来说了。

MicroPython环境使用

这个方法是最简单的,初始配置对于Windows和Linux都很友好,而且使用Python来开发。

优势是: 开发相对容易,导入包很简单,基本功能都能用,PIO一样可以支持。 缺点是: micropython不能支持多核操作。 很多函数功能没有适配,例如DMA和PIO还需要手搓寄存器,这个工具是门槛低上限也低。 所以这里仅仅简单说一下使用方法作为记录:

  1. Raspberry Pi Documentation - Microcontrollers,选择Getting Start with MicroPython下载uf2固件后烧录到rp2040上,打开设备管理器会发现多了一个COM端口(就是串口)。

  2. 下载Thonny IDE, 打开Thonny,右上角点击切换至一般模式,然后点击视图,勾选上这三个:Shell、变量、文件,当然还有别的,这几个最常用。

  3. 配置Thonny:工具-设置-解释器-选择Raspberry Pi Pico的解释器,然后选择串口端口,这个端口可以看刚刚设备管理器多出来的那个端口就是的。也可另外用别的工具直接连板子上的串口,波特率是115200。

  4. 进入shell直接依次执行python语句测试

from machine import Pin
led = Pin(25, Pin.OUT)
led.value(1)
  1. 写python文件

在Thonny里面编辑文本后保存的时候选择保存到pico就行了,开机默认会自动运行main.py ,也就是刚刚保存的文件。

  1. 至于开发,随便找个帖子吧:目前全网最详细的树莓派 Pico入门指南! - 知乎 (zhihu.com) 资料: Raspberry Pi Pico Python SDK Raspberry Pi Documentation - MicroPython

还有一个VSCODE插件可以用在这个上面: Pico-W-Go - Visual Studio Marketplace

PlatformIO环境开发

我感觉这个东西出bug的问题比较大,不过考虑到配置比较简单我还是写一下。

它经常不显示出来主页,不知道为啥给我的感觉就是有点卡。

Arduino框架环境

个人认为,如果不在乎那个arduino框架的资源占用,其实还是这个一个很好的开发平台,对仿真器的支持也还可以。

安装方式:

在PlatformIO的board里面搜rp2040或者rasp,安装对应的平台。

文档: Using the Raspberry Pi Pico SDK (PICO-SDK) — Arduino-Pico 2.6.2 documentation

功能: 支持arudino框架,配置有arduino风格的函数。 因为本身就是基于C-SDK的 , 因此自然也支持在arduino框架下直接使用pico-sdk的函数。

下载调试方法: 这个框架一般会自动选择调试工具,如果要更改就在工程下的ini文件里面添加两行,例如:

upload_protocol = picotool
debug_tool = cmsis-dap

上面的上传和debug参数可以分别改成:

  • cmsis-dap, 这个就是一般的cmsis-dap调试器(现在应该叫做daplink)
  • jlink
  • picotool ,就是UF2文件的上传工具
  • raspberrypi-swd ,就是用picoprobe作为调试器。

注释:

  • [ ] 如果手上没有调试器或者不在意使用调试功能,那么点编译后在工程目录下.pio/build下有uf2文件,首次需要手动上传arduino框架的uf2固件,之后后面就可以直接用platformio的上传功能,不用拔电上传了,arduino框架固件内置了进入bootrom的代码,会启动到USB PICOBOOT和大容量储存设备模式。观察到确实运行时候点上传会进入大容量设备状态,但是实测接着上传不成功。。。我不知道为什么(别的帖子说是可以的).

  • [ ] 如果用openocd调试,点击侧边的调试,有一个pio debug的选项。如上所说支持三种外部debugger,不过我用dap v1的时候也不好使 ,自调试固件也不好使,别人说用官方的picoprobe是可以正常调试的(见参考链接)。实测使用WCH-link可以调试,能正常显示双核。点上传似乎不太好使,要点左边的调试,显示为PIO debug。下图为arduino框架下的调试。

参考链接:Cannot debug Pi Pico with CMSIS-DAP - “CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed” - PlatformIO IDE - PlatformIO Community

基于pico-sdk的裸环境Wiz-IO

Wiz-IO/wizio-pico: Raspberry Pi Pico development platform for PlatformIO (github.com)

个人认为,如果这个方法不是存在一点调试的bug的话,应该是最快最完整的C-SDK的方法。目前调试只支持Windows。

安装方式

  • PIO Home > Platforms > Advanced Installation
  • 粘贴: https://github.com/Wiz-IO/wizio-pico
  • 点击INSTALL

功能

支持原生C-SDK编写方式,所以功能都能支持,没有arduino框架当然也就不能支持UF2文件的自动上传了。

文章当中写着写着下载支持cmsisdap picoprobe uf2三种方式,目前只支持Windows。

下载调试:

下载默认是uf2下载,需要rp2040先手工进入BOOT模式,稍微有点麻烦,可以参考后面的调试方法里面的一键进入BOOT.

如果要调试,在platformio.ini 里面添加对应的方式,比如

upload_protocol = picoprobe
debug_tool = picoprobe

上面的值可以改成:cmsis-dap,picoprobe, uf2

不过我测试的时候感觉我的wch-link就没被调用过,,可能实际上这个框架里面估计也就picoprobe好使,不清楚是不是我的问题。

这个框架附带了picoprobe的固件,picoprobe.uf2 have in tool-pico-openocd folder,看起来作者可能也就写了这么多。

基于第三方IDE配置

下面这几个都很方便,因为他们都提供了集成的SDK下载和模板工程的创建,不需要官方那一套配置,也就是说开箱即用类型,类似于STM32CUBEIDE,CCS这种,当然,肯定不如别的官方对自己产品优化好。

基于VisualGDB的Visual Studio创建工程

先安装visualGDB,这是一个给VS提供的跨平台包,关键词:VisualGDB的基本使用。

然后按照下面的方法,新建工程选模板,下sdk就好。

Developing Raspberry Pi Pico Projects with Visual Studio – VisualGDB Tutorials 但是VisualGDB是收费的,所以告辞,看起来很简单,我没试过,也有人说用起来有Bug.

基于 Segger Embedded Studio

这个软件社区版本免费,支持Jlink, GDB server,其中gdb server可以选 jlink openocd pyocd st-link这几种。实际上有几个版本中自带的Jlink能使用CMSIS-DAP V1(HID) 。

这个软件支持多平台,工程配置很方便。

自带软件芯片仿真,自带少数几个rp2040例程,不过他的例程都是干寄存器,没有引用官方的pico-sdk,pico-sdk的文件是被包含在内的,只是有一些路径没有被包含,示例程序还是没用上SDK的内容。 编译和加载可能是Segger自家技术,速度较快,默认支持printf输出到RTT在窗口上显示。(也可以选semihost,设置-首选项,Code > Library > Library I/O)

对于指定的工程,打开之后按F1会给出一些手册和提示。下面是具体的步骤。

安装SDK

点Tools - Package manager,搜pico,点一下,然后点next,就可以安装好sdk了,不过SDK路径并不会被包含进去。

新建工程

点Project-Add project,选树莓派的第一个pico是官方的板子的,不带pico就是裸片的工程,区别不大。

然后是工程配置:

目标处理器选0或者1,对应核心,

编译器可以选gcc或者segger,

剩下一些配置默认就行,根据需要选

然后编译,debug。

默认没有生成uf2文件,因为需要调用外部工具生成。

工程配置可以修改C/C++的包含路径,工程本身包含了部分pico-sdk的include路径,但是没有完全包含––不知道具体原因是为啥––没有被默认配置到包含路径的的包括hardware_xxx下的外设的库,这个路径对应

....\SEGGER Embedded Studio\v3\packagesRP2040_Pico_BSP\pico-sdk\src\rp2_common

而且这个pico-sdk是不包含第三方库的。可以自己加上去的,没有仔细试过(不知道会不会出现stdlib不兼容的情况,因为pico的c-sdk里面自己定义了个stdlib.h),在对应的solution中添加后,后来新建的工程就会默认继承solution的设置。 不过按照和前面的Cmakelist的路径添加,应该是可以做到这个工程和官方方法的工程代码兼容的方法的)

仿真下载调试

不支持V10以下的Jlink。。。也有的说能支持,但是反正我的Jlink Lite V9显示不支持multi-drop,也有人说需要Jlink v11才行。

参考链接: [SOLVED] RP2040 Support - J-Link/Flasher related - SEGGER - Forum 官方文档指出至少需要v11:

合着来卖配件了,4块钱的单片机配不上这个尊贵的JLink.

但是可以使用具有HID通信的DAPLink,尽管官方表示支持daplink是个错误,但是有几个版本确实能支持。。。

1、在Shell或命令行里面开一个openocd server等待连接(这一步实际上可选,下面解释),如:

openocd -f board/pico-debug.cfg

这里这个配置文件是openocd自带的,其配置实际上调试的是rp2040的core0,也就是调试的是单个核心。

2、配置工程调试选项

工程上右键 - option - debug - debugger- 选gdb server,然后点gdb server选项,选openocd。 点Debug就会启动gdb连接到刚刚开的openocd这个gdb server。

实际上第一步中手动开一个openocd的gdbserver等待的过程可以省掉: 可以勾选工程选项里面debug下面的 GDB Server-auto start gdb server 为yes

然后填写Debug > GDB Server > GDB Server Command Line

openocd.exe -f board/pico-debug.cfg

这个openocd要加入环境变量,或者使用绝对路径。

实测中,单核调试使用自调试固件的单核配置(也就是pico-debug.cfg这个配置),多核使用WCH-link使用标准的配置,都可以正常调试、查看变量寄存器。

如果想调试多核,标准多核的配置为:

openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg

只是如果使用单核的配置的情况下使用外部daplink的时候就不要让它自己启动openocd, 也就是说需要手动启动,不然连接不上,可能是openocd的bug。

同样,命令可以更换为pyocd的命令,命令更为简单,目前没有遇到bug。

只需要使用pip安装好pyocd之后,更换 GDB Server Command Line:

pyocd gdbserver -t RP2040 -f 10000k

注意,这里没有指定调试器UID, 因此需要保持电脑上就只插了一个仿真器,否则可能不能正确打开pyocd的gdbserver

使用pyocd生成调试命令可以参考我写的工具:使用aardio写一个基于pyocd的单片机下载器 | 加载中… (alwaysmy.github.io)

参考

下载链接:SEGGER - The Embedded Experts - Downloads - Embedded Studio

基于RT-Thread Studio

国产软件,评价很高,社区版免费。下载链接

如果不介意用rt-thread的话,那么可以去使用rt-thread studio(因为目前他仅仅支持rtt的工程使用官方给sdk模板)

支持jlink daplink,不过好像都不怎么好使。。

使用要登陆。。。有点蠢,bug也还不少。。安装的时候会出现超长路径导致不能放到比较长的路径里面(我已经关了路径长度限制)

使用方法

  1. 下载SDK, 随便开个窗口或者新建工程点进下载SDK的界面。 对于Pico,只能创建rtt工程,显示三种调试工具可选,点下载程序的小箭头可以改调试下载方式。 gdbserver调用的是pyocd,实测我手上的这个daplink v1不支持,已经测过ok的自dap是v2的也不好使,所以不知道好不好使,,, jlink也是需要jlink支持,我的版本不够。 stlink不可能支持的。。只是显示出来了。

要先点一下调试配置,改一下可执行程序的位置和名称,默认的位置不对。。。点一下搜索项目按钮,选elf那个文件。(目前的版本是这样)

有人使用picoprobe替换驱动为libusb后用来调试(没看见他发调试成功的图啊) 我也没成功过,所以不知道调试行不行。但是考虑到有人用这个写,应该是可以的,但是我自己实属体验不好,所以就只能写这么多了。

参考链接:RT-Thread-在 RT-Thread Studio 中使用树莓派 Pico 开发板RT-Thread问答社区 - RT-Thread

使用Keil MDK

GorgonMeducer/Pico_Template: An MDK template for Raspberry Pi Pico (github.com) 用这个模板,看起来还行,我就不测试了,不喜欢Keil。

使用方法: git clone https://github.com/GorgonMeducer/Pico_Template . git submodule update –init

更多第三方IDE

基本上就是使用CortexM0+的对应文件并正确包含pico-sdk库的文件就可以了,其实后面CMakelist同理。

我看还有人用CrossWorks for ARM,很贵,不多说了。

上面介绍的方法都是基于工程模板的,下面介绍的就是对应pico官方给出的基于Cmakelist的构建方法。

基于官方C-SDK的开发环境搭建

关于CMake和CMakelist这里不再赘述,网上内容很多,先了解一下比较好。

官方文档的方法总结

网上找的方法绝大多数都是基于getting-started-with-pico.pdf这个手册上的方法,最开始这个手册只更新了基于树莓派系统的配置,他是说直接执行setup脚本就行了,后来才更新了其他平台的配置方法。

官方的配置里面很多配置文件有很多问题,比如上面的setup脚本,很可能自己的环境用不了。另外,配置中如果遇到问题,重新git pull或者直接覆盖更新自己之前下载的文件是最有可能能解决问题的方法。

总的来说,建立一个工程需要下载pico-sdk和pico-example(也就是官方例程),还有工程模板生成器(pico-project-generator)来避免自己来配置一个工程重复的部分。

最后需要CMake构建生成对应的makefile并构建,这其中需要对应的c编译器和arm c编译器完成上述过程。

具体过程如下文。

下载必要软件

这里主要是Windows上的方法,Linux上同理,但是安装软件要更简单,只在有配置区别的地方单独指出。目前我的环境是Windows11,不过Win10同理了。

  • CMAKE pico-project-generator生成的工程是基于cmake构建的,因此这里选择安装CMAKE。 安装的时候要勾选添加环境变量for all users。实际上就是系统环境变量。
  • gcc-arm-none-eabi Arm GNU Toolchain ,用于编译ARM可执行文件。这里没啥特殊要求,可以下最新的。安装完了之后需要手动勾选添加到路径,还要检查一下能不能直接在cmd里面使用arm-none-eabi-gcc命令,否则说明他添加的路径有问题,就需要手工改一下(现在的版本应该不存在这个问题)

  • python: pico-project-generator是用python写的,因此需要python,后面pyocd也会用到,所以这里装上最好。 勾选环境变量,解除长路径限制。

  • Git 需要这个工具来从Github下载,虽然不用也可,但是用了更方便。 上面软件的直接到官网下载最新版安装就行了,不用纠结版本要不要旧一点。 当然,用别的Git工具也可以 。

  • 编译工具 对于windows平台,这里有两种选择,一个是安装visual studio,一个是安装其他的编译器实现比如MinGW。 其中,前者的工具为NMake,使用的时候需要先启动vs的工作环境,得到配置好的环境变量(或者直接加载环境变量也可以), 后者的工具为Mingw32-make,配置更简单,只需要把bin目录加到环境变量就行,至于其他没有对比。后面就可以用mingw的mingw32-make来替代vs的Nmake,不需要额外加载环境变量。

下面详细说说编译工具的安装:

前者从微软安装vs的社区版就好了,如果本来就有vs同时没有mingw又懒得再装一个,可以就用VS,不然还是建议使用MinGW

因为如果使用vs的nmake工具的话,后面的很多操作都需要从Visual Studio 2022 Developer Command Prompt这里打开其他的应用程序,使其具有内置的环境环境变量,这样会出现很多麻烦。官方手册里面提供的方法是VS,就感觉他们很随便。。。

VS的安装很简单,勾选C/C++工具一路确定就好了,这里不再赘述。

MinGW的安装如下:

  1. 下载MinGW后安装
  2. 把其安装目录下的bin目录加入环境变量, 需要手工添加,添加到用户变量或者系统变量都行。

下载来源: 目前mingw新的是mingw-w64,下载网址: MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net

点下面的MinGW-W64 GCC-8.1.0标题下面的包,因为如果用在线安装包,压根连不上网,和墙没关系。

选择最新版本(目前是8.1.0)的 x86_64-win32-seh

x86_64-win32-seh这个表示64位pc windows系统 seh错误处理的包(具体怎么选可以搜一下mingw-w64的安装,这里贴个别人的链接,当作记录吧:mingw-w64 threads: posix vs win32 - 简书 (jianshu.com))。

注释:

我尝试直接用电脑上安装的devc++自带的mingw64,发现会编译报错,编译的时候可能会出现类似于'C:/Program' 不是内部或外部命令,也不是可运行的程序这样的问题,似乎并不是路径问题,总之我不太记得了,就不要偷懒还是安装一个最新版吧,这里最终用刚刚下载的新版的mingw-w64,测试OK.

(mingw32下载链接:https://osdn.net/projects/mingw/# 上面是旧版mingw32,2017年就停更了,可能也能用,没试过,放在这里提示不要下错了)

  • 其他构建工具 例如Ninja,我没试过,但是实际应该可行,Cmake是可以生成对应的文件的。

  • 调试或者下载工具

  1. openocd
  2. pyocd

上述二选一即可,推荐pyocd,本文开头已经说明了如何下载安装。

下载例程、SDK、模板生成工具

# 1、下载工程模板生成器
git clone https://github.com/raspberrypi/pico-project-generator.git
# 2、下载pico-sdk
git clone -b master https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk/
# 更新子模块
git submodule update --init
cd ..
# 3、下载官方例程
git clone -b master https://github.com/raspberrypi/pico-examples.git

这里配置更新子模块的时候如果报错,就更新到最新的SDK,因为有的子模块上游更改了。

配置SDK路径

上一步中,下好了pico-sdk,examples,还有generator,把pico-sdk放到自己想要放的位置,然后把其目录加到环境变量里面,名称是PICO_SDK_PATH.

这个环境变量的路径是给配置出来的CMakelist引用的,还有后面的模板生成器也需要配置这个环境变量,配置方法如下:

  1. Windows下面直接搜path,就能找到编辑系统环境变量的选项。

    (其实这里没加也没关系,有别的方法,但是最好加上,因为generator默认用的是环境变量配置)。

  2. 可以使用使用powershell

setx PICO_SDK_PATH "yourpath\pico-sdk" 
yourpath指的是你pico-sdk所在文件夹的路径
  1. 当然也可以临时配置环境变量,但是没必要这样做, 不然每次都要重新导入环境变量: 临时配置的方法:在powershell内执行
$env:PICO_SDK_PATH=pico-sdk的路径

上面这些步骤配置完了之后就可以找个例程编译测试一下了。

Linux下:

export PICO_SDK_PATH=yourpath/pico-sdk

添加这一行到 /etc/profile 即可永久保存,不过也可以在后面CMAKE之前添加到shell即可。

编译例程测试

前面环境配置好了,例程里面的CMakeLists.txt也是已经写好的,所以这里简单来说就是两步:

# 在example的上级目录生成makefile,当然这个命令具体下来有些变化
cmake ..
# 然后对于linux来说执行make即可,Windows则有一点不同
# 执行构建
make

其实编译Example这个步骤不是必须的,但是最好测试一次,同时也演示了不配置IDE怎么编译。

下面详细说一下具体步骤和有什么变化。

使用visual studio的工具链

虽然前面推荐了使用MinGW, 但是如果一定坚持使用visual studio 的工具链,也就是官方手册指出的方法,那么具体步骤如下:

  1. 打开Visual Studio 2022 Developer Command Prompt:

    搜索快捷方式或者WindowsTerminal打开(Windows Terminal点加号旁边的下拉,里面有选项),打开之后会提示:

**********************************************************************

** Visual Studio 2019 Developer Command Prompt v16.7.2
** Copyright (c) 2020 Microsoft Corporation

**********************************************************************

[vcvarsall.bat] Environment initialized for: 'x86_x64'

那么这个环境就是正确打开了。✔

这个表示加载了vs的环境,实际上也可以直接打开命令行之后通过执行`` vcvars64.bat ``这个文件来加载环境,也会给出一样的提示。

总而言是,现在打开了一个命令行或者powershell,继续使用这个加载过环境的命令行界面,然后切换到自己下载的pico-example目录。

如果用cmd,工程切换到别的盘先要换盘符,然后cd进去;powershell可以直接cd带盘符的路径进去.
  1. 然后执行下面命令:
# 现在打开这个shell的位置是pico-example这个文件下下面
mkdir build
cd build
cmake .. -G "NMake Makefiles"

这表示:

  • 新建一个build文件夹用于存放等会构建出来的内容。
  • 进入build目录并在build目录内从pico-example(也就是相对build的上层目录)执行cmake,参数-G "NMake Makefiles"用于生成适用于Nmake的makefile.

这一步,如果前面正确配置了PICO_SDK_PATH这个环境变量,或者已经导入这个环境变量,并安装了arm-none-eabi-gcc.exe且已经加入到PATH,这一步就能正确执行不会报错。

  1. 上面这一步在build目录中生成了所有工程的makefile,不用全部编译,进入build目录,找到一个例程例如blink 进入目录继续执行(目前命令行执行位置已经在build文件夹下了):
cd blink
nmake

这时候看编译信息,可以看到正常生成的信息。

现在进入build/blink,可以找到一个blink.uf2的文件,拿出开发板,按住BOOT按键插到电脑的USB上,右键xxx.uf2, 选择发送到RPI-RP2这个驱动器,发送完会自动运行。

对于pico-example,也可以进入example下的build目录后执行make(对应nmake或者mingw32-make)后直接编译全部例程,但是这样耗时比较长,没有必要这样做。

这里注意,这里的命令行操作全程没有离开最开始打开的vs的prompt。

使用MinGW工具链

现在,来到了我推荐的环节,不要管那个什么鸟VS了。直接使用MinGW来编译。

现在你打开了pico-example文件夹,在此处打开命令行,然后执行

mkdir build
cd build
cmake .. -G "MinGW Makefiles"
# 切到blink生成的目录中
cd blink
mingw32-make

有没有发现特别简单?我也不用费劲解释为什么VS必须要打开环境才能用了,更何况后面还可能需要用其他的编辑器配合。

如果你不幸之前已经使用cmake生成了Nmake的makefile了,再想要换成mingw32-make,这时候直接使用 cmake -G "MinGW32 Makefiles" 生成makefile的话,会报错之前使用的不符合现在的配置,与之前的cmake generator不符,需要将build下的cmakecache文件删掉,再指定MinGW Makefiles.(也可以使用cmake-gui.exe直接手动切换)。不过实际操作用generator生成模板的时候可能有好几个cmakecache.txt都要删除,不然还是会报错。所以建议一开始就搞好。

解释一下上面的语句

这里cmake是用于生成make构建工具对应的makefile。-G后面的参数用来指定工具,也可以用来生成IDE对应的工程文件。

使用cmake --help可以看到很多指令参数,里面有各种generator的名称,注意大小写,例如:

Borland Makefiles            = Generates Borland makefiles.
NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
mingw32-make.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Ninja Multi-Config = Generates build-<Config>.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.

比如也有人用Ninja,但是那需要ninja的构建文件,同mingw步骤。

以上就是标准的例程配置方法,现在我们可以考虑新建一个属于自己的工程了。

生成自己的工程并编译

你完全可以自己写cmakelists.txt,但是既然官方提供了模板生成器,这里就不去深究了。

所以这一步就是使用pico-project-generator生成工程模板,下文中把pico-project-generator称作生成器。

p.s. 这里提前说一下,如果生成器启动有问题,首先更新pico-project-generator到最新的python源文件;有的早期教程中指出是python解释器的问题,但是现在生成器在windows下面没有问题,能正常使用,不需要改动python的源码等步骤(是新版的python没有这个问题,3.10)。

进入pico-project-generator目录下,右键打开shell,运行:

python ./pico_project.py --gui
#或者
python ./pico_project.py -g

这样就可以通过图形界面的方式来配置自己的新建工程。这时候生成的工程会和这个py文件在同一个目录下,所以这里建议找到pico_project.py 647行的

self.locationName.set(os.path.abspath(os.getcwd()), 修改改成:

self.locationName.set(os.path.abspath(os.path.join(os.getcwd(), "..")))

这样默认路径是pico_project.py的上层目录而不是与生成器的python文件在同级目录。这样就可以避免工程的生成位置位于pico-project-generator文件夹中。。。。。

然后建议去掉开头那个logo,,,因为对于高分屏幕话,python的TK-GUI会出现不合适的缩放会导致最后点不到确定按钮。。。。。就是下面这两行。(也可以通过选择你使用的python.exe,右键更换高DPI兼容模式防止出现主界面超大的情况)

self.logo = tk.PhotoImage(file=GetFilePath("logo_alpha.gif"))
logowidget = ttk.Label(mainFrame, image=self.logo, borderwidth=0, relief="solid").grid(row=0,column=0, columnspan=5, pady=10)

这样就打开了生成器,然后按照需要勾选内容, 如下:

这样生成器就会根据指定的参数和默认的参数来生成工程需要的cmakelist和其他文件,其中指定参数至少需要指定PICO_SDK_PATH和把armgcc的bin目录加入环境变量,否则生成器会报错,而其他的参数可以使用默认值。

生成器的作用是复制需要的文件和生成对应的cmakelist,同时自动执行cmake -G 'xxxmake Makefile'. (个人认为其实这个没有必要每次都执行,后面使用ide的时候也会配置cmake的生成参数的,不过生成器没直接提供不执行cmake -G的方法)

具体可以看raspberrypi/pico-project-generator: Tool to automatically generate a Pico C SDK Project (github.com)项目的readme,或者在命令下加上 –help来查看帮助。生成器本身也可以只在命令环境下执行,看需要自由发挥了。

p.s.这里得注意,默认情况下,在这个生成器代码中mingw的优先级高于vs,所以配置了两者都有的话,生成器优先生成基于mingw的工程,当然了,只是cmake -G的参数不同,可以改也可以自己切换。

注意,在前面配置的编译工具是使用VS的情况下 :

这里如果在生成器中勾选Run build afer generation,那么打开生成器的步骤变化为: 先进入Visual Studio 2022 Developer Command Prompt的环境,然后在这个命令行里面执行python命令来打开打开这个生成器,不然没有对应的环境来执行build。 不过可以选择不勾选这个选项来避免这一步。

现在你已经得到自己的项目模板了,下一步是编写代码并编译。

为了简单一点,假设这里只有一个包含main函数的c文件,默认也是生成这个,进入工程目录下,只有一个 工程名.c 文件,main函数就在里面。

这时候只有这一个.c文件,也就是cmakelist不需要改动,现在进入工程目录下的build目录,如果没有就新建一个,然后手工编译验证的步骤和上面编译例程一样,下面重复一次:

如果是使用VS

那么直接从Visual Studio 2022 Developer Command Prompt进入工程下build目录,执行nmake就行了。

如果添加了其他的源文件,就修改cmakelist.txt , 然后重新执行cmake -G “NMake Makefiles”,然后nmake就好.

是MinGW的情况

正如前面例程编译的情况一样简单,

直接打开生成器生成工程,然后直接在工程目录内的build目录下执行mingw32-make 就可以编译了,需要更新makefile的话就是执行cmake -G "MinGW Makefiles"

这时候,由于在Cmakelists.txt中默认配置打开了生成UF2文件,除了ELF文件,编译后生成的uf2,都在工程下build目录里面。

以上,就是标准的工程创建和配置流程。刚刚使用例程的时候已经知道怎么下载UF2了,所以单片机已经可以跑起来自己的程序了。

现在剩下最后一个问题,如何调试?

至于cmakelist.txt怎么用,参考文档xxxxx()TODO,cmake的官方文档也很坑就是了。

p.s 插一句,官方的生成器有很多毛病,不过在这一步不影响,下一章中配置vscode的时候我再介绍。

调试方法

这一部分单独拿出来做一个大标题,因为要说的内容比较基础,基本上后面能用上。

调试的硬件连接

正如前面所说,你需要一个具有SWD接口的ARM Debugger,在本文的开头已经说了有哪些是测试没有问题的。 连线不用介绍了,由于官方Pico板子的Debug插座没有供电,因此需要自己接上Pico的供电或者接到排针上,其实不算方便。。。

但是其实还有一个更简单的方法,这里介绍两种方法,这里先介绍这个简单方法。

自调试

由于RP2040具有双核,有一位老哥开发了一个固件,可以让DAP-Link的固件跑在另外一个核心,程序运行于RAM中,这个核心可以调试另外一个核心,因此只需要插上开发板就可以调试了。

优点:不用说,只需要一根USB线就能调试了。

适用范围:单核开发,不需要调试USB的情况下可以使用,且内存没占满。

缺点:

  • 占用USB,占用一个核心。不过实际上,如果USB的功能最后再加进去,也可以下载进去,需要开发另外一个核心同理,只是不能调试了。同样,由于USB占用了,所以PLL_USB不能调整,(本来PLL_USB也就是固定48Mhz的吧),使用了PLL_USB的外设自然也不能调整时钟。

  • GIMMECACHE only: SRAM 0x2003C000 to 0x2003FFFF must not be used by user code),代价是占用16k内存。有两个固件,如果用另外一个固件就会占用flash cache。

步骤: 使用USB下载 pico-debug-gimmecache.uf2 固件到rp2040,不下电,然后这里就得到了一个DAPLink了。

外部调试器

  1. 买一个rp2040当做一个picoprobe
  2. 其他的daplink或者jlink

前面说过了,picoprobe需要openocd专用配置,不过pyocd似乎可以直接支持。

仍然优选后者,实测pyocd速度也会更快一点。 没有什么特殊的,连上线就好了。

p.s.在旧版的pico-sdk中我曾经遇到过使用外部调试器的时候出现速度奇慢无比,在sleep_ms更是直接卡死的问题,经过测试,新版的pico-sdk似乎修复了这个问题.

下面介绍调试软件使用。

手工调试方法(GDB使用)

参考资料:getting-started-with-pico.pdf 5.3章节 第六节

这一部分不是必要,但是如果了解了,对于这一堆东西会有更好的理解。 在上一步中,获得了一个ELF文件,也就是可执行文件,现在要做两件事:

  1. 加载这个文件到单片机中
  2. 加载之后还能调试

其实如果已经有嵌入式开发的经验,这里就很好理解,我们需要一个gdb来调试,而需要有一个工具来启动一个gdbsever.

好了现在回到了最开头说的,Debugger的上位机,官方教程给出的方法是使用OpenOCD来作为调试上位机,这里也先介绍一下,然后介绍pyocd的方法。

使用openocd打开GDB server

  1. 添加openocd.exe到环境变量

  2. 执行下述命令:

    openocd -f board/pico-debug.cfg

    这时候回显会提示:

Warn : rp2040-core0.cfg configuration file is deprecated and will be removed in the next release. Use following parameters instead: -c 'set USE_CORE 0' -f target/rp2040.cfg

大致解释一下,这个pico-debug.cfg实际上内容就是

source [find interface/cmsis-dap.cfg]
adapter speed 4000
set CHIPNAME rp2040
source [find target/rp2040-core0.cfg]

因此最上面这个命令等效于:

openocd -f interface/cmsis-dap.cfg -f target/rp2040-core0.cfg -c  'adapter speed 4000' -c 'set CHIPNAME rp2040'

按照提示,下面的方法会得到一样效果(-c 'set USE_CORE 0'要放中间):

openocd -f interface/cmsis-dap.cfg -c 'set USE_CORE 0'-f target/rp2040.cfg  -c 'adapter speed 4000' -c 'set CHIPNAME rp2040' 
不过实际上,openocd可能有bug,上面两个命令可能有时候会出现不一样的结果,一个好用一个不好用。所以继续看下面。

总而言之,这一步用openocd打开了一个gdbserver.

使用pyocd打开GDBserver

pyocd gdbserver -t RP2040 -f 10000k
# 指定目标RP2040 ,指定速度10M,希望能加载快一些。

现在已经打开了pyocd内置的gdbserver. 相比使用openocd,这个参数超级简单!!!,有更多更简单的参数配置,如果有需要在命令行中调试,可以参考我写的使用aardio写一个基于pyocd的单片机下载器 | 加载中… (alwaysmy.github.io) 利用这个工具配置命令。

好了,现在不管怎么样,都用一个上位机工具打开了gdbserver连接了目标单片机。下面要进行调试了。

GDB调试使用例子

上一步中打开了一个gdbserver, 不要关闭那个命令行界面,它会监听端口等待连接。另外开一个terminal, 然后需要attach gdb to the server.

假设前面已经编译得到了picoboard_blinky.elf这个固件,在固件同级目录下打开终端,然后

  1. 执行

    # linux下输入:
    gdb-multiarch picoboard_blinky.elf
    # 在Windows下输入:
    arm-none-eabi-gdb.exe picoboard_blinky.elf

吐个槽,manjaro还需要借arch的包安装gdb-multiarch

这时候另外一个等待的命令行就可以看到连接信息。这边连接之后,命令行会变成 (gdb)开头,这是自带的开头,不用自己输入。

  1. 然后连接gdb上去。 输入

    target remote localhost:3333 
    # 或者
    target remote :3333
    # 或者
    target extended-remote :3333

    同理,也可以远程调试,比如 target remote 192.168.31.16:3333 当然,远程连接的时候要先检测对应端口有没有被防火墙拦。 观察到的效果是:

(gdb) target remote localhost:3333 
  1. 加载 picoboard_blinky.elf 到 flash:
(gdb) load
  1. 执行下面命令开始运行程序:
(gdb) monitor reset init
(gdb) continue
  1. 如果需要下断点,提前使用命令下好然后continue,也可以在编译之前时候就下好断点,这里演示了在main函数处添加一个breakpoint:
(gdb) monitor reset init
(gdb) b main # 在main函数添加一个断点
(gdb) continue

如果提前配置好了断点,程序会运行到断点的时候停止,然后执行continue即可。

p.s.连接的时候会提示这个单片机有多少硬件断点,这个是不能超过这个断点量的,不然会出错。 (JLink有自己的软件断点技术,那个另外说)。

  1. 也可以中途使用 file filename.elf 来更换执行文件,更换后用load加载。Ctrl+c来暂停正在运行的程序。

  2. windows下输入exit或者ctrl-d退出gdb调试。

注意使用自调试固件的时候下不要尝试调试带usb的程序,会出bug,因为daplink本身就用了USB, 会导致daplink失效,不过这样依然能把程序通过SWD烧录进去。

官方方法工程配置总结

其实前面说过了,姑且当他首尾呼应吧。

  1. 配置好环境,下好官方sdk和例程还有生成器,配置好环境变量。
  2. 使用生成器生成工程(其实自己写cmakelists或者复制例程里面的cmakelist改一改然后复制必要的文件,自己做成模板是也可以)
  3. 使用make(mingw32-make)或者nmake编译
  4. 编译得到的uf2可以直接使用USB加载到Flash中后经过自带Bootloader启动;编译得到的elf可以使用swd烧录或调试(调试需要之前就编译参数指定为debug),bin文件可以直接烧录到flash。
  5. 注意工程路径最好不要有中文。

配置自己的IDE

这一步基于上一步的C-SDK开发环境来完成,而不是前面说的已经集成模板配置完全的那些IDE。 上一步中,直接打开文件夹里面文件编辑和编译,配置文件也不方便,编译烧录调试更不方便,这些都需要在命令行里面执行。

  1. 首先选的可以是使用CMakelist作为配置的ide,这样直接建立工程就能用而不需要修改配置。比如:

    • QtCreator
    • Netbeans
    • KDevelop Kdevelop 使用CMake作为其主要的项目配置方式。除此之外还支持qmake、makefile
    • codelite
    • Clion

    然而这里先说结论,除了CLion,其他的似乎都没有对嵌入式编程的调试有任何优化,编译很容易,但是调试很难配置,调试起来也麻烦,下面说。

  2. 其他IDE CMake能够生成一些IDE的工程配置文件(如Visual Studio、CodeBlocks、XCode,Kate,CodeLite),比如Eclipse就有MCU的插件(这也是官方文档给出的方法之一),具体生成参数还是使用cmake –help来查询。

  3. VSCODE这种宇宙第一(?)编辑器 这个方法后面单独说。

一般配置方法

无论哪种方法,如果前面没有配置系统环境变量,那么需要在IDE内配置环境变量,但是如果之前配置过了系统环境变量,或者比如有的IDE集成了armgcc可选,那么这一步就忽略就好了:

PICO_SDK_PATH=D:\MyProgramData\MCU_SDK\pico-sdk

PICO_TOOLCHAIN_PATH=C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin\arm-none-eabi-gcc.exe

把这两条添加到IDE中对应的位置。 (其实这个arm gcc电脑上各个单片机开发的IDE内的都下了好几个了,甚至和platformio下载的共用一个都行)

CLion

使用CMakelist来构建的IDE其中最有名的可能是CLion了,官方start文档也给出了怎么配置基于CLion来配置.

如果需要配置环境,打开Clion后点设置,选 构建、执行、部署 ,CMake,点环境:增加用户环境变量。

在Clion中文件的路径,来源,函数来源都显示很清楚,引用的sdk也能直接显示出来,使用是比较方便的。

他确实方便,直接打开前面步骤中配置好的文件夹为Clion工程,配置一下openocd就可以用了。文件编辑什么的都很方便。

编译比vscode快不少。

具体方法:我的文档【CLion配置rp2040工程】(TODO:未上传,总之很简单。。。)

参考

官方文档:getting-started-with-pico.pdf 10.2. Using CLion CLion 中开发 RaspberryPi Pico | St.Lee的个人站 (stlee.tech)

VScode作为IDE

这一部分实际上我写了个简化版:RP2040配置VSCODE开发环境 —— 一劳永逸版 | 加载中… (alwaysmy.github.io)

通过插件支持完成对嵌入式设备的调试和对Cmake的支持。需要安装CMakeTool cortex-debug,因为配置了cmake或者cortex-debug之后就不用自己写task.json了,还算方便。下面是步骤。

  1. 安装CMake插件

    打开设置,搜索 CMake Tools Configuration

    找到Configure Environment, 添加上面最开始说的两个环境变量(如果已经有配置好的系统或者用户环境变量就可以不用配置)

    找到CMake Tools Configuration - Generator,设置为NMake Makefiles或者MinGW Makefiles. 前者是对应使用VS的编译器,后者是对应使用mingw的编译器。

    打开项目文件夹,第一次打开的时候会提示选择工具包,点一下选择有arm-none-eabi的这一项。选错过了也没关系,就在最下面的底边栏。如下图

  1. 安装插件:cortex-Debug

    打开文件夹之后,按F7是Cmake的build,F5是cortex-debug的调试,当然具体快捷键是什么得看自己vscode的配置,这两种都能编译,后者会编译后启动openocd进行调试。

  2. 创建配置了vscode的工程

    前面使用生成器的时候,勾选IDE Options上的创建vscode project,会自动生成vscode的配置.vscode。不过目前这个生成器的参数是有问题的,后面自己改一下保存成模板,以后自己复制到工程文件夹就行。

p.s.关于这个生成器修改成直接可以用的版本alwaysmy/pico-project-generator_fix

额外事项: 如果前面使用的是vs的工具链而不是mingw,可以直接从Windows terminal里面加号打开Visual Studio 2022 Developer Command Prompt,这个实际上是%comspec% /k "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat

然后输入code打开vscode(vscode安装的时候默认添加到环境变量里面了,所以可以输入code来打开)

说个简单点的启动方法:

找到电脑上的C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat 如果是32位机器就选后缀32的(现在应该不会还有人用32位机器吧),然后打开这个批处理,然后执行code。

所以可以写成脚本:

call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
code
  1. 配置vscode 的Debug

这一部分依然推荐看我的文章RP2040配置VSCODE开发环境 —— 一劳永逸版在附录中添加的修改后的生成器代码,下面就当作是解释了。 这里关键是配置项目文件夹内.vscode下的配置json文件, 这些文件在使用生成器的时候会自动生成,下面分每个文件说一下。 launch.json: 首先是gdb的路径没有适配系统,原来默认gdbPath是gdb-multiarch, 在Windows下要改成 arm-none-eabi-gdb.exe 然后configFiles的内容根据自己用的仿真器修改。

setting.json: 全局设置已经配置好的话,这里可以不修改,也可以把之前的插件设置的全局设置挪到这里来变成工程设置,比如:

//  "cortex-debug.armToolchainPath": "",

// "cortex-debug.openocdPath.windows": "D:\\MyPrograms\\1_DevelopTools\\MCU_Tools\\openocd-04887d3b6-i686-w64-mingw32\\bin\\openocd.exe",

// "cortex-debug.openocdPath": ""

// "cmake.generator": "MinGW Makefiles"

// "cmake.generator": "NMake Makefiles"

同时cmaketool的几个按钮它默认候隐藏了,实际上确实没啥用,可以单独把Build按钮显示出来方便单独编译,就是改成default。

extensions.json: 就是推荐的插件

另外,打开工程后,会提示使用Cmake的智能感知,这会在build下添加一个json用来给c_cpp的智能感知添加一个包含路径的配置,这样就能正确识别SDK的文件路径,所以c_cpp_properties.json没啥用了。

总结: 使用vscode的缺点是启动相当慢,差不多要两分钟,后面每次大概半分钟,应该可以改编译配置吧,没仔细看。 启动调试快捷键是ctrl+shift+D或者F5 ,F7只能编译。 不知道怎么支持RTT输出或者semihost的方法输出打印,所以还是用串口调试吧。

其他IDE配置

下面的配置都不太好用我觉得。。当作记录吧,有的根本没写完。

Eclipse

cmake -G "Eclipse CDT4 - MinGW Makefiles"

参考官方教程,很详细。如果不想单独下个eclipse的话,看看电脑上哪个基于eclipse的IDE不是阉割的可以直接拿来用,不过我没找到。。

Kdevelop:

Download | KDevelop

结论:不好用不会用。

更新有点慢,上次更新还是两年前。。怎么用Windows编译器的文档上次更新还是六年前。。。

然而,这个IDE没啥用,添加文件还是要自己写cmakelist。。。。并没有方便,虽然cmakelist可以图形管理。。 甚至编译后生成的文件都要重新加载才能显示。

debug配置方法:

运行-配置启动-然后更改gdb选项就可以用gdb调试了。

for the target set it to executable and the path to build/your-project-name.elf

Click on the Debug part of the launch configuration and set the debugger executable to /usr/bin/arm-none-eabi-gdb

Set the Run gdb script to the script created in the previous step. Click apply.

脚本内容: target remote localhost:3333 # monitor arm semihosting enable mon reset halt # openocd must be running in the correct dir for the relative paths to work # Flash mon flash write_image erase unlock build/your-project-name.bin 0x08000000 mon verify_image build/your-project-name.bin 0x08000000 mon reset halt # Not sure why but this is needed for KDevelop file build/your-project-name.elf load mon reset halt disconnect target remote localhost:3333

然后: openocd -f interface/stlink.cfg -f board/stm32h7x3i_eval.cfg

下面是参考资料:

KDE/kdev-embedded: Plugin for KDevelop to support the development of embedded systems (github.com)

Use KDevelop with OpenOCD and mbed-os - CodeLV

放弃,我这里会提示elf不是启动文件,上面的教程是kdevlop3.

至于那个插件,是七年前的了。

安装,工程-打开/导入-选择刚刚生成的工程文件夹,点构建就可以构建了。 使用yay -S gdb-multiarch 安装gdb-multiarch

linux下可以直接打开工程并构建,linux下的版本也更新,5.9到了。

Kate

这个编辑器倒是算是正常。

不过仍然是linux下比较正常,windows下有bug,而且没有默认的gdb前端插件,所以没法调试,可能可以写插件来支持。。。

在linux下 使用yay -S gdb-multiarch 安装gdb-multiarch https://aur.archlinux.org/packages/gdb-multiarch 如果报错patch的话就显pamac install patch

点下面的构建,然后 构建插件编写为: cd ./build && make 添加一个cmake构建命令 cmake -G “Kate - Unix Makefiles”//或者Kate - MinGW Makefiles 添加一个构建cmake并编译命令 cmake -G “Kate - Unix Makefiles”&&cd ./build && make

这样就可以完成编译功能了。

调试功能:(只有linux下支持这个插件。。)

配置GDB 点下面的调试 GDB 设置 高级设置 改成远程TCP 自定义初始化脚本:不知道咋搞,应该和上面kdevelop的差不多。

如果不需要这个gdb前端的功能只需要烧录的话,可以使用外部工具的功能执行命令来调用swd烧录elf文件。

Codelite

这个IDE也是可以基于Cmake的,可以直接用cmake -G “CodeLite - MinGW Makefiles“来转一个工程出来。

实测能用,效果还不错,但是配置调试比较麻烦,而且不管调试器连接没连上,都会提示连上了。。。而且似乎压根没法调试。但是确实能连上openocd而且烧录进入了。

利用外部工具执行烧录还是可以的。

同理,cmake的命令配置为 CodeBlocks - MinGW Makefiles

参考:下面这是个stm32的配置https://blog.csdn.net/u012750409/article/details/52516653

Embedded IDE on  vscode(EIDE)

这个插件很强大,同时支持导入eclipse gcc的项目,所以可以通过 cmake -G “Eclipse CDT4 - MinGW Makefiles“来生成eclipse的GCC项目导入到vscode 的embedded IDE

就是这样有点麻烦。 由于 Eclipse CDT 和 EIDE 之间的设计差异,EIDE 暂时不能兼容 Eclipse 项目中的一些项目属性和构建设置 导入完成后,将生成一个 .warning.txt 文件,其中记录了所有不兼容的 Eclipse 项目属性

您需要根据这些属性的 名称 和  的含义修改 EIDE 项目的 构建器选项,直到可以正确编译

但是,它同样需要cortex-debug插件来支持调试。所以。。。没啥意义似乎。

其实作者写了一个rp2040的模板可以直接用: RP2040 Pico 项目模板 - Embedded IDE Forum (em-ide.com)

其他另类方法

Piper Make (playpiper.com) 拖拽式网页图形编程。

补充说明

Linux环境的配置的补充

安装软件:

sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib make

然后配置环境变量

cd pico-sdk
export PICO_SDK_PATH=`pwd`

基于WSL安装PICO C-SDK环境

大可不必。 但是如果遇到了,有一些额外的问题。

  1. 编译的时候提示cmake版本不够,我尝试编译新版的cmake, 然后发现是国内源的问题,先换回官方源了.

  2. 如果是WSL下需要先需要手工安装tkinter来打开生成器(一般不需要) sudo apt-get install python3-tk 打开生成器。 python3 pico_project.py –gui

使用SWD下载烧录方法

这里是直接下载。

如果使用openocd,那么

openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg -c "program blink.elf verify reset exit"
openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "program blink.elf verify reset exit"

如果使用Pyocd,那么

pyocd flash --erase chip --target rp2040 blink.elf

我依然推荐我写的GUI工具: 使用aardio写一个基于pyocd的单片机下载器 | 加载中… (alwaysmy.github.io) `

USB串口调试的问题

默认的usb串口的printf需要打开上位机打开流控才能接收。自己用tinyusb来做似乎没这个问题。

其他说明

svd file就是CMSIS SVD(System View Description) ,相当于给编译器看的数据手册。

openocd问题

这里只是记录,我强烈推荐使用pyocd。

使用openocd的时候出现错误连接提示最好升级openocd,例如

[rp2040.cpu] Could not find MEM-AP to control the core

说明见: cortex-debug/debug_attributes.md at master · Marus/cortex-debug (github.com)

正常连接应显示

正常的时候多核和单核的连接:


PS C:\Users\AlwaysTS> openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c 'adapter speed 4000' -c 'set CHIPNAME rp2040'
Open On-Chip Debugger 0.12.0-rc2+dev-00988-g04887d3b6 (2022-12-03-09:30)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
adapter speed: 4000 kHz

rp2040
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 4000 kHz
Info : SWD DPIDR 0x0bc12477, DLPIDR 0x00000001
Info : SWD DPIDR 0x0bc12477, DLPIDR 0x10000001
Info : [rp2040.core0] Cortex-M0+ r0p1 processor detected
Info : [rp2040.core0] target has 4 breakpoints, 2 watchpoints
Info : [rp2040.core1] Cortex-M0+ r0p1 processor detected
Info : [rp2040.core1] target has 4 breakpoints, 2 watchpoints
Info : starting gdb server for rp2040.core0 on 3333
Info : Listening on port 3333 for gdb connections
Info : starting gdb server for rp2040.core1 on 3334
Info : Listening on port 3334 for gdb connections
shutdown command invoked
PS C:\Users\AlwaysTS> openocd -f interface/cmsis-dap.cfg -c 'set USE_CORE 0' -f target/rp2040.cfg -c 'adapter speed 4000' -c 'set CHIPNAME rp2040'
Open On-Chip Debugger 0.12.0-rc2+dev-00988-g04887d3b6 (2022-12-03-09:30)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
0
adapter speed: 4000 kHz

rp2040
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 4000 kHz
Info : SWD DPIDR 0x0bc12477, DLPIDR 0x00000001
Info : [rp2040.core0] Cortex-M0+ r0p1 processor detected
Info : [rp2040.core0] target has 4 breakpoints, 2 watchpoints
Info : starting gdb server for rp2040.core0 on 3333
Info : Listening on port 3333 for gdb connections

基于VSCode的自调试

这一步直接看我修改的模板生成器,这些配置已经写在里面了,不用自己手动改了: alwaysmy/pico-project-generator_fix

这里当个记录。

前面的配置步骤还是一样,就是哪些使用picoprobe的程序配置,后面只需要更改launch.json文件里面的:

configuration:

"configFiles": [
"/interface/picoprobe.cfg",
"/target/rp2040.cfg"
],

替换为

"configFiles": [
"interface/cmsis-dap.cfg",
"target/rp2040-core0.cfg"
],
"openOCDLaunchCommands": [
"transport select swd",
"adapter speed 4000"
],

或者替换为:

"configFiles": [
"interface/cmsis-dap.cfg",
"target/rp2040.cfg"
],
"openOCDLaunchCommands": [
"set USE_CORE 0"
"transport select swd",
"adapter speed 4000"
],

然后,把configurations下面的花括号以及其内容复制一份,加个逗号后加在后面做一些修改,用来增加一份配置方便切换。目的是方便在单核自调试和外部仿真器调试多核中切换。

同样的方法可以添加一份linux的配置。用来方便跨平台。