การใช้ Raspberry Pi RP2040 เป็นอุปกรณ์ CMSIS-DAP Debug Probe#


CMSIS-DAP / SWD Debug Probe#

ในการพัฒนาซอฟต์แวร์สำหรับระบบสมองกลฝังตัวที่ใช้ไมโครคอนโทรลเลอร์เป็นตัวประมวลผล (Embedded System Programming) การดีบักเฟิร์มแวร์ ถือเป็นขั้นตอนสำคัญที่ต้องใช้เครื่องมือเฉพาะ เพื่อการอัปโหลดโปรแกรมไปยังหน่วยความจำแฟลช และการตรวจสอบและแก้ไขข้อผิดพลาด

เครื่องมืออย่างหนึ่งที่ได้รับความนิยมคือ CMSIS-DAP Debug Probe สำหรับชิปที่ใช้ซีพียูตระกูล Arm Cortex-M Series และมักใช้ร่วมกับอินเทอร์เฟซสำหรับการดีบักที่เรียกว่า SWD (Serial Wire Debug) โดยมีจุดเด่นคือ การใช้งานผ่านขาเพียงสองขา (SWDIO และ SWCLK) ซึ่งต่างจากโปรโตคอล JTAG ที่ต้องการขาเชื่อมต่อมากกว่า SWD

CMSIS-DAP ย่อมาจาก Cortex Microcontroller Software Interface Standard - Debug Access Port เป็นมาตรฐานที่พัฒนาโดยบริษัท ARM เพื่อช่วยให้การดีบักและโปรแกรมไมโครคอนโทรลเลอร์ที่ใช้ ARM Cortex

อุปกรณ์ CMSIS-DAP Debug Probe สามารถเชื่อมต่อระหว่างคอมพิวเตอร์ (ผ่านพอร์ต USB ของผู้ใช้) กับชิปไมโครคอนโทรลเลอร์ (ผ่านอินเทอร์เฟซ SWD) เพื่อทำหน้าที่ต่อไปนี้

  • Flashing Firmware: อัปโหลดไฟล์โปรแกรมลงในหน่วยความจำของไมโครคอนโทรลเลอร์
  • On-chip Debugging: ตรวจสอบการทำงานของโปรแกรมในขณะที่ทำงานโดยใช้ชิปไมโครคอนโทรลเลอร์
  • System Monitoring: อ่านค่าข้อมูลต่าง ๆ เช่น สถานะของรีจิสเตอร์หรือพอร์ตอินพุตเอาต์พุต

อุปกรณ์ประเภท CMSIS-DAP Debug Probe รองรับการทำงานร่วมกับซอฟต์แวร์ IDE เช่น

อุปกรณ์ CMSIS-DAP Debug Probe มีขายและให้เลือกใช้จากหลายผู้ผลิต และแตกต่างกัน เช่น ชิปไมโครคอนโทรลเลอร์ที่เลือกใช้งาน (STM32, RP2040, SAMD21, ESP32S3, ...) และความเร็วในการประมวลผล หรือ ความเร็วของสัญญาณ SWCLK เป็นต้น

เฟิร์มแวร์สำหรับ CMSIS-DAP Debug Probe ที่เป็น Open Source ก็มีให้เลือกและลองใช้งานได้ ดังนี้


RP2040 SWD Debug Probe#

บริษัท RPi Ltd. มีอุปกรณ์ SWD Debug Probe ที่ใช้ชิป RP2040 เรียกว่า Pico Debug Probe แต่ผู้ใช้ก็สามารถดาวน์โหลดไฟล์เฟิร์มแวร์ (ชนิดของไฟล์คือ .uf2) มาใช้กับบอร์ดไมโครคอนโทรลเลอร์ RP2040 เช่น Raspberry Pi Pico และ RP2350 เช่น Raspberry Pi Pico 2

ขาอุปกรณ์สำหรับการเชื่อมต่อที่สำคัญคือ

  • UART:
    • UART_TX: GPIO4
    • UART_RX: GPOI5
  • SWD:
    • SWCLK: GPIO2
    • SWDIO: GPIO3

