>ตัวอย่างใช้งาน>
>N32G031_LED_SEQUENCE

ไล่ลำดับ LED บนบอร์ด

N32G031_LED_SEQUENCE

บทนำ

โปรเจกต์เบื้องต้นที่ออกแบบมาเพื่อสอนการควบคุม GPIO (General Purpose Input/Output) พื้นฐานโดยใช้ไมโครคอนโทรลเลอร์ N32G031 โปรเจกต์นี้ต่อยอดจาก "Hello World" พื้นฐานโดยการควบคุม LED บนบอร์ดตามลำดับที่ขา PB1, PB3, PB6 และ PB7 ซึ่งเป็นเครื่องมือที่ยอดเยี่ยมในการทำความเข้าใจลอจิกตามลำดับและฟังก์ชันกำหนดเวลาโดยไม่จำเป็นต้องต่อสายภายนอก โปรเจกต์นี้ได้รับการปรับแต่งอย่างเต็มที่สำหรับเวิร์กโฟลว์ข้ามแพลตฟอร์มโดยใช้ UnityMbed

ไมโครคอนโทรลเลอร์เป้าหมาย

Nations N32G031 Cortex-M0

ขาที่ใช้งาน

PB1, PB3, PB6, PB7

โหมด

LED บนบอร์ด (วิ่งสลับ)

วิดีโอสาธิตการทำงาน

การต่อวงจร

ไม่ต้องต่อสายไฟภายนอก: โปรเจกต์นี้ใช้ไฟ LED ที่ติดตั้งมาบนบอร์ด UnityMbed Starter Kit โดยตรง สามารถสังเกตกลุ่มหลอดไฟ LED บนบอร์ดซึ่งมีตัวอักษรระบุขา PB7, PB6, PB3 และ PB1 ชัดเจน

อุปกรณ์ (Device)ขาอุปกรณ์ (Pin)ขาบอร์ด N32G031หมายเหตุ & คำแนะนำ
LED บนบอร์ด 1LED 1PB1หลอด LED บนบอร์ดตัวที่ 1
LED บนบอร์ด 2LED 2PB3หลอด LED บนบอร์ดตัวที่ 2
LED บนบอร์ด 3LED 3PB6หลอด LED บนบอร์ดตัวที่ 3
LED บนบอร์ด 4LED 4PB7หลอด LED บนบอร์ดตัวที่ 4

การทำงาน & ลอจิกการทำงาน

เมื่อจ่ายไฟและแฟลชโค้ดลงบอร์ดแล้ว ไมโครคอนโทรลเลอร์จะทำงานตามลูปต่อไปนี้อย่างต่อเนื่องเพื่อสร้างเอฟเฟกต์ไฟวิ่ง (Chasing Effect):

ขั้นตอนที่ 1 : กำหนดรีจิสเตอร์ GPIOB

เปิด Clock & กำหนด PMODE/POTYPE

เปิด Clock ผ่าน RCC->APB2PCLKEN บิต 3 และตั้งค่า PMODE/POTYPE สำหรับขา PB1, PB3, PB6, PB7 ให้เป็น Push-Pull Output

ขั้นตอนที่ 2 : ลูปไฟวิ่งตามลำดับ

ควบคุม PBSC Set/Reset ทีละขา

สั่ง ON ขา PB1 -> หน่วงเวลา -> สั่ง OFF แล้วส่งต่อไปยัง PB3 -> PB6 -> PB7 และวนกลับมาเริ่มต้นใหม่

main.c
// UnityMbed — ไฟ LED วิ่งตามลำดับที่ขา PB1, PB3, PB6, PB7 @ N32G031
#include "n32g031.h"

static void delay(volatile uint32_t n) { while (n--) __NOP(); }

