บทความนี้นำเสนอการติดตั้งและใช้งานโปรแกรม GNU ARM Embedded Toolchain สำหรับ Ubuntu (16.04) เพื่อนำมาใช้เขียนโค้ดและทดลองกับบอร์ดไมโครคอนโทรลเลอร์ตระกูล ARM Cortex-M ขนาด 32 บิต (เลือกไมโครคอนโทรลเลอร์ Atmel ATSAMD21) และใช้อุปกรณ์ ST-Link/V2 SWD Programmer ร่วมกับโปรแกรมคำสั่ง OpenOCD เพื่ออัปโหลดโปรแกรมไปยังชิปเป้าหมาย
ขั้นตอนการดำเนินการมีดังนี้
- ดาวน์โหลดไฟล์ GNU ARM Embedded Toolchain (https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) เพื่อนำมาติดตั้งใช้งานสำหรับ Ubuntu Linux (64-bit) โดยได้เลือกไฟล์ต่อไปนี้มาใช้งาน
gcc-arm-none-eabi-9–2019-q4-major-x86_64-linux.tar.bz2
- ทำคำสั่งเพื่อแตกไฟล์
.tar.bz2
ไปยังไดเรกทอรีที่ต้องการ เช่น/opt/
- เพิ่มไดเรกทอรี
bin
ของ GNU ARM Embedded Toolchain ใน$PATH
ของระบบสำหรับการค้นหาและเรียกใช้คำสั่งได้ใน Linux - ลองรันคำสั่ง
arm-none-eabi-gcc --version
เพื่อดูเวอร์ชันของคำสั่ง - ดาวน์โหลดซอร์สโค้ดของ Microchip Advanced Software Framework 3 (ASF3) ซึ่งจะได้เป็นไฟล์
.zip
เพื่อนำมาแตกไฟล์ โดยเลือกไดเรกทอรี/opt
เป็นเป้าหมาย - สร้างไดเรกทอรีสำหรับโปรเจกต์ใหม่ เช่น ตั้งชื่อเป็น
samd21_led_blink
- ทำสำเนาไฟล์บางส่วนมาจากไดเรกทอรีของ ASF3 เช่น ไฟล์ต่าง ๆ สำหรับ ARM CMSIS เพื่อใช้กับ SAMD21 ไฟล์สำหรับ Startup และ Linker Script เป็นต้น
- สร้างไฟล์
main.c
และเขียนโค้ดตามตัวอย่าง เพื่อสาธิตการทำให้ LED กระพริบได้ (เลือกใช้ขา PA17 เป็นเอาต์พุต) - สร้างไฟล์
Makefile
เป็นสคริปต์คำสั่งmake
สำหรับทำขั้นตอน Build Project ได้โดยอัตโนมัติ - แก้ไขไฟล์
samd21g18a_flash.ld
ซึ่งเป็น Linker Script เพื่อให้สร้างโปรแกรมที่เริ่มต้นโดยใช้แอดเดรส0x2000
แทนการเริ่มต้นที่0x0000
และจะทำให้ไม่เกิดการเขียนทับในส่วน Arduino Bootloader ในหน่วยความจำ Flash Memory - ทำคำสั่ง
make
เพื่อทำขั้นตอน Build และจะได้ไฟล์.bin
และ.hex
ที่สามารถนำไปโปรแกรมลงในชิป ATSAMD21 ได้ - ทำคำสั่ง
make flash
ซึ่งจะเรียกใช้คำสั่งopenocd
และจะต้องใช้งานร่วมกับอุปกรณ์ ST-Link/V2 (SWD) Programmer ผ่านพอร์ต USB ของคอมพิวเตอร์ไปยังบอร์ดไมโครคอนโทรลเลอร์
OpenOCD Installation: ถ้าคอมพิวเตอร์ Ubuntu ยังไม่ได้ติดตั้งคำสั่ง OpenOCD ไว้ใช้งาน สามารถศึกษาขั้นตอนการติดตั้งใช้งานได้จากบทความนี้
คำสั่งสำหรับดาวน์โหลดและติดตั้ง GNU ARM Embedded Toolchain
$ sudo tar xjvf gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2 -C /opt $ export PATH="$PATH:/opt/gcc-arm-none-eabi-9-2019-q4-major/bin"$ arm-none-eabi-gcc --version
คำสั่งสำหรับดาวน์โหลดและติดตั้ง Microchip Advanced Software Framework 3 (ได้ลองใช้ ASF3 เวอร์ชัน 3.47 ขณะที่เขียนบทความนี้)
$ wget http://ww1.microchip.com/downloads/en/DeviceDoc/asf-standalone-archive-3.47.0.96.zip$ sudo unzip asf-standalone-archive-3.47.0.96.zip -d /opt/$ export ASF="/opt/xdk-asf-3.47.0"
ข้อสังเกต: สามารถเลือกเวอร์ชันล่าสุดได้จากเว็บนี้
คำสั่งสำหรับสร้างโปรเจกต์ใหม่ในการเขียนโค้ดเพื่อนำไปใช้กับไมโครคอนโทรลเลอร์ ATSAMD21
$ mkdir samd21_led_blink/$ cd samd21_led_blink/$ cp -R $ASF/thirdparty/CMSIS/Include ./cmsis$ cp -R $ASF/sam0/utils/cmsis/samd21/include ./include$ cp $ASF/sam0/utils/cmsis/samd21/source/system_samd21.h .$ cp $ASF/sam0/utils/cmsis/samd21/source/system_samd21.c .$ cp $ASF/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.c .$ cp $ASF/sam0/utils/linker_scripts/samd21/gcc/samd21g18a_flash.ld .
File: Makefile
LDSCRIPT = samd21g18a_flash.ld
STARTUP = startup_samd21.o system_samd21.o
PTYPE = __SAMD21G18A__OBJS=$(STARTUP) main.o# Tools
CC=arm-none-eabi-gcc
LD=arm-none-eabi-gcc
AR=arm-none-eabi-ar
AS=arm-none-eabi-as
CP=arm-none-eabi-objcopyTARGET=$(notdir $(CURDIR))
ELF=$(TARGET).elfLDFLAGS+= -T$(LDSCRIPT) -mthumb -mcpu=cortex-m0 -Wl,--gc-sections
CFLAGS+= -mcpu=cortex-m0 -mthumb -g
CFLAGS+= -I ./include -I ./cmsis -I . -O1 -Wall
CFLAGS+= -D$(PTYPE)$(ELF): $(OBJS)
$(LD) $(LDFLAGS) -o $(ELF) $(OBJS) $(LDLIBS)
$(CP) -O binary $(ELF) $(TARGET).bin
$(CP) -O ihex $(ELF) $(TARGET).hex%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(CC) -MM $(CFLAGS) $< > $*.d%.o: %.s
$(AS) $< -o $@flash: $(TARGET).bin
openocd -d2 -f ./openocd.cfg \
-c "init; targets; reset halt" \
-c "program $(TARGET).bin verify reset 0x2000" \
-c "targets; reset; exit"clean:
rm -f $(OBJS) $(OBJS:.o=.d) $(ELF) $(TARGET).bin $(TARGET).hex-include $(OBJS:.o=.d)###################################################################
File: main.c
#include <samd21.h>#define LED_PIN (1<<17)void delay_sw( uint32_t n ) { // software delay routine
uint32_t i;
while ( n-- ) {
for (i=0;i<200;i++) { __asm("nop"); }
}
}int main() {
REG_PORT_DIR0 |= LED_PIN; // PA17 output direction
while (1) {
REG_PORT_OUT0 &= ~LED_PIN; // PA17 high
delay_sw(100);
REG_PORT_OUT0 |= LED_PIN; // PA17 low
delay_sw(100);
}
}
ทำการแก้ไขไฟล์ Linker Script (samd21g18a_flash.ld
) ในบรรทัดเดียวตามตัวอย่างต่อไปนี้
ทำขั้นตอนสุดท้าย เพื่อเรียกใช้คำสั่ง OpenOCD
File: openocd.cfg
## Select ST-LINK/V2 programmer
source [find interface/stlink.cfg]
transport select hla_swdset CHIPNAME at91samd21g18
set CPUTAPID 0x0bc11477
set ENDIAN littletelnet_port disabled
reset_config srst_nogate
#reset_config srst_only
adapter_nsrst_delay 100
adapter_nsrst_assert_width 100source [find target/at91samdXX.cfg]
การติดตั้ง Arduino ZERO Bootloader สำหรับ ATSAMD21
ถ้าต้องการติดตั้ง Arduino ZERO Bootloader (สามารถดาวน์โหลดไฟล์ชื่อ samd21_sam_ba.bin
ได้จาก Github) ไปยังหน่วยความจำ Flash ในช่วงแอดเดรส 0x0000
ถึง 0x2000
(8 KB แรก) ก็สามารถได้ไม่ยาก โดยใช้คำสั่ง OpenOCD ร่วมกับอุปกรณ์ ST-Link/V2 Programmer ดังนี้
$ openocd -d2 -f openocd.cfg \
-c "init; targets; reset halt;" \
-c "at91samd chip-erase; at91samd bootloader 0;" \
-c "targets; program samd21_sam_ba.bin verify reset; shutdown"
โดยสรุป เราได้เห็นตัวอย่างขั้นตอนในการเขียนโปรแกรมภาษา C สำหรับไมโครคอนโทรลเลอร์ ATSAMD21 การเรียกใช้ GNU ARM C/C++ Compiler จากการทำคำสั่งของ Makefile แบบ Command Line รวมถึง การใช้คำสั่ง OpenOCD เพื่อโปรแกรมไปยังชิปเป้าหมาย โดยใช้งานร่วมกับอุปกรณ์ ST-Link/V2 Programmer ซึ่งมีราคาไม่แพง
Creative Commons, Attribution-Non Commercial-Share Alike 4.0 International (CC BY-NC-SA 4.0)