การโปรแกรม Arduino Bootloader ไปยังชิป ATSAMD21 โดยใช้ OpenOCD

<rawat.s>
3 min readJan 28, 2020

--

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍

บอร์ดไมโครคอนโทรลเลอร์ 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 ได้เช่นกัน

รูปแสดง PinOut ของบอร์ด RobotDyn M0-Mini
รูปแสดงตำแหน่งขาของ SWD ที่คอนเนกเตอร์ Cortex Debug Connector (50-mil Spacing)

ข้อสังเกต: ขาของ 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)
ARM Connectors: 2x5 & 2x10 Pins
Cortex Debug Connector

ขั้นตอนการดำเนินการ

  • ติดตั้ง 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
ตัวอย่างข้อความเอาต์พุต (ตัดมาแสดงเพียงบางส่วน) หลังจากทำคำสั่ง ./configure

ข้อสังเกต: ไฟล์ 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
ตัวอย่างการทำคำสั่ง wget เพื่อดาวน์โหลดไฟล์ .hex จาก Github

สร้างไฟล์ชื่อ 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"
อุปกรณ์ ULINK2 และบอร์ด ATSAMD21 เชื่อมต่อโดยใช้สาย Adapter (SWD interface)
ตัวอย่างข้อความที่ปรากฏเมื่อทำคำสั่ง openocd (version 0.10.0) เพื่อใช้งานกับ ULINK2

ถ้าจะเปลี่ยนจากอุปกรณ์ ARM-KEIL ULINK2 เป็น SEGGER J-LINK ก็ให้แก้ไขไฟล์ openocd.cfg เพื่อเรียกใช้ interface ตามตัวอย่างต่อไปนี้

ไฟล์ openocd.cfg แก้ไขใหม่เพื่อใช้กับ SEGGER J-LINK
ตัวอย่างข้อความที่ปรากฏเมื่อทำคำสั่ง openocd (version 0.10.0) เพื่อใช้งานกับ J-LINK V9
อุปกรณ์ J-LINK v9 และบอร์ด ATSAMD21 เชื่อมต่อโดยใช้สาย Adapter (SWD interface)

Creative Commons, Attribution-Non Commercial-Share Alike 4.0 International (CC BY-NC-SA 4.0)

--

--

<rawat.s>
<rawat.s>

Written by <rawat.s>

I'm Thai and working in Bangkok/Thailand.

No responses yet