一、目的

        

        Raspberry_Pi_PICO板载有SWD接口,上图中的中间的最下面位置(SWCLK/GND/SWDIO)。

        SWD接口是Cortex-M系列控制器的标准接口,可以用来复位芯片、下载代码、设置代码运行以及调试功能,通过SWD接口烧写代码时不再需要按住BOOTSEL按键

        有些朋友可能没有硬件调试器,那么可以购买两个PICO,其中一个通过下面的步骤就可以变成一个SWD接口的硬件调试器和一个USB转串口工具(USB CDC)高级)。

        本篇包含两部分内容:

        1、构建openocd和Picoprobe

        2、使用SWD下载调试

        注意下面的操作都是在Ubuntu上进行的,其他OS上的步骤请查看官方文档说明。 

        说干就干,首先进入到我们的工作目录       

$ cd ~/workspace/third/raspberry_pi_pico

二、准备

        构建OpenOCD

$ sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev

$ git clone https://github.com/raspberrypi/openocd.git --branch picoprobe --depth=1 --no-single-branch

$ cd openocd/
$ ./bootstrap 
$ ./configure --enable-picoprobe
$ make
$ sudo make install

        安装后检查一下openocd工具

$ openocd -v
Open On-Chip Debugger 0.11.0-g4f2ae61-dirty (2022-02-19-10:45)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html

        

        构建和下载PICOPROBE

$ cd ~/workspace/third/raspberry_pi_pico
$ git clone https://github.com/raspberrypi/picoprobe.git
$ cd picoprobe/
$mkdir build
$ cd build/
$ cmake ..
$ make

        编译输出

