Using GNU ARM Embedded Toolchain (Ubuntu) with ATSAMD21

<rawat.s>
4 min readFeb 3, 2020

--

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

บทความนี้นำเสนอการติดตั้งและใช้งานโปรแกรม 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-objcopy
TARGET=$(notdir $(CURDIR))
ELF=$(TARGET).elf
LDFLAGS+= -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) ในบรรทัดเดียวตามตัวอย่างต่อไปนี้

การแก้ไขในส่วนของ Memory ในไฟล์ Linker Script

ทำขั้นตอนสุดท้าย เพื่อเรียกใช้คำสั่ง OpenOCD

File: openocd.cfg

## Select ST-LINK/V2 programmer
source [find interface/stlink.cfg]
transport select hla_swd
set CHIPNAME at91samd21g18
set CPUTAPID 0x0bc11477
set ENDIAN little
telnet_port disabled
reset_config srst_nogate
#reset_config srst_only
adapter_nsrst_delay 100
adapter_nsrst_assert_width 100
source [find target/at91samdXX.cfg]
ตัวอย่างข้อความที่ปรากฏเมื่อทำคำสั่ง make flash เพื่อเขียนไฟล์ .bin ไปยังชิปเป้าหมาย
ตัวอย่างอุปกรณ์ที่ได้นำมาทดลอง
ตัวอย่างคลื่นสัญญาณเอาต์พุตที่วัดได้

การติดตั้ง 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)

--

--

<rawat.s>
<rawat.s>

Written by <rawat.s>

I'm Thai and working in Bangkok/Thailand.

No responses yet