ถัดไปเป็นตัวอย่างและขั้นตอนการใช้บอร์ด WaveShare RP2040-Zero เป็นอุปกรณ์ Pico Debug Probe

  1. ดาวน์โหลดไฟล์ debugprobe_on_pico.uf2 (ได้ทดลองใช้เวอร์ชัน v2.2.0)
  2. เชื่อมต่อบอร์ด WaveShare RP2040-Zero กับคอมพิวเตอร์ของผู้ใช้ผ่านทางพอร์ต USB
  3. กดปุ่ม BOOT ค้างไว้ และกดปุ่ม RESET แล้วปล่อย เพื่อทำให้บอร์ดเข้าสู่โหมด RP2 BOOTSEL จะมองเห็นไดรฟ์ของบอร์ด (USB Mass Storage) เช่น ในไดรฟ์D: ชื่อ RPI-RP2 สำหรับ Windows เป็นต้น
  4. นำไฟล์ debugprobe_on_pico.uf2 ไปใส่ลงในไดรฟ์ จากนั้นอุปกรณ์จะรีเซตตัวเองและเริ่มทำงาน

รูป: บอร์ด WaveShare RP2040-Zero และตำแหน่งขาของบอร์ด

รูป: ตัวอย่างการนำไฟล์ debugprobe_on_pico.uf2 ไปใส่ลงในไดรฟ์ของบอร์ด

ในกรณีที่ใช้ WSL2 Ubuntu ก็มีตัวอย่างไฟล์ Bash Script (copy_uf2.sh) สำหรับการนำไฟล์ .uf2 ไปใส่ลงในไดรฟ์ของบอร์ด RP2040 ซึ่งจะเป็นไดรฟ์แบบ Removable Flash Drive ดังนั้นก่อนทำคำสั่งด้วยสคริปต์นี้ จะต้องทำให้บอร์ด RP2040 อยู่ในโหมด RP2 BOOTSEL ก่อนทุกครั้ง

#!/bin/bash

# Ensure two arguments are provided
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <source-file> <window-drive>"
    exit 1
fi

SRC_FILE=$1
PICO_DRV=$2
MOUNT_DIR="/mnt/pico_${PICO_DRV,,}"
PICO_DRV="${PICO_DRV^^}:"

# Check if the source file exists
if [ ! -f "$SRC_FILE" ]; then
    echo "Error: Source file '$SRC_FILE' does not exist."
    exit 2
fi

if [[ "${SRC_FILE##*.}" != "uf2" ]]; then
    echo "Error: Source file '$SRC_FILE' is not a .uf2 file."
    exit 2
fi

echo "mount Windows drive $PICO_DRV to '$MOUNT_DIR'"
if [[ "${PICO_DRV}" != "C:" ]]; then
    sudo mkdir -p "$MOUNT_DIR" 2>/dev/null
    sudo mount -t drvfs "$PICO_DRV" "$MOUNT_DIR" && cp "$SRC_FILE" "$MOUNT_DIR"
    sudo umount "$MOUNT_DIR" 2>/dev/null
    sudo rm -fr "$MOUNT_DIR" 2>/dev/null
else
    echo "Ignore drive C:"
    exit 3
fi

echo "Done..."

รูป: ตัวอย่างการทำคำสั่ง copy_uf2.sh

 


การทดลองใช้งานร่วมกับ OpenOCD#

โปรแกรม OpenOCD สามารถนำมาใช้งานกับระบบปฏิบัติการได้ทั้ง Windows, Linux และ Mac OS แต่ในบทความนี้จะกล่าวถึงเฉพาะ Windows และ Ubuntu / WSL2

ตัวอย่างการทำคำสั่งสำหรับ Ubuntu 22.04 / 24.04 LTS (ไม่ได้ใช้ WSL2)

# Install the openocd software package.
$ sudo apt install openocd