Scanning dependencies of target bs2_default
[  1%] Building ASM object pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/compile_time_choice.S.obj
[  2%] Linking ASM executable bs2_default.elf
[  2%] Built target bs2_default
[  3%] Generating bs2_default.bin
[  4%] Generating bs2_default_padded_checksummed.S
[  4%] Built target bs2_default_padded_checksummed_asm
[  5%] Creating directories for 'PioasmBuild'
[  6%] No download step for 'PioasmBuild'
[  7%] No update step for 'PioasmBuild'
[  8%] No patch step for 'PioasmBuild'
[  9%] Performing configure step for 'PioasmBuild'
-- The CXX compiler identification is GNU 7.5.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/你的用户名/workspace/third/raspberry_pi_pico/picoprobe/build/pioasm
[ 10%] Performing build step for 'PioasmBuild'
[ 10%] Building CXX object CMakeFiles/pioasm.dir/main.cpp.o
[ 20%] Building CXX object CMakeFiles/pioasm.dir/pio_assembler.cpp.o
[ 30%] Building CXX object CMakeFiles/pioasm.dir/pio_disassembler.cpp.o
[ 40%] Building CXX object CMakeFiles/pioasm.dir/gen/lexer.cpp.o
[ 50%] Building CXX object CMakeFiles/pioasm.dir/gen/parser.cpp.o
[ 60%] Building CXX object CMakeFiles/pioasm.dir/c_sdk_output.cpp.o
[ 70%] Building CXX object CMakeFiles/pioasm.dir/python_output.cpp.o
[ 80%] Building CXX object CMakeFiles/pioasm.dir/hex_output.cpp.o
[ 90%] Building CXX object CMakeFiles/pioasm.dir/ada_output.cpp.o
[100%] Linking CXX executable pioasm
[100%] Built target pioasm
[ 11%] No install step for 'PioasmBuild'
[ 12%] Completed 'PioasmBuild'
[ 12%] Built target PioasmBuild
[ 13%] Generating probe.pio.h
[ 13%] Built target picoprobe_probe_pio_h
[ 14%] Creating directories for 'ELF2UF2Build'
[ 15%] No download step for 'ELF2UF2Build'
[ 16%] No update step for 'ELF2UF2Build'
[ 17%] No patch step for 'ELF2UF2Build'
[ 18%] Performing configure step for 'ELF2UF2Build'
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/你的用户名/workspace/third/raspberry_pi_pico/picoprobe/build/elf2uf2
[ 19%] Performing build step for 'ELF2UF2Build'
[ 50%] Building CXX object CMakeFiles/elf2uf2.dir/main.cpp.o
[100%] Linking CXX executable elf2uf2
[100%] Built target elf2uf2
[ 20%] No install step for 'ELF2UF2Build'
[ 21%] Completed 'ELF2UF2Build'
[ 21%] Built target ELF2UF2Build
Scanning dependencies of target picoprobe
[ 22%] Building C object CMakeFiles/picoprobe.dir/src/led.c.obj
[ 23%] Building C object CMakeFiles/picoprobe.dir/src/main.c.obj
[ 25%] Building C object CMakeFiles/picoprobe.dir/src/usb_descriptors.c.obj
[ 26%] Building C object CMakeFiles/picoprobe.dir/src/probe.c.obj
[ 27%] Building C object CMakeFiles/picoprobe.dir/src/cdc_uart.c.obj
[ 28%] Building C object CMakeFiles/picoprobe.dir/src/get_serial.c.obj
[ 29%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj
[ 30%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj
[ 31%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj
[ 32%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj
[ 33%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj
[ 34%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj
[ 35%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj
[ 36%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_time/time.c.obj
[ 37%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj
[ 38%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj
[ 39%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_sync/sem.c.obj
[ 40%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_sync/lock_core.c.obj
[ 41%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_sync/mutex.c.obj
[ 42%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_sync/critical_section.c.obj
[ 43%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_util/datetime.c.obj
[ 44%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_util/pheap.c.obj
[ 45%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/common/pico_util/queue.c.obj
[ 46%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj
[ 47%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj
[ 48%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj
[ 50%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj
[ 51%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj
[ 52%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj
[ 53%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj
[ 54%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj
[ 55%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj
[ 56%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj
[ 57%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj
[ 58%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj
[ 59%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj
[ 60%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj
[ 61%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj
[ 62%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj
[ 63%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj
[ 64%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj
[ 65%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj
[ 66%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj
[ 67%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj
[ 68%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj
[ 69%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj
[ 70%] Building ASM object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj
[ 71%] Building CXX object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj
[ 72%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj
[ 73%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj
[ 75%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj
[ 76%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj
[ 77%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj
[ 78%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj
[ 79%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj
[ 80%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/device/usbd.c.obj
[ 81%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj
[ 82%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj
[ 83%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj
[ 84%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj
[ 85%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj
[ 86%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj
[ 87%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj
[ 88%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj
[ 89%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj
[ 90%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj
[ 91%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj
[ 92%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj
[ 93%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj
[ 94%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/tusb.c.obj
[ 95%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj
[ 96%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj
[ 97%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/lib/tinyusb/hw/bsp/rp2040/family.c.obj
[ 98%] Building C object CMakeFiles/picoprobe.dir/home/你的用户名/workspace/third/raspberry_pi_pico/pico-sdk/src/rp2_common/hardware_pio/pio.c.obj
[100%] Linking CXX executable picoprobe.elf
[100%] Built target picoprobe

        输出文件有这些

        

$ tree -L 1
.
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── elf2uf2
├── generated
├── Makefile
├── picoprobe.bin
├── picoprobe.dis
├── picoprobe.elf
├── picoprobe.elf.map
├── picoprobe.hex
├── picoprobe.uf2
├── pico-sdk
├── pioasm
└── probe.pio.h

        烧写SWD调试器固件

        其中picoprobe.uf2文件我们通过USB下载到一块PICO中,这样我们就有了一个swd调试器。 

        已经编译好的picoprobe固件如下

        链接: https://pan.baidu.com/s/1iSthOL8d69iyQyH-qQbmzg 提取码: kfmt

三、实战

        首先我们需要将两个pico通过SWD连接起来,下图是官方的连线图

                 注意,上图中只给左边的PICO通过USB供电,其实两个PICO都可以单独通过USB供电,只要供地即可。(如果分别用USB进行供电,上图中的红色线一定要断开

        Pico A GP4/UART1 TX -> Pico B GP1/UART0 RX
        Pico A GP5/UART1 RX -> Pico B GP0/UART0 TX
        这两个引脚连接起来的目的是,PICO B可能通过串口输出日志,通过这样的连接开发者就可以省掉一个USB转串口工具,PICO A既是SWD调试器,又是USB转串口工具,只要PICO A接在电脑上,就可以识别出一个COM口,这样PC上就可以通过串口工具软件看到PICO B的串口输出。

        

由于关于SWD的内容过多,故会在后续博文中进一步说明如何使用SWD。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