了解如何使用SWD编程和调试Raspberry Pi Pico

在本教程中,我们将学习如何使用SWD将程序上传到Raspberry Pi Pico,并使用SWD调试。到目前为止,我们一直在使用拖放方法来上传到Pico的程序。但是,如果您想使用Pico的SWD接口来编程和调试,那么本教程适合您。了解使用SWD编程Raspberry Pi Pico的步骤,并使用SWD,OpenoCD和GDB调试代码。

Program-Raspberry-pi-pico-with-swd-image-1

关于SWD的简要说明

您是否曾在开发嵌入式系统应用程序上?如果答案是肯定的,那么您可能熟悉“调试”一词。在嵌入式系统中,主要设计有单个任务(或非常少量的任务集),调试和测试的过程非常关键,因为我们经常使用低至CPU寄存器级别。

调试嵌入式系统有几个硬件和软件解决方案。一个这样的产品称为串行电线调试或SWD。SWD是嵌入到大多数现代臂的微控制器和微处理器中的硅的调试和跟踪端口。

使用SWD探头(通常连接到微控制器的SWD端口的小硬件并将其映射到USB)您可以编程微控制器的闪光灯,调试固件,添加断点,只需两根电线即可通过代码等步进。

SWD,GDB(GNU调试器)和OpenoCD的组合(支持调试的片上调试器,用于嵌入式系统的系统编程和边界扫描)是一个非常强大的调试设置,尤其适用于ARM Cortex系列处理器。

覆盆子pi pico swd编程和调试

与所有ARM Cortex处理器一样,Raspberry PI Pico也具有专用的硬件,用于通过SWD接口调试。SWD调试所需的两根电线称为SWDIO(双向SWD数据)和SWCLK(SWD时钟)。

在Raspberry Pi Pico上,SWD销与其他GPIO引脚分开,并放置在电路板的底部。

覆盆子 -  PI-PICO-SWD-PINS

RPABRY PI PICO板上RP2040的2线SWD接口允许您执行以下操作:

  • 将程序上传到外部闪存或内部SRAM。
  • 控制处理器的执行状态,即,运行,停止,步骤,设置断点等。
  • 通过系统总线访问处理器内存和IO外设(内存映射)。

安装覆盆子pi的工具

如前所述,调试任何ARM皮质处理器需要GDB和OpenoCD。因此,我们现在将在我们的主机系统中安装这两个,在我的情况下是一个运行最新的raspberry pi OS的覆盆子pi。

露天