# Detect the Pico Debug Probe.
$ lsusb | grep "Raspberry Pi"
Bus 001 Device 043: ID 2e8a:000c Raspberry Pi Debugprobe on Pico (CMSIS-DAP)

 

# Use the openocd tool to connect to the Pico Debug Probe.
$ openocd -s tcl -f interface/cmsis-dap.cfg \
 -c "transport select swd" -c "adapter speed 4000" -c "init; exit" 

Open On-Chip Debugger 0.11.0
Licensed under GNU GPL v2
For bug reports, read http://openocd.org/doc/doxygen/bugs.html
swd
adapter speed: 4000 kHz

Info : Using CMSIS-DAPv2 interface with VID:PID=0x2e8a:0x000c, serial=....
Info : CMSIS-DAP: SWD  Supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 4000 kHz
Warn : gdb services need one or more targets defined

 

ข้อสังเกต: หากจะใช้คำสั่ง openocd จาก WSL2 Ubuntu โดยตรง จะต้องมีขั้นตอนเพิ่ม จึงจะสามารถเรียกใช้คำสั่ง openocd กับอุปกรณ์ USB Device อย่างเช่น CMSIS-DAP Debug Probe

 


ตัวอย่างการใช้ OpenOCD เพื่ออัปโหลดโปรแกรมไปยังบอร์ด RP2040#

โดยปรกติแล้ว ถ้าเขียนโปรแกรมสำหรับบอร์ดไมโครคอนโทรลเลอร์ RP2040 ก็ใช้วิธีเข้าสู่โหมด UF2 BOOTSEL แล้วนำไฟล์ .uf2 ไปใส่ลงในไดรฟ์ของบอร์ด ซึ่งก็เป็นวิธีที่ทำได้ง่าย แต่อีกวิธีหนึ่งคือ การใช้วิธี SWD โดยใช้อุปกรณ์ CMSIS-DAP Debug Probe

ถัดไปเป็นตัวอย่างการทำคำสั่งภายใน WSL2 Ubuntu แต่จะเรียกใช้โปรแกรม OpenOCD ที่ใช้กับ Windows 10 / 11 ดังนั้นจึงต้องมีการติดตั้งโปรแกรม OpenOCD สำหรับระบบปฏิบัติการ Windows ให้พร้อมก่อนใช้งาน

รูป: เว็บไซต์สำหรับดาวน์โหลดโปรแกรม OpenOCD for Windows

ในตัวอย่างนี้ได้ติดตั้งโปรแกรมที่ได้ดาวน์โหลดไฟล์ .7z และมาแตกไฟล์ไว้ในไดเรกทอรี ตามตัวอย่างดังนี้

c/Tools/OpenOCD-20240916-0.12.0/

และมองเห็นได้จาก WSL2 Ubuntu โดยใช้ชื่อไดเรกทอรี

/mnt/c/Tools/OpenOCD-20240916-0.12.0/

จากนั้นลองทำคำสั่งใน WSL2 Ubuntu Terminal ตามตัวอย่างดังนี้

$ cat /etc/os-release | head -1
PRETTY_NAME="Ubuntu 24.04.1 LTS"

# Create an alias (short command) for the openocd.exe program.
$ alias openocd.exe='/mnt/c/Tools/OpenOCD-20240916-0.12.0/bin/openocd.exe'

# Check the version of the openocd program.
$ openocd.exe --version
Open On-Chip Debugger 0.12.0 (2024-09-16) 

$ openocd.exe \
  -f interface/cmsis-dap.cfg -c "transport select swd" \
  -f target/rp2040.cfg -c "adapter speed 2000" \
  -c "targets rp2040.core0" -c "init; dap info; exit"

ถัดไปเป็นตัวอย่างการทำคำสั่ง openocd.exe เพื่ออัปโหลดไฟล์ led_blink.elf ที่ได้จากการคอมไพล์โค้ดด้วย Pico C/C++ SDK (ดูตัวอย่างการติดตั้งและใช้งานซอฟต์แวร์) และอัปโหลดไฟล์ดังกล่าวไปยังบอร์ด RP2040

