Back to Raspberry Pi Taiwan

【教學/基礎】使用 Raspberry Pi Debug Probe 對 Pico 進行偵錯 | Debug Probe 教學

Last Updated on 2023 年 3 月 24 日 by 小編

Debug Probe 樹莓派偵錯器 內容物

Raspberry Pi Debug Probe 內容物
圖片來源:Raspberry Pi Debug Probe
  • Raspberry Pi Debug Probe(含塑膠外殼)x1
  • Raspberry Pi USB microB Cable(一米)x1
  • 3-pin JST 接頭轉 3-pin JST 接頭(15cm)x1
  • 3-pin JST 接頭轉杜邦母頭(15cm)x1
  • 3-pin JST 接頭轉杜邦公頭(15cm)x1

排線顏色意義說明

  • 橙色: TX/SC (Output from Probe)
  • 黑色: GND
  • 黃色: RX/SD (Input to Probe or I/O)

 

Debug Probe 外觀和燈號意義

Debug Probe 使用 3.3V 準位的 I/O,工作電壓是 5V。Debug Probe 共有五個 LED,分別是顯示 電源、 TX 、 RX 、 DAP 目標連接、 DAP 執行 等功能。

Debug Probe LED
圖片來源:Raspberry Pi Debug Probe

Debug Probe 和 Pico 接線

Debug Probe 和 Pico 接線
圖片來源:Raspberry Pi Debug Probe

Debug Probe 上方的 microUSB 接到電腦。左下方的 UART 排線接到 Pico 的 UART 腳位。 Debug Probe 右下方的 SWD 使用排線接到 Pico 的 Debug 腳位。當然 Pico 也要透過 microUSB 供電才能工作。

 

電腦 和 Debug Probe 和 Pico 完整接線

電腦、 Debug Probe 和 Pico 連接
圖片來源:Raspberry Pi Debug Probe

安裝軟體(以 Raspberry Pi 為例)

OpenOCD 是什麼 ?

OpenOCD (Open On-Chip Debugger) 是一套開源軟體,用於嵌入式系統中進行偵錯 (debug)、在線燒錄 (in-system programming) 和邊界掃描測試 (boundary-scan testing tool) 等。它支援多種架構,例如 ARM、MIPS、AVR 和 x86 系統等。OpenOCD 可以通過 JTAG/SWD 和存取硬體,並提供一個命令列界面和一個 GDB 介面,方便在開發過程中進行單步執行、斷點偵錯、記憶體檢視和修改等操作。此外,OpenOCD 還提供了多種插件 (plugin) 和腳本 (script),可用於自動化測試、效能分析、能源管理等工作。

step 1

在 Raspberry Pi 安裝 OpenOCD

$ sudo apt-get update
$ sudo apt-get install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev
$ cd ~
$ git clone https://github.com/raspberrypi/openocd.git --branch rp2040 --depth=1 --no-single-branch 
$ cd openocd
$ ./bootstrap
$ ./configure --enable-sysfsgpio --enable-bcm2835gpio
$ time make -j4
$ sudo make install

step 2

在 Raspberry Pi 安裝 Pico SDK

$ cd ~
$ git clone https://github.com/raspberrypi/pico-sdk
$ wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh
$ chmod +x pico_setup.sh
$ ./pico_setup.sh
$ sudo reboot

step 3

在 Raspberry Pi 安裝 GDB

$ sudo apt-get install gdb-multiarch

 

開始使用 Debug Probe 偵錯 hello_world

step 1

編譯 pico-exampleshello_world

$ cd ~/pico/pico-examples
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug ..
$ cd hello_world
$ make -j4

step 2

透過 OpenOCD 直接上傳 ELF 檔案到 pico,不需要再按 BOOTSEL 按鍵,指令如下。

# openocd -f <interface-config-file> -f target <target-config-file> -c <command>

假設 OpenOCD 的設定檔在 ~/openocd/tcl,要偵錯的 hello_serial.elf/home/pi/pico/pico-examples/build/hello_world/serial,因此上傳檔案的完整指令為。

$ cd ~/openocd/tcl
$ sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000; targets rp2040.core0; program /home/pi/pico/pico-examples/build/hello_world/serial/hello_serial.elf verify reset exit"

openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c commandopenocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c command

step 3

hello_world 範例完整程式碼如下,Pico 會透過序列埠每一秒印出 Hello, world! 訊息。

#include <stdio.h>
#include "pico/stdlib.h"

int main() {
    stdio_init_all();
    while (true) {
        printf("Hello, world!\n");
        sleep_ms(1000);
    }   
    return 0;
}

如果要讀取 Hello, world! 訊息,需要先安裝類似 minicom 的終端機軟體。

$ sudo apt-get install minicom

安裝完成,直接開啟 minicom 並指定正確的序列埠裝置和相關參數就可以了。

$ minicom -b 115200 -o -D /dev/ttyACM0

minicom hello_serial.elf

如果要離開 minicom,可以使用 ctrl + a 加上 q 離開。
ctrl + a and q 離開 minicom

step 4

這時候就可以執行 OpenOCD server 去連上 GDB

$ cd ~/openocd/tcl
$ sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"

step 5

開啟另一個終端機視窗,進入到要偵錯的 elf 目錄,執行 GDB

$ cd ~/pico/pico-examples/build/hello_world/serial
$ gdb hello_serial.elf

gdb hello_serial.elf

step 6

因為要遠端偵錯,因此需要先連上遠端的 GDB Server 後,再使用 GDB 指令偵錯。

(gdb) target remote localhost:3333

target remote localhost:3333

step 7

使用 load 指令將 hello_serial.elf 載入到 flash。

(gdb) load

gdb load

step 8

根據 OpenOCD 手冊,如果要透過 GDB 發出命令,需要使用 monitor 作為開頭。因此要開始使用 GDB 進行端偵錯,需要先立即停止目標,並執行 reset init。

(gdb) monitor reset init

monitor reset init

step 9

如果我們要對 main 函式進行偵錯,可以透過指令 break main 或是簡寫的 b main 設定中斷點 (breakpoint),並開始執行,程式將會停在 main 函式的第一行 stdio_init_all();

(gdb) break main
(gdb) continue

break main

step 10

之後就可以使用 GDB 指令對程式進行單步執行、設定斷點、觀察暫存器的值等等偵錯功能。

next list frame next

常用的一些 GDB 指令如下,也可以參考 透過 GDB 進行遠端除錯通過GDB 學習C 語言基本 gdb

GDB 指令(中括號表示可加的參數)意義
run [args]開始執行
start [args]開始執行(並自動在 main break)
break [line/functoin]設定 breakpoint
break [condition]在條件成立時中斷
continue執行到被中斷為止
next單步執行(不會進入到 function)
step單步執行(會進入到 function)
list [line/function]列出程式碼
print [exp]顯示 expression 的值
print [var=val]即時修改變數的值
backtrace顯示目前堆疊(stack)狀況(堆疊追蹤)
frame顯示目前區塊(frame)狀況

樹莓派偵錯器 Debug Probe 參考資料

 

馬上購買 Raspberry Pi Debug ProbePico WPico HPico

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Back to Raspberry Pi Taiwan
has been added to your cart.
Checkout