ขั้นตอนการดำเนินการ
- ติดตั้ง MSYS2 สำหรับระบบปฏิบัติการ Windows 10 (64-bit)
- ติดตั้ง Packages ต่าง ๆ ที่จำเป็นต้องใช้สำหรับการคอมไพล์ OpenOCD Source Code
- ทำขั้นตอน Build สำหรับ OpenOCD
- ทดลองใช้งาน OpenOCD กับอุปกรณ์ ST-Link/V2 สำหรับบอร์ดไมโครคอนโทรลเลอร์ ATSAMD21G18 โดยเชื่อมต่อแบบ SWD
ดาวน์โหลดและติดตั้ง MSYS2 สำหรับ Windows 10 (64-bit)
ไฟล์ MSYS2 Installer สามารถดาวน์โหลดได้จากเว็บ https://www.msys2.org/ แยกเป็นไฟล์สำหรับระบบ 32 บิต และ 64 บิต ในบทความนี้ได้ดาวน์โหลดไฟล์ msys2-x86_64–20190524.exe
มาสำหรับการติดตั้งใช้งาน จากนั้นก็เริ่มต้นทำขั้นตอนติดตั้งไปตามลำดับ
เมื่อเปิดหน้าต่าง Shell / Terminal ของ MSYS2-MINGW64 ให้ทำคำสั่งต่อไปนี้ตามลำดับ เพื่ออัปเดตและอัปเกรดซอฟต์แวร์
$ pacman -Syu
$ pacman -Su
จากนั้นก็ทำคำสั่งเพื่อติดตั้งโปรแกรมเพิ่มดังนี้
$ pacman -S --disable-download-timeout autoconf automake git make cmake nano libtool pkg-config texinfo p7zip tar$ pacman -S --disable-download-timeout mingw-w64-x86_64-toolchain$ pacman -S --disable-download-timeout mingw-w64-x86_64-libusb mingw-w64-x86_64-hidapi mingw-w64-x86_64-libftdi
ดาวน์โหลดและคอมไพล์ซอร์สโค้ดสำหรับ OpenOCD
ขั้นตอนถัดไปเป็นการดาวน์โหลดซอร์สโค้ดของ OpenOCD โดยใช้คำสั่ง git แล้วเริ่มขั้นตอน Build
$ git clone https://github.com/ntfreak/openocd.git$ cd openocd/$ ./bootstrap$ ./configure --disable-doxygen-html --disable-doxygen-pdf $ make && make install
ข้อสังเกต: ในการกรณีที่ต้องการใช้ OpenOCD ร่วมกับ ST-Link/V2 สำหรับชิปตระกูล ATSAMD21 ให้แก้ไขไฟล์ src/flash/nor/at91samd.c
ของ OpenOCD ดังต่อไปนี้ ก่อนทำขั้นตอน make
ในโค้ดของฟังก์ชัน
samd_issue_nvmctrl_command()
ให้เปลี่ยนจากการใช้ฟังก์ชันtarget_write_u16()
แก้ไขเป็นtarget_write_u32()
เมื่อทำขั้นตอนทั้งหมดได้แล้ว ลองทำคำสั่งต่อไปนี้ เพื่อลองเรียกใช้คำสั่ง openocd
$ /mingw64/bin/openocd --version
และจะได้ตัวอย่างข้อความเอาต์พุตดังนี้
Open On-Chip Debugger 0.10.0+dev-01040... (2020-03-04-16:05)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
ไฟล์ต่าง ๆ ที่เกี่ยวข้องกับการใช้งาน OpenOCD จะอยู่ภายใต้ไดเรกทอรี /mingw64/share/openocd/
ถ้าเราจะนำ OpenOCD ไปใช้แบบ Command Line เช่น ด้วยวิธีการเรียกใช้คำสั่งใน Windows Command Shell (ไม่ได้ใช้งานผ่าน MSYS2 Terminal) ก็ให้สร้างเป็นไดเรกทอรีใหม่ แล้วสำเนาไฟล์ที่จำเป็นสำหรับการใช้งาน OpenOCD ไปใส่ไว้ ตามตัวอย่างนี้ได้นำไปไว้ในไดเรกทอรีที่เราสร้างขึ้นมาใหม่คือ C:\Tools\OpenOCD
ให้ทำคำสั่งใน MSYS2 Terminal ตามลำดับดังนี้
$ export OPENOCD="/c/Tools/OpenOCD"$ mkdir -p $OPENOCD/bin $ cp /mingw64/bin/openocd.exe $OPENOCD/bin $ cp /mingw64/bin/libftdi1.dll $OPENOCD/bin$ cp /mingw64/bin/libhidapi-0.dll $OPENOCD/bin $ cp /mingw64/bin/libusb-1.0.dll $OPENOCD/bin $ mkdir -p $OPENOCD/share$ cp -R /mingw64/share/openocd $OPENOCD/share
การสาธิตใช้งาน OpenOCD for Windows ร่วมกับอุปกรณ์ ST-Link/V2
เมื่อได้โปรแกรม OpenOCD สำหรับ Windows ไว้ใช้งานในเครื่องคอมพิวเตอร์ของเราแล้ว ถัดไปลองมาใช้คำสั่ง openocd
สำหรับการเขียนไฟล์ Arduino Zero Bootloader ไปยังบอร์ดไมโครคอนโทรลเลอร์ RobotDyn SAMD21 M0-Mini โดยใช้อุปกรณ์ ST-Link/V2 (Clone) และใช้รูปแบบการเชื่อมต่อที่เรียกว่า SWD (Serial Wire Debug) โดยเชื่อมต่อสายเพียง 3 เส้นคือ {SWDIO, SWCLK, GND} ไม่จำเป็นต้องต่อขาไฟเลี้ยง 3.3V เนื่องจากจะใช้วิธีป้อนแรงดันไฟเลี้ยงให้บอร์ด SAMD21 M0-Mini ผ่านทางพอร์ต MicroUSB
ก่อนจะใช้งาน OpenOCD จะต้องสร้างไฟล์ openocd.cfg
สำหรับการตั้งค่าใช้งาน OpenOCD Configuration ดังนี้
source [find interface/stlink.cfg]
transport select hla_swdset CHIPNAME at91samd21g18
set CPUTAPID 0x0bc11477
set ENDIAN littletelnet_port disabled
adapter_nsrst_delay 100
adapter_nsrst_assert_width 100source [find target/at91samdXX.cfg]reset_config none
ถัดไปเป็นการทำคำสั่งเพื่อดาวน์โหลดไฟล์ Arduino Zero Bootloader จาก Github
$ wget https://github.com/arduino/ArduinoCore-samd/raw/master/bootloaders/zero/samd21_sam_ba.bin
จากนั้นให้เชื่อมต่อบอร์ด ATSAMD21 ผ่านอุปกรณ์ ST-Link/V2 ไปยังพอร์ต USB ของคอมพิวเตอร์ แล้วทำคำสั่งดังนี้
$ openocd -d2 -f ./openocd.cfg \
-c "init; targets; reset halt;" \
-c "at91samd chip-erase;" \
-c "at91samd bootloader 0;" \
-c "program samd21_sam_ba.bin verify reset;" \
-c "shutdown;"
ไฟล์ samd21_sam_ba.bin
จะถูกเขียนไว้ในหน่วยความจำ Flash ของชิป ATSAMD21G18 ในช่วงแอดเดรส 0x0000 ถึง 0x2000 (8192 ไบต์)
ถ้าเรามีไฟล์ .bin ที่ได้จากการแปลงหรือคอมไพล์โค้ดของ Arduino Sketch ตามตัวอย่างต่อไปนี้ (สำหรับตัวเลือกบอร์ด Arduino Zero — Programming Port) เราก็สามารถนำมาทดลองอัปโหลดไฟล์ .bin (ในตัวอย่างนี้ระบุชื่อไฟล์เป็น leds_blink.bin
) ไปยังบอร์ด ATSAMD21 ได้
// Arduino Sketch demo for RobotDyn SAMD21 M0-Mini Board
#define LED0 13
#define LED1 25 // PB03
#define LED2 26 // PA7
#define INTERVAL_MSEC (50)uint32_t ts; // used to save timestampvoid setup() {
pinMode( LED0, OUTPUT );
pinMode( LED1, OUTPUT );
pinMode( LED2, OUTPUT );
digitalWrite( LED1, HIGH ); // LED1 output high
digitalWrite( LED2, LOW ); // LED2 output low
ts = millis(); // get current timestamp (in msec)
}int cnt = 0;void loop() {
if ( millis() - ts >= INTERVAL_MSEC ) {
ts += INTERVAL_MSEC;
digitalWrite( LED1, !digitalRead(LED1) );
digitalWrite( LED2, !digitalRead(LED2) );
cnt = (cnt+1) % 20;
if ( cnt == 0 ) {
digitalWrite( LED0, !digitalRead(LED0) );
}
}
}
ก่อนคำสั่งต่อไปนี้ ให้กดปุ่มรีเซตบนบอร์ดก่อนหนึ่งครั้ง
$ ARDUINO_BIN_FILE=leds_blink.bin
$ openocd -d2 -f ./openocd.cfg \
-c "init; targets; reset halt;" \
-c "program $ARDUINO_BIN_FILE verify 0x2000;" \
-c "reset run;" \
-c "reset run;" \
-c "shutdown;"
โดยสรุป: เราสามารถคอมไพล์ซอร์สโค้ดของ OpenOCD โดยใช้ MSYS2-MINGW64 และนำมาใช้สำหรับระบบปฏิบัติการ Windows 10 และยังได้ทดสอบการทำงานร่วมกับอุปกรณ์ ST-Link V2 (Clone) และบอร์ดไมโครคอนโทรลเลอร์ ATSAMD21G18