int main(void) {
  /* เปิดสัญญาณนาฬิกา (Clock) ให้กับพอร์ต GPIOB ผ่าน APB2 บิตที่ 3 */
  RCC->APB2PCLKEN |= (1u << 3);

  /* กำหนดขา PB1, PB3, PB6, PB7 เป็น Push-Pull Output */
  // เคลียร์บิต PMODE สำหรับ PB1[3:2], PB3[7:6], PB6[13:12], PB7[15:14]
  GPIOB->PMODE &= ~((0x3U << 2) | (0x3U << 6) | (0x3U << 12) | (0x3U << 14));
  // ตั้งค่า PMODE เป็น 01 (General purpose output mode)
  GPIOB->PMODE |=  ((0x1U << 2) | (0x1U << 6) | (0x1U << 12) | (0x1U << 14)); 
  
  // เคลียร์บิต POTYPE ให้เป็น 0 (Push-pull) สำหรับ PB1, PB3, PB6, PB7
  GPIOB->POTYPE &= ~((1U << 1) | (1U << 3) | (1U << 6) | (1U << 7));                                 
  
  // ปิดไฟ LED ทั้งหมดในตอนเริ่มต้น (เขียนค่า 1 ไปยัง 16 บิตบนของ PBSC เพื่อเคลียร์ขา)
  GPIOB->PBSC = (1U << (1 + 16)) | (1U << (3 + 16)) | (1U << (6 + 16)) | (1U << (7 + 16));

  while (1) {
      // PB1 เปิด (ON)
      GPIOB->PBSC = (1U << 1);
      delay(400000);
      GPIOB->PBSC = (1U << (1 + 16)); // PB1 ปิด (OFF)
      
      // PB3 เปิด (ON)
      GPIOB->PBSC = (1U << 3);
      delay(400000);
      GPIOB->PBSC = (1U << (3 + 16)); // PB3 ปิด (OFF)
      
      // PB6 เปิด (ON)
      GPIOB->PBSC = (1U << 6);
      delay(400000);
      GPIOB->PBSC = (1U << (6 + 16)); // PB6 ปิด (OFF)
      
      // PB7 เปิด (ON)
      GPIOB->PBSC = (1U << 7);
      delay(400000);
      GPIOB->PBSC = (1U << (7 + 16)); // PB7 ปิด (OFF)
  }
}

ไอเดียการเรียนรู้ & ต่อยอดด้วย AI

จากการวิเคราะห์สถาปัตยกรรมโค้ดและโครงสร้างการทำงาน ผู้เรียนสามารถต่อยอดร่วมกับ UnityMbed AI Copilot ได้ดังนี้:

1

การควบคุมหลายขาพร้อมกัน (Multi-Pin Control)

ทำความเข้าใจสถานะ HIGH (ON) และ LOW (OFF) รวมถึงวิธีการจัดการและควบคุมหลายขา GPIO พร้อมกันผ่าน Bitwise Operations

2

ปรับความเร็วแอนิเมชัน (Speed & Fluidity)

แนะนำให้ลองแก้ค่า delay(400000) ในโค้ด เช่น เปลี่ยนเป็น 50000 จะทำให้ลำดับไฟวิ่งดูเนียนตาและรวดเร็วขึ้นอย่างไร

3

เอฟเฟกต์ไฟวิ่งไป-กลับ (Knight Rider Scanner)

ให้ผู้เรียนลองใช้ AI Prompt เพื่อปรับลูปให้ไฟวิ่งไป-กลับ (PB1 -> PB3 -> PB6 -> PB7 -> PB6 -> PB3 -> PB1)

4

การกระพริบคู่แบบสมมาตร (Symmetric Pairs)

ลองขอให้ AI เขียนลอจิกสั่งเปิด PB1 และ PB7 พร้อมกัน ตามด้วย PB3 และ PB6 พร้อมกันเพื่อสร้างจังหวะผีเสื้อขยับปีก

คู่มือการ Build และ Flash

1

เปิดโปรเจกต์ (Open Project): เปิดโฟลเดอร์โปรเจกต์นี้ใน IDE โดยตรง

2

Build & Flash: เพียงคลิกปุ่ม Build และ Flash บนแถบเครื่องมือของอินเทอร์เฟซ