MPLAB-X IDE with ATSAMD21

<rawat.s>
5 min readJul 13, 2020

--

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

บทความนี้นำเสนอการใช้งานซอฟต์แวร์ 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 ก็ได้

ตัวเลือกสำหรับการฝึกเขียนโปรแกรมไมโครคอนโทรลเลอร์ 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 มีดังนี้

  1. สร้างโปรเจกต์ใหม่ ตั้งชื่อโปรเจกต์ เลือก Device เป้าหมายเป็น ATSAMD21G18A เลือกไดเรกทอรีสำหรับโปรเจกต์ เลือก Compiler Toolchain ไปตามลำดับ
  2. สร้างไฟล์ main.c เพิ่มไว้ในโปรเจกต์ และทดลองเขียนโค้ดตามตัวอย่าง (LED Blink ที่ขา PA27)
  3. คอมไพล์โค้ดในโปรเจกต์ (Build Main Project)
  4. จำลองการทำงานของโค้ดโดยใช้ Simulator
  5. โปรแกรมไฟล์ .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 คงเป็นลำดับถัดไปในการเรียนรู้และใช้งานไมโครคอนโทรลเลอร์ตระกูลนี้

--

--

<rawat.s>
<rawat.s>

Written by <rawat.s>

I'm Thai and working in Bangkok/Thailand.

No responses yet