本文使用的Raspberry Pi Debug Probe(偵錯器), Pico和Pico 2開發板由台灣樹莓派Sosorry先生贊助提供,特此感謝!
Raspberry Pi Pico系列微控板後方有三個用於連接SWD偵錯器的接腳:
SWD(Serial Wire Debug,直譯為「序列式線路偵錯」)是ARM開發的除錯介面,只需連接兩個接腳:SWDIO(資料)和SWCLK(時脈)。
Raspberry Pi Debug Probe(以下簡稱“Debug Probe”或「樹莓派偵錯器」)是樹莓派官方推出的開源、SWD介面偵錯器,可以對採用ARM處理器系列的微控制板進行除錯和燒錄程式檔,提供存取和修改記憶體、暫存器,以及即時追蹤程式執行狀態等功能。
樹莓派偵錯器的主要構成部分,是採用和Raspberry Pi Pico開發板同款的RP2040微控器。
更新樹莓派偵錯器的韌體
使用偵錯器之前,建議先更新它的韌體。在Debug Probe開源專案的release(發行)頁面,下載預先編譯好的二進位debugprobe.uf2檔。這個頁面也提供適用於Pico和Pico 2開發板的偵錯器韌體,底下的「自製樹莓派偵錯器」會用到它。
按著樹莓派偵錯器上的BOOTSEL(啟動選擇)鍵不放,再插入電腦USB,然後放開BOOTSEL鍵。
電腦會將「樹莓派偵錯器」當作「USB儲存裝置」,下圖顯示這個儲存裝置的資料夾內容:
把之前下載的debugprobe.uf2檔拖入此資料夾,此韌體就會被燒錄到偵錯器。
使用Debug Probe偵錯樹莓派Pico系列微控制板
按照下圖連接偵錯器和Pico開發板,偵錯器的USB連接線必須是支援資料傳輸的數據線;連接Pico開發板的USB線僅用於供電。樹莓派偵錯器有附帶三款SWD介面的連接線和一條USB數據線。
如果不打算透過偵錯器接收序列埠的print()輸出訊息,UART線不用接。Pico和Pico 2開發板,在Arduino IDE中,預設透過上傳UF2格式的程式檔來燒錄。
第一次上傳程式時,可能需要按著開發板的BOOTSEL鍵,插入電腦USB介面後,再放開BOOTSEL鍵,讓電腦將Pico / Pico 2開發板視為USB儲存裝置。
若是要偵錯Pico / Pico 2開發板,或者用樹莓派偵錯器上傳程式檔,Arduino IDE的「工具 / Upload Method(上傳方式)」選項,請選擇“Picoprobe(CMSIS-DAP)”。在這種燒錄和偵錯模式下,序列埠選項就不重要了,因為用不到,開發板也不需要切換成「USB儲存裝置」。
跟偵錯Arduino UNO R4開發板一樣(參閱「Arduino IDE 2的偵錯(debug)功能教學:以Arduino UNO R4 WiFi開發板為例」),編譯程式之前,請勾選Arduino IDE主功能表的「Sketch / 除錯最佳化」。
最後,你可以設置程式中斷點(breakpoint),然後依序點擊工具列的「驗證」、「上傳」鈕,然後點擊「開始偵錯」。接下來的操作就跟「Arduino IDE 2的偵錯(debug)功能教學」貼文一樣了。
樹莓派Debug Probe的電路
樹莓派有提供Debug Probe的電路圖(PDF格式),除了狀態指示LED燈,最主要的部份是DEBUG和UART介面的接腳。其中的SWDIO(資料)線,以及RX(序列接收)線各自多了一個連接施密特觸發器的接線。
這些腳位各串接一個100Ω電阻,其用途是:
- 限流:在意外短路或突波電壓的情況下,電阻可限制流經線路的電流,保護微控制器和除錯工具。
- 訊號完整性(Signal integrity):電阻有助於減少偵錯器連線可能因阻抗不匹配而產生的訊號反射和震盪,讓微控制器與偵錯器之間的通訊更乾淨可靠。
- 降低電磁干擾(EMI):電阻可協助降低高頻雜訊。
施密特觸發器可確保微控器收到乾淨的數位訊號,相關實驗電路請參閱《超圖解Arduino互動設計入門》第15章。樹莓派偵錯器韌體,實際上只會讀取連接施密特觸發器的SWDIO(資料)線,以及RX(序列接收)的輸入。
使用Pico / Pico 2開發板自製樹莓派偵錯器
樹莓派偵錯器和Pico開發板都採相同的RP204微控器,理論上,按照樹莓派提供的電路接線,即可用Pico開發板製作出功能一致的偵錯器。但從上文的偵錯器原始碼網頁可看到,偵錯器的韌體分成Debug Probe(偵錯器)、Pico和Pico 2開發板三種版本。
原始碼中的probe_config.h(偵錯器設置)標頭檔,包含底下的條件式,所以程式會依照選用的硬體(是否為Pico開發板),引用不同的接腳設定檔。
#ifdef DEBUG_ON_PICO #include "board_pico_config.h" #else #include "board_debug_probe_config.h" #endif
底下是「非Debug Probe」(如:Pico / Pic 2板)的board_pico_config.h接腳設置檔的部分程式碼:
// PIO config #define PROBE_SM 0 #define PROBE_PIN_OFFSET 2 #define PROBE_PIN_SWCLK (PROBE_PIN_OFFSET + 0) // 2 #define PROBE_PIN_SWDIO (PROBE_PIN_OFFSET + 1) // 3 // Target reset config #if false #define PROBE_PIN_RESET 1 #endif // UART config #define PROBE_UART_TX 4 #define PROBE_UART_RX 5 #define PROBE_UART_INTERFACE uart1 #define PROBE_UART_BAUDRATE 115200
根據上面的設定,Pico / Pico 2開發板的偵錯器電路接線要改成:
根據在麵包板上的測試實驗,電阻和施密特觸發器可以省略,實際上,這種類型的施密特觸發器,例如,德州儀器(TI)的SN74LVC2G17(內部有兩個施密特觸發器),只有表面黏著型封裝款式,無法直接插入麵包板。
筆者採用Pico開發板當作偵測器,第一次使用之前,要先按住BOOTSEL鍵,將它燒錄debugprobe_on_pico.uf2檔,USB數據線只需連接擔任偵錯器的Pico開發板,「偵錯目標」開發板不用接USB。接下來的操作就跟正牌Debug Probe一樣了。