การโปรแกรม Arduino Bootloader ไปยังชิป ATSAMD21 โดยใช้ OpenOCD
บอร์ดไมโครคอนโทรลเลอร์ SAMD21 (ATMEL/Microchip) สามารถนำมาใช้กับ Arduino IDE และอัปโหลด Arduino Sketch ไปยังบอร์ดทดลองได้ ผ่านทาง USB (Native) แต่จะต้องมีการติดตั้ง Arduino Bootloader ไว้ในหน่วยความจำ Flash ภายในชิปไมโครคอนโทรลเลอร์
บทความนี้นำเสนอวิธีการติดตั้ง Arduino Bootloader สำหรับ ATSAMD21 (เลือกทดลองกับบอร์ด RobotDyn SAMD21 M0-Mini) และใช้โปรแกรม OpenOCD สำหรับระบบปฏิบัติการ Ubuntu 16.04 และใช้ร่วมกับอุปกรณ์ เช่น ARM-Keil ULINK2 Programmer หรือ SEGGER J-Link ในโหมด SWD (Serial Wire Debug)
เพิ่มเติม: สามารถใช้กับบอร์ด Raspberry Pi (64 บิต) + Raspbian OS ได้เช่นกัน
ข้อสังเกต: ขาของ SWD จะใช้ร่วมกับขาของ JTAG Port
- JTAG TCK — SWCLK (Serial Wire Clock)
- JTAG TMS — SWDIO (Serial Wire debug Data Input/Output)
- JTAG TDO — SWO (Serial Wire trace Output)
ขั้นตอนการดำเนินการ
- ติดตั้ง OpenOCD ในเครื่องคอมพิวเตอร์ Ubuntu Linux ด้วยวิธีการ Build จาก Source Code ที่ดาวน์โหลดมาจาก Github
- ดาวน์โหลดไฟล์ Arduino ZERO Bootloader (samd21_sam_ba) ซึ่งเป็นไฟล์ .hex หรือ .bin จาก Github
- ทำคำสั่ง openocd แบบ Command Line เพื่อเขียนข้อมูลจากไฟล์ Bootloader ไปยังชิป ATSAMD21 โดยใช้อุปกรณ์ JTAG/SWD Programmer ที่เชื่อมต่อกับพอร์ต USB ของคอมพิวเตอร์
ทำคำสั่งเพื่อดาวน์โหลดและติดตั้ง OpenOCD ใน Ubuntu
$ sudo apt-get install make libtool pkg-config texinfo automake autoconf libusb-dev libusb-1.0.0-dev libftdi-dev libhidapi-dev$ git clone https://github.com/ntfreak/openocd.git$ cd openocd/$ ./bootstrap$ ./configure --enable-cmsis-dap --enable-jlink --enable-stlink$ make -j 4$ sudo make install$ sudo cp /usr/local/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d/$ sudo udevadm control --reload
ข้อสังเกต: ไฟล์ src/flash/nor/at91samd.c
ของ OpenOCD มีบักถ้าจะนำไปใช้งานกับอุปกรณ์ ST-Link V2 และ ATSAMD21 MCU ให้แก้ไขตามแนวทางที่ได้อธิบายไว้ในเว็บนี้
จากนั้นให้ทำคำสั่ง wget เพื่อดาวน์โหลดไฟล์ Arduino Bootloader จาก Github
$ wget https://github.com/arduino/ArduinoCore-samd/raw/master/bootloaders/zero/samd21_sam_ba.hex
สร้างไฟล์ชื่อ openocd.cfg ให้เขียนตามตัวอย่างแล้วบันทึกการเปลี่ยนแปลงลงไฟล์
File: openocd.cfg
source [find interface/cmsis-dap.cfg]
transport select swd
set CHIPNAME at91samd21g18
set CPUTAPID 0x0bc11477
set ENDIAN little
telnet_port disabled
reset_config srst_nogate
adapter_nsrst_delay 100
adapter_nsrst_assert_width 100
source [find target/at91samdXX.cfg]
ขั้นตอนสุดท้ายคือ การทำคำสั่ง openocd
เพื่อเขียนข้อมูลจากไฟล์ .hex ไปยังบอร์ดไมโครคอนโทรลเลอร์โดยใช้อุปกรณ์ ARM-Keil ULINK2
$ openocd -f openocd.cfg -c "init; targets; reset halt; program samd21_sam_ba.hex verify; reset; shutdown"
ถ้าจะเปลี่ยนจากอุปกรณ์ ARM-KEIL ULINK2 เป็น SEGGER J-LINK ก็ให้แก้ไขไฟล์ openocd.cfg
เพื่อเรียกใช้ interface ตามตัวอย่างต่อไปนี้
Creative Commons, Attribution-Non Commercial-Share Alike 4.0 International (CC BY-NC-SA 4.0)