$ openocd.exe \
  -f interface/cmsis-dap.cfg -c "transport select swd" \
  -f target/rp2040.cfg -c "adapter speed 2000" \
  -c "targets rp2040.core0" \
  -c 'program ./led_blink.elf verify reset exit'

รูป: ตัวอย่างการใช้บอร์ด Waveshare RP2040-Zero เป็นอุปกรณ์ Debug Probe และนำไปใช้กับอีกบอร์ด RP2040 อีกบอร์ดหนึ่ง (เรียกว่า Target Board) โดยเชื่อมต่อด้วยอินเทอร์เฟส SWD (SWCLK, SWDIO, GND)

รูป: ตัวอย่างการทำคำสั่ง openocd.exe

รูป: ตัวอย่างการทำคำสั่ง openocd.exe เพื่ออัปโหลดไฟล์ .elf ไปยังบอร์ด RP2040

 


ตัวอย่างการใช้งานสำหรับบอร์ด nRF52840#

ถัดไปเป็นตัวอย่างการใช้อุปกรณ์ SWD Debug Probe ร่วมกับ OpenOCD เพื่อเขียนไฟล์ Adafruit nRF52 Bootloader ไปยังชิป nRF52840 SoC เช่น บอร์ด MakerDiary nRF58240 MDK USB Dongle

ไฟล์ที่ได้ทดลองใช้: mdk_nrf52840_dongle_bootloader-0.9.2_s140_6.1.1.hex

คำสั่งต่อไปนี้เป็นตัวอย่างการใช้โปรแกรม OpenOCD ลบหน่วยความจำแฟลชภายในชิป nRF52840 แล้วจึงเขียนไฟล์ .hex (ใช้ชื่อไฟล์ bootloader.hex) ลงในชิปดังกล่าว

$ alias openocd.exe='/mnt/c/Tools/OpenOCD-20240916-0.12.0/bin/openocd.exe'
$ openocd.exe \
  -s tcl -f interface/cmsis-dap.cfg -f target/nrf52.cfg \
  -c "transport select swd" -c "adapter speed 4000" \
  -c "init; targets; reset init; nrf5 mass_erase; halt" \
  -c "program bootloader.hex verify reset exit"

รูป: บอร์ด MakerDiary nRF58240 MDK USB Dongle

รูป: ตัวอย่างการใช้บอร์ด Waveshare RP2040-Zero เป็นอุปกรณ์ Debug Probe ร่วมกับบอร์ด MakerDiary nRF58240 MDK USB Dongle เชื่อมต่อกันด้วย SWD Interface

รูป: ตัวอย่างการทำคำสั่ง openocd.exe

เมื่อบอร์ด nRF58240 MDK USB Dongle ได้มีการติดตั้ง Adafruit nRF52 Bootloader แล้ว และเมื่อกดปุ่ม RESET แบบ Double-Click จะเข้าสู่โหมด UF2 BOOT และมองเห็นไฟล์ INFO_UF2.TXT อยู่ภายใน

รูป: ตัวอย่างเนื้อหาภายในไฟล์ INFO_UF2.TXT

 


กล่าวสรุป#

บทความนี้นำเสนอตัวอย่างการใช้บอร์ดไมโครคอนโทรลเลอร์ RP2040 ให้เป็นอุปกรณ์ CMSIS-DAP / SWD Debug Probe โดยเลือกใช้บอร์ด WaveShare RP2040-Zero ซึ่งมีขนาดเล็กและราคาไม่แพง มีการสาธิตการใช้งานอุปกรณ์ร่วมกับโปรแกรม OpenOCD ที่เป็น Open Source โดยสาธิตเฉพาะการทดลองเขียนไฟล์ (Flashing) ไปยังบอร์ดไมโครคอนโทรลเลอร์อย่างเช่น RP2040 และ nRF52840

 


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2024-12-10 | Last Updated: 2024-12-10