← Back to list

ATSAMD21 Programming: Using Atmel START & Advanced Software Framework 4

— บทความภาษาไทย

<rawat.s> · 2020-02-14 07:19 · 1 claps · 4.5 min read
#embedded-systems #atsamd21
Open on Medium ↗
Wiki topics: 💻 · Programming

ATSAMD21 Programming: Using Atmel START & Advanced Software Framework 4

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

บทความก่อนหน้านี้ ได้สาธิตการใช้งาน AVR Studio 7 และเขียนโค้ดสำหรับ **ATSAMD21 โดยใช้ไลบรารีของ Advanced Software Framework 3 (ASF3) และใช้ ASF Wizard **เพื่อเลือกและนำไลบรารีมาใช้ในโปรเจกต์

ในบทความนี้ลองมาดูการสร้างโปรเจกต์ใหม่ โดยใช้ **Atmel START เพื่อลองใช้คำสั่งฟังก์ชัน (API) ของ Advanced Software Framework 4 (ASF4) เป็นตัวอย่าง เช่น การใช้ GUI Tool สร้างโปรเจกต์ใหม่พร้อมกับการตั้งค่าใช้งานวงจรสร้างสัญญาณ Clocks ภายในชิป ATSAMD21 และการใช้งานวงจร SERCOM สำหรับโหมด UART **เป็นต้น

ภาพรวมการใช้ซอฟต์แวร์และฮาร์ดแวร์สำหรับการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ATSAMD21

ภาพรวมการใช้ซอฟต์แวร์และฮาร์ดแวร์สำหรับการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ATSAMD21

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

  • เปิดใช้งาน AVR Studio 7
  • ทำเมนูคำสั่ง New > Atmel START Project เพื่อใช้ Atmel START GUI Tool สำหรับการสร้างโปรเจกต์ (แทนการใช้ ASF Wizard)
  • เลือกชิปไมโครคอนโทรลเลอร์เป้าหมายเป็น ATSAMD21G18A
  • ตั้งชื่อโปรเจกต์ใหม่ให้เหมาะสม (ชื่อเริ่มต้น MY PROJECT)
  • เปิดหน้า Clock Configurator เพื่อตั้งค่าสำหรับการสร้างสัญญาณ Clocks ภายใน MCU
  • สร้างโปรเจกต์ (Generate Project) เป็นแบบ Atmel START เพื่อใช้ใน AVR Studio
  • เขียนโค้ดตามตัวอย่างลงในไฟล์ main.c
  • ทำขั้นตอน Build Project เพื่อคอมไพล์โค้ดในโปรเจกต์
  • เชื่อมต่อกับอุปกรณ์ Segger J-Link ไปยังบอร์ดไมโครคอนโทรลเลอร์
  • ตั้งค่าการใช้งานสำหรับ Tool โดยเลือก J-Link SWD เพื่อการโปรแกรมหรือดีบักในฮาร์ดแวร์
  • ทำขั้นตอนอัปโหลดโปรแกรมไปยังบอร์ดทดลอง แล้วสังเกตผลการทำงานของฮาร์ดแวร์

การสร้างโปรเจกต์ใหม่โดยใช้ Atmel START

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

เริ่มต้นขั้นตอนการสร้างโปรเจกต์ใหม่โดยใช้ Atmel START ซึ่งจะเห็นได้ว่า มีความแตกต่างจากการใช้ ASF Wizard

เริ่มต้นสร้างโปรเจกต์ใหม่โดยการเลือกชิปเป้าหมาย

เริ่มต้นสร้างโปรเจกต์ใหม่โดยการเลือกชิปเป้าหมาย

เข้าสู่หน้า Dashboard ของ Atmel START

เข้าสู่หน้า Dashboard ของ Atmel START

ตั้งชื่อโปรเจกต์ใหม่ (เช่น samd21_led_blink-1)

ตั้งชื่อโปรเจกต์ใหม่ (เช่น samd21_led_blink-1)

การตั้งค่าสำหรับการสร้างสัญญาณ Clocks ภายใน MCU

การตั้งค่าสำหรับการสร้างสัญญาณ Clocks ภายใน MCU

ตัวอย่างการตั้งค่าเพื่อใช้ความถี่ 48MHz สำหรับ CPU

ตัวอย่างการตั้งค่าเพื่อใช้ความถี่ 48MHz สำหรับ CPU

การกำหนดค่าสำหรับแต่ละบล็อกของ Clock Configurator มีดังนี้

รายละเอียดการตั้งค่าในส่วนของบล็อก CPU Clock Setting

รายละเอียดการตั้งค่าในส่วนของบล็อก CPU Clock Setting

ข้อสังเกต: เนื่องจากใช้ CPU ความถี่ 48MHz การตั้งค่าสำหรับ NVM Wait States จะต้องเปลี่ยนจาก 0 เพิ่มขึ้นเป็น 1

รายละเอียดการตั้งค่าในส่วนของบล็อก XOSC32K

รายละเอียดการตั้งค่าในส่วนของบล็อก XOSC32K

รายละเอียดการตั้งค่าในส่วนของบล็อก GCLK0

รายละเอียดการตั้งค่าในส่วนของบล็อก GCLK0

รายละเอียดการตั้งค่าในส่วนของบล็อก GCLK1

รายละเอียดการตั้งค่าในส่วนของบล็อก GCLK1

รายละเอียดการตั้งค่าในส่วนของบล็อก DFLL

รายละเอียดการตั้งค่าในส่วนของบล็อก DFLL

ในตัวอย่างนี้เราจะใช้ XOSC32K จากภายนอกที่มีความถี่ 32.768 kHz เป็นสัญญาณอินพุตให้ Generic Clock Generator 1 ( GCLK1) เอาต์พุตจาก GCLK1 จะถูกนำไปป้อนเป็นอินพุตให้วงจร DFLL48M และจะได้ความถี่ 48MHz จากนั้นจึงนำไปป้อนให้ GCLK0 สำหรับ CPU ในลำดับถัดไป

เมื่อตั้งค่าได้ถูกต้องตามตัวอย่างแล้ว ถัดไปให้กดปุ่ม GENERATE PROJECT เพื่อสร้างโปรเจกต์แล้วลองเขียนโค้ด

เมื่อกดปุ่ม GENERATE PROJECT เพื่อสร้างไดเรกทอรีและไฟล์ต่าง ๆ ไว้ภายใน

เมื่อกดปุ่ม GENERATE PROJECT เพื่อสร้างไดเรกทอรีและไฟล์ต่าง ๆ ไว้ภายใน

โค้ดตัวอย่าง: LED Blink

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

ถัดไปเป็นการเขียนโค้ดตามตัวอย่างลงไฟล์ main.c เพื่อสาธิตการทำให้หลอด LED กระพริบ ซึ่งจะต้องนำมาต่อใช้งานกับขา PA17 เพื่อเป็นเอาต์พุต

เปิดไฟล์ main.c ในโปรเจกต์ใหม่

เปิดไฟล์ main.c ในโปรเจกต์ใหม่

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

#include <atmel_start.h>
#include <hal_gpio.h>
#include <hal_delay.h>
#define LED_PIN  GPIO(GPIO_PORTA, 17)
int main(void) {
  atmel_start_init(); // initialize the system
  // set the direction of PA17 pin to output
  gpio_set_pin_direction( LED_PIN, GPIO_DIRECTION_OUT );
  while (1) {
    gpio_toggle_pin_level( LED_PIN ); // toggle output
    delay_ms( 100 ); // delay for 100 msec
  }
}

เขียนโค้ดตามตัวอย่างและทำขั้นตอน Build

เขียนโค้ดตามตัวอย่างและทำขั้นตอน Build

เมื่อเขียนโค้ดตามตัวอย่างและทำขั้นตอน Build ได้สำเร็จแล้ว ถัดไปเป็นการตั้งค่าเพื่อใช้อุปกรณ์ SWD Programmer / Debugger

เชื่อมต่อกับอุปกรณ์ Segger J-Link ไปยังบอร์ดไมโครคอนโทรลเลอร์

เชื่อมต่อกับอุปกรณ์ Segger J-Link ไปยังบอร์ดไมโครคอนโทรลเลอร์

ตั้งค่า Project Properties สำหรับ Tools: เลือกใช้อุปกรณ์ J-Link SWD Interface

ตั้งค่า Project Properties สำหรับ Tools: เลือกใช้อุปกรณ์ J-Link SWD Interface

ตัวอย่างอุปกรณ์ที่ได้นำมาใช้ทดสอบการทำงานของโค้ดตัวอย่าง

ตัวอย่างอุปกรณ์ที่ได้นำมาใช้ทดสอบการทำงานของโค้ดตัวอย่าง

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

เราอาจจะลองเขียนโค้ดโดยใช้วิธีเข้าถึงรีจิสเตอร์ของ GPIO ก็ได้ (Bare-Metal Programming Style) ดังนี้

#include <atmel_start.h>
#include <hal_delay.h>
int main(void) {
   atmel_start_init(); // initialize the system
   // set the direction of PA17 pin to output
   REG_PORT_DIRSET0 = PORT_PA17;
   while (1) {
      // toggle the output
      REG_PORT_OUTTGL0 = PORT_PA17;
      delay_ms( 100 ); // delay for 100 msec
  }
}

โค้ดตัวอย่าง: Serial Output

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

ถัดไปเป็นตัวอย่างการตั้งค่าใหม่ให้โปรเจกต์ โดยใช้ Atmel START และเขียนโค้ดให้สามารถใช้งานวงจร SERCOM (Serial Communication) ภายใน ATSAMD21 โดยนำมาใช้ในโหมด UART (Universal Asynchronous Receiver Transmitter) ตั้งค่า Baudrate เป็น 115200

เริ่มต้นด้วยการทำเมนูคำสั่ง Project > Re-configure Atmel Start Project .. จากนั้นเมื่อเข้าสู่หน้า Atmel START ให้กดปุ่ม Add Software Component แล้วค้นหาคำว่า USART ในประเภท Drivers จากนั้นกดปุ่ม Add Component(s)

เข้าสู่ขั้นตอนการสร้างเลือกใช้ Software Components สำหรับโปรเจกต์

เข้าสู่ขั้นตอนการสร้างเลือกใช้ Software Components สำหรับโปรเจกต์

ค้นหาและเลือก USART Drivers

ค้นหาและเลือก USART Drivers

เลือกใช้ SERCOM2 และใช้ขา PA10 และ PA11 เป็น TX และ RX ตามลำดับ

ตัวอย่างการตั้งค่าสำหรับ SERCOM2 เพื่อใช้งานเป็น UART (ส่วนที่ 1)

ตัวอย่างการตั้งค่าสำหรับ SERCOM2 เพื่อใช้งานเป็น UART (ส่วนที่ 1)

ตั้งค่า Baudrate เป็น 115200 และเลือก No Parity Bit, One-Stop Bit, 8-bit Character Size

ตัวอย่างการตั้งค่าสำหรับ SERCOM2 เพื่อใช้งานเป็น UART (ส่วนที่ 2)

ตัวอย่างการตั้งค่าสำหรับ SERCOM2 เพื่อใช้งานเป็น UART (ส่วนที่ 2)

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

ในหน้า Clock Configuration เปิดใช้งาน GCLK3 (Generic Clock Generator 3) ตามตัวอย่างเพื่อนำไปใช้กับ USART_0 โดยสามารถเลือกใช้เป็น Slow Clock สำหรับ USART_0 ได้

ในกรณีนี้ ความถี่ของสัญญาณอินพุตสำหรับ GCLK3 รับมา 48MHz จาก DFLL48M แล้วตั้งค่าตัวหารเป็น 6 ให้ได้ความถี่ 8MHz

การตั้งค่าสำหรับ Clocks ในหน้า Tab: Clock Configurator

การตั้งค่าสำหรับ Clocks ในหน้า Tab: Clock Configurator

เปิดใช้งาน GCLK3 เพิ่ม และตั้งค่าความถี่ เพื่อนำไปใช้งานกับ Peripherals อื่น ๆ ได้

เปิดใช้งาน GCLK3 เพิ่ม และตั้งค่าความถี่ เพื่อนำไปใช้งานกับ Peripherals อื่น ๆ ได้

ถ้าเปิดดูใน PINMUX (Pin Multiplexing) Configurator จะเห็นได้ว่า ขา PA10 และ PA11 ได้ถูกตั้งค่าให้ใช้งานเป็นขา TX และ RX ตามลำดับ

การตั้งค่าในส่วนของ PINMUX Configurator

การตั้งค่าในส่วนของ PINMUX Configurator

ขั้นตอนสุดท้ายคือ กดปุ่ม GENERATE PROJECT เพื่อสร้างไฟล์เพิ่มลงในโปรเจกต์ จากนั้นจะปรากฏหน้าต่าง Popup กดปุ่ม OK

กดปุ่ม GENERATE PROJECT เพื่อสร้างไฟล์เพิ่มลงในโปรเจกต์

กดปุ่ม GENERATE PROJECT เพื่อสร้างไฟล์เพิ่มลงในโปรเจกต์

ถัดไปให้เขียนโค้ดตามตัวอย่างต่อไปนี้ แก้ไขและบันทึกลงในไฟล์ main.c แล้วทำขั้นตอน Build

#include <atmel_start.h>
#include <hal_gpio.h>
#include <hal_delay.h>
#include <stdio.h>
#include <string.h>
#define LED_PIN  GPIO(GPIO_PORTA, 17)
// global variable
struct io_descriptor *serial;
void usart_init(void) {
  usart_sync_get_io_descriptor( &USART_0, &serial );
  usart_sync_enable( &USART_0 );
}
int main(void) {
  atmel_start_init(); // initialize the system
  usart_init(); // initialize usart

  // set the direction of PA17 pin to output
  gpio_set_pin_direction( LED_PIN, GPIO_DIRECTION_OUT );

  char sbuf[32];
  uint32_t cnt = 0;
  while (1) {
    sprintf( sbuf, "Count: [%04lu]\r\n", cnt++ );
    io_write( serial, (uint8_t*) sbuf, strlen(sbuf) );
    gpio_toggle_pin_level( LED_PIN ); // toggle output
    delay_ms( 100 );
  }
}

การทดสอบการทำงานของ Serial นั้นจะต้องมีอุปกรณ์ USB-to-Serial Module (3.3V logic) แล้วนำมาต่อที่ขาสัญญาณ PA10 & PA11 และต่อขา Ground ร่วมกันทั้งระบบ

เมื่ออัปโหลดโปรแกรมไปยังบอร์ด แล้วเปิดโปรแกรมเช่น Arduino Serial Monitor ก็จะสามารถรับข้อความที่ส่งมายังบอร์ดได้ตามรูปตัวอย่าง

จากการนำเสนอเนื้อหาในบทความนี้ เราพอจะเห็นแนวทางการใช้ซอฟต์แวร์ เช่น Atmel START เพื่อเลือกใช้และตั้งค่าการใช้งานโมดูลหรือไลบรารีที่ได้เลือกมาเป็นตัวอย่าง และพอจะเห็นความแตกต่างในรูปแบบและวิธีเขียนโค้ดสำหรับ ATSAMD21 เช่น รูปแบบ Bare-Metal C Programming และการใช้ ASF Wizard ที่ได้นำเสนอไปในบทความก่อนหน้านี้แล้ว ผู้อ่านที่สนใจการใช้งานคำสั่งต่าง ๆ ของ Atmel ASF4 สามารถศึกษาเพิ่มเติมได้จาก **ASF4 API Reference Manual**

ตามที่ได้ทราบกันว่า บริษัท Atmel ได้กลายเป็นส่วนหนึ่งของบริษัท Microchip ในปีค.ศ. 2016 ดังนั้นย่อมต้องมีการเปลี่ยนแปลงหลายอย่าง โดยเฉพาะอย่างยิ่งในส่วนของซอฟต์แวร์ ยกตัวอย่างเช่น ซอฟต์แวร์ MPLAB-X IDE และ XC32/32++ Compilers ของ Microchip ก็รองรับการใช้งานไมโครคอนโทรลเลอร์ SAM (ARM Cortex-M) Series ของ Atmel ดังนั้นในอนาคต เราก็คงต้องมาลองศึกษาใช้งานซอฟต์แวร์ของ Microchip เช่น MPLAB-X เป็นต้น

ก่อนจบบทความนี้: สิ่งหนึ่งที่สำคัญ ไม่ว่าจะใช้วิธีใด (เครื่องมือและซอฟต์แวร์) การทำความเข้าใจเกี่ยวกับการทำงานภายใน MCU ในระดับฮาร์ดแวร์ (เช่น สิ่งที่เขียนไว้ในเอกสาร Datasheet ของผู้ผลิต) ก็ยังถือเป็นพื้นฐานและเงื่อนไขที่สำคัญในการเขียนโค้ดให้ถูกต้องและมีประสิทธิภาพ


메타데이터
post_id
cf9a3937c12e
slug
atsamd21-programming-using-atmel-start-advanced-software-framework-4-cf9a3937c12e
url
https://medium.com/@rawats/atsamd21-programming-using-atmel-start-advanced-software-framework-4-cf9a3937c12e
canonical_url
https://medium.com/@rawats/atsamd21-programming-using-atmel-start-advanced-software-framework-4-cf9a3937c12e
author_url
https://medium.com/@rawats
status
ok
fetched_at
2026-07-16 00:29:35