MPLAB-X IDE with ATSAMD21
— บทความภาษาไทย
MPLAB-X IDE with ATSAMD21
บทความนี้นำเสนอการใช้งานซอฟต์แวร์ MPLAB-X IDE ของบริษัท Microchip Technology ร่วมกับ XC32 Compiler / Toolchain เพื่อนำมาลองเขียนโปรแกรมในเบื้องต้นและใช้บอร์ดไมโครคอนโทรลเลอร์ 32 บิต ตระกูล Atmel SAMD21 (ATSAMD21G18A)
จาก Atmel Studio 7 IDE ไปสู่ MPLAB-X IDE
ถ้าจำเป็นต้องหรืออยากจะลองเปลี่ยนการใช้งานเครื่องมือ-ซอฟต์แวร์สำหรับไมโครคอนโทรลเลอร์ 32 บิต อย่างเช่น SAMD21 จากเดิมที่ใช้ Atmel Studio 7 IDE (ARM Cortex-M0+) ไปสู่การใช้งานซอฟต์แวร์ Microchip MPLAB-X IDE จะทำได้หรือไม่ ?
จากบทความที่ได้เคยแชร์ไว้ เรามีหลายตัวเลือกในการเขียนโค้ด เช่น สามารถเขียนโค้ดโดยใช้ AVR Studio 7 สำหรับบอร์ดที่ใช้ชิปไมโครคอนโทรลเลอร์ ATSAMD21 เช่น Arduino Zero มีวิธีการเขียนโค้ดแบบ Bare-Metal ด้วยภาษา C หรือ การใช้ไลบรารี **Atmel START & Advanced Software Framework 4 หรือจะ[ใช้ร่วมกับ FreeRTOS](https://medium.com/@rawat.s/using-freertos-for-atsamd21-with-avr-studio-7-and-atmel-start-2c4cfce12342)** ก็ได้

ตัวเลือกสำหรับการฝึกเขียนโปรแกรมไมโครคอนโทรลเลอร์ ATSAMD21
นอกจากนั้นเราก็สามารถใช้ Arduino Pro IDE ร่วมกับอุปกรณ์ เช่น** J-Link Debug Probe ในการเขียนโค้ดและทดสอบการทำงานหรือดีบัก (Code Debugging) ร่วมกับบอร์ดไมโครคอนโทรลเลอร์จริงได้ สามารถกำหนด Breakpoints** ในซอร์สโค้ด เพื่อหยุดการทำงานชั่วคราวได้
แต่ถ้าใช้ MPLAB-X IDE เราก็สามารถทำได้ทั้งดีบักโดยใช้ Simulator ในเบื้องต้น เช่น ดูค่าของตัวแปร ค่าของรีจิสเตอร์ภายในซีพียูหรือวงจรภายในได้ และถ้ามีอุปกรณ์ฮาร์ดแวร์สำหรับดีบัก ก็สามารถตรวจสอบการทำงานของโค้ดโดยใช้บอร์ดไมโครคอนโทรลเลอร์ในฮาร์ดแวร์จริงได้ด้วย
ขั้นตอนการดำเนินการ
- ดาวน์โหลดและติดตั้ง MPLAB-X IDE ในกรณีจะใช้สำหรับระบบปฏิบัติการ Windows 10 URL: https://www.microchip.com/mplab/mplab-x-ide
- ดาวน์โหลดและติดตั้ง XC32 Compiler สำหรับไมโครคอนโทรลเลอร์ 32 บิต (ตระกูล PIC32/SAM) URL: https://www.microchip.com/mplab/compilers
- เตรียมบอร์ดสำหรับการทดสอบโค้ดในฮาร์ดแวร์จริง โดยได้เลือกใช้บอร์ด WeMos / RobotDyn SAMD21 M0 Mini ที่ใช้ชิป ATSAMD21G18 (ARM Cortex-M0), 48 MHz, 32KB SRAM, 256KB Flash
- เตรียมอุปกรณ์ SEGGER **J-Link Debug Probe เพื่อโปรแกรมไฟล์ .hex หรือทำขั้นตอนดีบักโดยใช้ฮาร์ดแวร์ ผ่านช่องทาง SWD (Serial Wire Debug) และจะต้องมีตัวแปลงหรือ Adapter เอาไว้เสียบขา 2x5 สำหรับ SWD Interface / ICSP**

รูปภาพของบอร์ด RobotDyn SAMD21 M0 Mini (Top View)

แผนผังแสดงตำแหน่งของขาบนบอร์ด SAMD21 M0-Mini (Source: RobotDyn)

ตัวอย่างอุปกรณ์: บอร์ด SAMD21 M0-Mini และ J-Link Debug Probe + Adapter
การใช้งาน MPLAB-X IDE
ขั้นตอนการใช้งานซอฟต์แวร์ MPLAB-X IDE มีดังนี้
- สร้างโปรเจกต์ใหม่ ตั้งชื่อโปรเจกต์ เลือก Device เป้าหมายเป็น ATSAMD21G18A เลือกไดเรกทอรีสำหรับโปรเจกต์ เลือก Compiler Toolchain ไปตามลำดับ
- สร้างไฟล์
**main.cเพิ่มไว้ในโปรเจกต์ และทดลองเขียนโค้ดตามตัวอย่าง (LED Blink ที่ขา PA27**) - คอมไพล์โค้ดในโปรเจกต์ (Build Main Project)
- จำลองการทำงานของโค้ดโดยใช้ Simulator
- โปรแกรมไฟล์
**.hexไปยังบอร์ดไมโครคอนโทรลเลอร์ โดยใช้อุปกรณ์ J-Link Debug Probe (SWD)**

เปิดใช้งาน MPLAB-X IDE

สร้างโปรเจกต์ใหม่ โดยเลือกแบบ Standalone Project

เลือก Device ที่ต้องการใช้งาน: ATSAMD21G18A

ในส่วนการตั้งค่า Options > Embedded > Build Tools ระบุไดเรกทอรีที่ได้ติดตั้ง XC32 Compiler ไว้

เลือก XC32 Compiler Toolchain

ตั้งชื่อโปรเจกต์และเลือกไดเรกทอรี

กลับสู่หน้าหลักเพื่อเพิ่มไฟล์ main.c

เพิ่มไฟล์ใหม่ เลือกเป็น C Main File

ตั้งชื่อไฟล์ main.c
โค้ดตัวอย่างที่ 1
โค้ดตัวอย่างนี้ สาธิตการใช้ขา PA27 เป็นเอาต์พุต และมีการกำหนดค่าลอจิกที่ขาดังกล่าว มีสถานะลอจิกเป็น 1 หรือ 0 สลับกันไป โดยเว้นช่วงเวลา โดยเรียกใช้ฟังก์ชัน **sw_delay()** ที่ถูกสร้างขึ้นมาเพื่อหน่วงเวลา
#include <xc.h>
#define REG_PORT_DIR0 (*(volatile uint32_t *)0x41004400UL)
#define REG_PORT_OUT0 (*(volatile uint32_t *)0x41004410UL)
#define REG_PORT_OUTTGL0 (*(volatile uint32_t *)0x4100441CUL)
void sw_delay( uint32_t n ) {
for ( uint32_t i=0; i < n; i++ ) {
asm volatile("nop");
}
}
int main(int argc, char** argv) {
REG_PORT_DIR0 |= (1<<27); // PA27 as output pin
while(1) {
REG_PORT_OUT0 |= (1<<27); // output high on PA27 pin
sw_delay( 100000ul );
REG_PORT_OUT0 &= ~(1<<27); // output low on PA27 pin
sw_delay( 100000ul );
}
return 0;
}

เขียนโค้ดตามตัวอย่างในไฟล์ main.c
เราสามารถตั้งค่าสำหรับโปรเจกต์ได้ จากเมนู File > Project Properties เช่น การตั้งค่าสำหรับ Optimization Level (เริ่มจากต่ำสุดคือ 0=No Optimization) การตั้งค่าความถี่ของ CPU Clock (MHz) ในการจำลองการทำงานของโค้ดด้วย Simulator เป็นต้น

การตั้งค่าของโปรเจกต์ในส่วน Configuration

ตัวอย่างการตั้งค่าสำหรับ Optimization Level (เลือกระดับ 1 หรือ -O1)

การกำหนดความถี่เมื่อคำสั่งของ CPU (เช่น 1 MHz) เมื่อจำลองการทำงานด้วย Simulator
ถ้าเราทำขั้นตอนต่าง ๆ มาครบแล้ว ถัดไปให้ลองคอมไพล์โค้ด (กดปุ่มรูปค้อน) หรือ “Build Main Project”

คอมไพล์โค้ดได้สำเร็จแล้ว
ลองมารันโค้ดโดยใช้ Simulator เป็นลำดับถัดไป เราสามารถกำหนด Breakpoint เพื่อให้หยุดการรันโค้ดชั่วคราว โดยคลิกเลือกบรรทัดของซอร์สโค้ด นอกจากนั้นยังสามารถดูค่าของตัวแปร หรือรีจิสเตอร์ได้ (เลือกจากเมนู Window > Debugging > Watches) หรือดูค่าลอจิกของขา IO (เลือกจากเมนู Window > Simulator > IOPin) เช่น ดูการเปลี่ยนแปลงที่ขา PA27 เป็นต้น

ตัวอย่างการดูค่าของรีจิสเตอร์ประเภท SFR เช่น PORT.GROUP0OUT

ตัวอย่างการดูค่าของรีจิสเตอร์ประเภท SFR เช่น PORT.GROUP0DIR
เราสามารถเลือกบรรทัดในโค้ด **main.c ให้เป็น Breakpoints** ได้ ในรูปตัวอย่างมีการกำหนดให้บรรทัดที่ 15 และ 17 ให้หยุดการรันโค้ดชั่วคราว เมื่อทำมาถึงคำสั่งในบรรทัดดังกล่าว

ตัวอย่างการรันโค้ดหรือดีบักโดยใช้ Simulator
เมื่อเข้าสู่ขั้นตอนดีบักโดยใช้ Simulator การรันโค้ดจะหยุดเมื่อทำคำสั่งมาถึง Breakpoint แรก และถ้ากดปุ่ม Continue ก็จะทำคำสั่งไปจนถึง Breakpoint ถัดไป

การอ่านค่าเวลา Stopwatc hเมื่อมีการหยุดโดย Breakpoint แต่ละครั้ง
ลองเปลี่ยนค่าอาร์กิวเมนต์ให้ฟังก์ชัน **sw_delay() เปลี่ยนจาก `100000ul** เป็น250000ul` ซึ่งจะส่งผลต่ออัตรา I/O Toggle Rate ที่ขา PA27
เมื่อเปลี่ยนค่าดังกล่าว ก็จะต้องคอมไพล์โค้ดใหม่อีกครั้ง แล้วตามด้วยขั้นตอน Debug Main Project

ถ้ามีอุปกรณ์ J-Link Debug Probe ก็ให้เสียบสาย USB เชื่อมต่อกับคอมพิวเตอร์ แล้วไปที่ Project Properties โดยเลือก Hardware Tool เปลี่ยนจาก Simulator เป็น J-Link ในกรณี จากนั้นกดปุ่ม “Make and Program Device Main Project”

ในส่วนที่เป็น Tool ให้เลือก J-Link แทน Simulator
ในส่วน Tab ที่เรียกว่า Files เราจะเห็นไดเรกทอรีที่มีไฟล์ **.hex** ที่นำไปใช้โปรแกรมบอร์ดไมโครคอนโทรลเลอร์ได้

แสดงไดเรกทอรี่ที่มีไฟล์ .hex ที่ได้จากโปรเจกต์นี้
ถ้าทำขั้นตอนทั้งหมดได้ถูกต้อง เราจะเห็นหลอด LED ที่อยู่บนบอร์ดกระพริบ แต่ถ้าเรากดปุ่ม “Debug Main Project” โดยใช้ Hardware Tool การรันโค้ดจะหยุดเมื่อทำคำสั่งมาถึง Breakpoint แรก และถ้ากดปุ่ม Continue ก็จะทำคำสั่งไปจนถึง Breakpoint ถัดไป และเป็นการรันโค้ดในชิปไมโครคอนโทรลเลอร์
โค้ดตัวอย่างถัดไปสาธิตการเปิดใช้วงจรภายในที่เรียกว่า SysTick (24-bit) เพื่อให้นับตามคาบที่กำหนด และนับด้วยความถี่ 8 MHz (Internal OSC.) เมื่อนับครบหนึ่งคาบ ให้สร้างสัญญาณอินเทอร์รัพท์ (Interrupt) และกำหนดให้มีฟังก์ชัน Interrupt Handler ที่เกี่ยวข้อง คอยทำหน้าที่สลับสถานะลอจิกที่ขา PA27 (Port Group 0 Pin 27)
#include <xc.h>
void SysTickInit( uint32_t usec ) { // assume 8 MHz system clock
SysTick->CTRL = 0; // disable SysTick
SysTick->LOAD = (8*usec)-1; // initial start value (24-bit)
SysTick->VAL = 0; // reset counter value
NVIC_SetPriority( SysTick_IRQn, 3 ); // set interrupt priority
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk // use system clock
| SysTick_CTRL_TICKINT_Msk // enable TICKINT interrupt
| SysTick_CTRL_ENABLE_Msk; // enable SysTick
NVIC_EnableIRQ( SysTick_IRQn ); // enable SysTick interrupt
}
int main(int argc, char** argv) {
// disable clock divider (DIV8) for internal 8MHz Osc.
sysctrl_registers_t *sys_ctrl = SYSCTRL_REGS;
sys_ctrl->SYSCTRL_OSC8M &= ~SYSCTRL_OSC8M_PRESC_Msk;
// initialize system tick
SysTickInit( 500000UL );
// set PA27 as output pin
PORT_REGS->GROUP[0].PORT_DIRSET = (1<<27);
while(1) {}
return 0;
}
void SysTick_Handler(void) {
// toggle PA27 pin
PORT_REGS->GROUP[0].PORT_OUTTGL = (1<<27);
}
โดยรวม เราได้เห็นขั้นตอนการใช้งาน MPLAB-X IDE ร่วมกับ XC32 Compiler สำหรับบอร์ดไมโครคอนโทรลเลอร์ ATSAMD21G18A และเลือกได้ว่า จะดีบักโค้ดโดยใช้ Simulator หรือว่าจะใช้ Hardware Tool อย่างเช่น J-Link Debug Probe ช่วยในการทดสอบและรันโค้ดโดยใช้ฮาร์ดแวร์จริง อย่างไรก็ตามโค้ดตัวอย่างในบทความนี้ มีลักษณะเป็นแบบ Bare-Metal C และการใช้ไลบรารีหรือ API ของ Microchip คงเป็นลำดับถัดไปในการเรียนรู้และใช้งานไมโครคอนโทรลเลอร์ตระกูลนี้
메타데이터
- post_id
- 8d0e549bd609
- slug
- mplab-x-ide-with-atsamd21-8d0e549bd609
- url
- https://medium.com/@rawats/mplab-x-ide-with-atsamd21-8d0e549bd609
- canonical_url
- https://medium.com/@rawats/mplab-x-ide-with-atsamd21-8d0e549bd609
- author_url
- https://medium.com/@rawats
- status
- ok
- fetched_at
- 2026-07-16 00:29:35