要了解SWD协议并控制ARM Cortex处理器(如果在RP2040的情况下,则需要一个名为OpenoCD的特殊转换器。让我们现在看看如何在raspberry pi中安装Openocd。

笔记:以下步骤将在/ home / pi / pico / Openocd中安装Openocd。

CD〜
CD Pico.
sudo apt安装automake autoconf build-ension texinfo libtool libftdi-dev libusb-1.0-0- dev

Pico-SWD-1

这将安装Openocd所需的所有工具。接下来,我们将克隆Openocd进入我们的主机并安装Openocd。一个接一个地输入以下命令。

git clone https://github.com/raspberrypi/openocd.git -recursive -branch rp2040 -depth = 1
CD Openocd.
./bootstrap.
./configure -enable-ftdi-enable-sysfsgpio -enable-bcm2835gpio
make -j4.
sudo make

我需要一些时间来构建和安装Openocd。高枕无忧。

GDB.

下一步是安装GDB。要安装GDB Multi-Arch,请使用以下命令:

sudo apt安装gdb-multipec

Pico-SWD-2

我们将在下一节中看到如何使用Openocd和GDB进行调试。

接线覆盆子pi pico和覆盆子pi

在看看如何使用SWD编程Raspberry Pi Pico之前,您必须先正确地电线覆盖覆盆子pi pico。

重要的提示:我不知道确切的原因,但在结束连接之前,我必须使用SWD成功地将Raspberry PI编写覆盆子PI PICO。我读到了覆盆子PI论坛,覆盆子PI和目标是,在这种情况下,覆盆子PI PICo必须在连接SWD引脚之前断电。

由于覆盆子PI PICO通过USB连接到Raspberry PI(要为UP供电),因此我所要做的就是关闭覆盆子PI,使SWD连接进行电源,然后对Raspberry PI进行电源。

下表显示了覆盆子PI和Raspberry PI PICO之间的所有必要连接。

覆盆子pi pico

覆盆子PI.
SWDIO.

GPIO 24(PIN 18)

SWD GND.

GND(销20)
SWCLK.

GPIO 25(PIN 22)

Program-Raspberry-PI-PICO-WITS-SWD-IMAGE-2

编程覆盆子PI PICO与SWD

让我们使用“闪烁”程序作为一个示例,以了解Raspberry PI PICO SWD编程工作。如果您在“编程Raspberry Pi Pico使用C”教程中,我们已经构建了闪烁程序,这导致了一些目标文件。

对于通过USB的拖放编程,我们使用了.uf2文件。但是Openocd使用.elf文件来上传程序。

使用以下命令用SWD对Raspberry Pi Pico进行编程。

CD〜
CD Pico.
CD Pico-ilmons / Build /
眨眼

Pico-SWD-3

Openocd -f接口/ raspberrypi-swd.cfg -f target / rp20404040.cfg -c“program blink / blink.elf验证重置退出”

Pico-SWD-4

上面的命令将调用Openocd以将Blink.elf文件编程到Raspberry Pi Pico,重置电路板并退出Openocd。如果一切顺利,你的终端应该显示这样的东西,覆盆子Pi Pico上的LED应该开始闪烁。

Pico-SWD-5

使用SWD调试覆盆子PI PICO

让我们现在看看如何调试代码起诉SWD,OpenoCD和GDB。我们已经在上一步安装了GDB。现在,要在构建文件中包含调试相关的设置,您可以使用CMake指令'-dcmake_build_type = debug.'。

但在此之前,您需要从“pico-emplice”目录中删除“构建”目录并创建一个新的“构建”目录。使用以下命令用调试信息构建示例。

CD〜/ pico / pico-mixile /
RM -RF构建
mkdir建设
CD构建
导出pico_sdk_path = .. / .. / pico-sdk
cmake -dcmake_build_type = debug ..

Pico-SWD-6

让我们使用“hello_world”示例并为串行变体构建。您无法使用基于USB的串行连接进行SWD调试,因为USB设备在停止调试时停止处理器核心时会断开连接。

此外,Raspberry PI PICo和Raspberry PI之间的连接查看Raspberry PI PI PICO在Raspberry PI上的UART串行输出的输出如下:

覆盆子pi pico

覆盆子PI.
GPIO 0(UART0_TX)

GPIO 15(UART_RX0)引脚10

GPIO 1(UART0_RX)

GPIO 14(UART_TX0)引脚8
GND.

GND(引脚14)

在“连接”之后,打开Hello_world UART目录并构建它。

CD Hello_World /序列
make -j4.

使用Openocd打开GDB服务器。

Openocd -f接口/ raspberrypi-swd.cfg -f target / rp2040.cfg

Pico-SWD-7

保持此终端,并打开另一个终端窗口并浏览到构建目录中的UART串行目录。

CD〜
CD pico / pico-mixile / build / hello_world / serial /

打开GDB并连接到OpenoCD服务器。

gdb-multivech hello_serial.elf
(GDB)目标远程localhost:3333

Pico-SWD-8

将程序加载到Raspberry PI PICo的闪存中,使用Load命令。

(GDB)负载

开始运行代码。

(GDB)监视重置init
(GDB)继续

Pico-SWD-9

如果您熟悉GDB命令,则可以探索它们。

结论

具有SWD的编程和调试覆盆子PI PICO的完整教程。了解覆盆子PI PICO SWD接口的工作原理,覆盆子PI PICO和RASPBERY PI之间的必要连接,SWD编程Raspberry PI PICO与SWD,使用GDB使用SWD调试Raspberry Pi Pico。

5回复

  1. 谢谢你。

    只是为了让您知道表中有一个拼写错误,说明如何将SWD连接到Pico。

    GPIO 24(引脚18)和GPIO 25(引脚18)

    1. 从技术上讲,它应该是可能的,但不是直接与ST链路固件。您必须闪烁一个不同的固件(Segger的J Link或Black Magic Probe)。我个人没有尝试过这个。

  2. 这是一个很好的程序,我遇到了困难的一项事情是SWD连接只偶尔工作了。通过找到PI和Pico之间的最短线来解决问题。可能是我的原始电线可能是一个问题,但由于高带宽,使用短线似乎合理。我已经看到了使用带连接器的其他设置,也许扭曲的对也可以更好地工作。我现在拥有的电线大约是3英寸,并且在所有连接都没有亚博彩票下载问题。

发表评论

您的电子邮件地址不会被公开。必需的地方已做标记*