2021年3月30日

RaspberryPi Pico C/C++ Debug (CLI篇)

前言:

RaspberryPi Pico有提供SWD界面(前身是JTAG),能透過SWD Adapter除錯。
身為老古董,以前用JTAG,需要一個JTAG Adapter,現在時代進步到SWD了,以前的JTAG Adapter同樣升級,現在是SWD Adapter,對老古董而言,特別的是以前JTAG Adapter比較貴,而且可能需要個ARM的程式提供Driver和Protocol,現在有OpenOCD,OpenOCD是OpenSource,而現在的RaspberryPi Zero/2b/3b/4b都能用GPIO模擬SWD Adapter,甚至RaspberryPi Pico也有picoprobe,直接放韌體,就能讓Pico當SWD Adapter。
因為是延續JTAG,因此現在主流的Microcontroller看起來都支援SWD,常見的除了新出的Pico之外,STM32也是常見的平台。

因為Debug有點複雜,因此分2篇,這篇做的是OpenOCD環境建置以及gdb指令除錯。
也許會說,那我直接跳下一篇,直接看QtCreator呢?
不太建議,因為設定和建置都在這篇,QtCreator的設定基礎,也都是gdb,這篇實做後,才能銜接上。
SWD Adapter的部份,這篇先用RaspberryPi 4b,原因是,OpenOCD RaspberryPi的設定,預設是RaspberryPi 4b,如果要用其他版本,要修改記憶體位址(memory address)、時脈(clock)、GPIO號碼(GPIO number)。

環境:

Host: Ubuntu 18.04
SWD Adapter: Raspberry Pi 4b
Target: RaspberryPi Pico

接線示意圖:






Pi OpenOCD環境安裝:

1. RaspberryPi OS安裝
先按照官方說明安裝Raspberry PI OS Lite
設置SSH
WiFi,我這邊設定WiFi為固定IP(192.168.1.35)

2. OpenOCD安裝
2a. 安裝套件
# apt-get update
# apt install git gdb-multiarch
# apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev

PS1. 下載OpenOCD Source Code要用git
PS2. Cross GDB執行檔現在直接包成gdb-multiarch套件,能直接支援Pico Binary format

2b. 下載OpenOCD
# git clone https://github.com/raspberrypi/openocd.git --recursive --branch rp2040 --depth=1

2c. 編譯 & 安裝OpenOCD
# cd openocd
# ./bootstrap
# ./configure --enable-ftdi --enable-sysfsgpio --enable-bcm2835gpio
# make -j8
# make install

2d. 安裝完成
安裝後檔案位置如下:
OpenOCD Execute file => /usr/local/bin/
OpenOCD Configure files => /usr/local/share/openocd/scripts/
RaspberryPi OpenOCD cfg => /usr/local/share/openocd/scripts/interface/raspberrypi-swd.cfg
RaspberryPi Pico(RP2040) Target cfg => /usr/local/share/openocd/scripts/target/rp2040.cfg

3. Host端GDB安裝

因為OpenOCD提供telnet、gdbserver、tcl除錯需要的3個界面,因此Host需要安裝:
# apt install gdb-multiarch telnet

4. Pico設置Debug模式
4a. 按下圖步驟將Pico上電



4b. Pi 4b執行OpenOCD
# openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg -c 'bindto 0.0.0.0'


PS1. OpenOCD預設binding在本機(localhost),要加上參數 'bindto 0.0.0.0'
PS2. 如果出現錯誤訊息,請確定是參照4a步驟,按著按鈕插USB Cable (上電)

5. Host上用gdb除錯

QtCreator會Build在不同目錄,專案目錄「/tmp/my_pico_cpp_test」,檔案會產生在「/tmp/build-my_pico_cpp_test-unknown-Default」。

根據CMakeLists.txt設定,Pico燒錄用的檔案是uf2,Debug用的檔案則是elf,因此這裡要使用的是「piblink.elf」。

Debug執行步驟如下:
5a. 執行gdb
# gdb-multiarch /tmp/build-my_pico_cpp_test-unknown-Default/piblink.elf

5b. 連線到OpenOCD並載入piblink.elf
(gdb) target remote 192.168.1.35:3333
(gdb) load




5c. 設置中斷點在main並執行
(gdb) b main
(gdb) continue






補充:

如果要使用Pi Zero (Pi 1)或者Pi 2b當作OpenOCD的SWD Adapter,OpenOCD的cfg檔案內容如下:
Pi 2b:(已測試)
# /usr/local/share/openocd/scripts/interface/rpi2.cfg
# Use RPI GPIO pins
adapter driver bcm2835gpio
bcm2835gpio_peripheral_base 0x3F000000

bcm2835gpio_speed_coeffs 146203 36

# SWD                swclk swdio
# Header pin numbers: 23 22
bcm2835gpio_swd_nums 11 25

transport select swd

adapter speed 1000

Pi Zero (Pi 1):
# /usr/local/share/openocd/scripts/interface/rpizero.cfg
# Use RPI GPIO pins
adapter driver bcm2835gpio
bcm2835gpio_peripheral_base 0x20000000

bcm2835gpio_speed_coeffs 113714 28

# SWD                swclk swdio
# Header pin numbers: 23 22
bcm2835gpio_swd_nums 11 25

transport select swd

adapter speed 1000


沒有留言: