DMA คืออะไร?
DMA (Direct Memory Access) คือ วงจรฮาร์ดแวร์ ภายในไมโครคอนโทรลเลอร์ที่ทำหน้าที่ ย้ายข้อมูลโดยตรงระหว่างหน่วยความจำ (Memory) กับอุปกรณ์ภายนอก (Peripheral) หรือระหว่างหน่วยความจำเอง โดยไม่ต้องให้ CPU เข้าไปยุ่งเกี่ยวโดยตรง

สรุปง่าย ๆ คือ:
“การโอนข้อมูลโดยไม่ต้องรบกวน CPU”


1. โครงสร้าง DMA ใน CH32V003

  • CH32V003 มี DMA Controller หนึ่งชุด
  • รองรับ 7 Channel อิสระ (หมายถึงสามารถกำหนดแต่ละ Channel ให้ทำงานกับ Peripheral ต่างกันได้)
  • รองรับการโอนข้อมูล:
    • Peripheral → Memory
    • Memory → Peripheral
    • Memory → Memory
  • มี Ring Buffer Mode (วงรอบอัตโนมัติ)

2. การทำงานของ DMA (หลักการ)

เมื่อเราตั้งค่าและเปิดใช้งาน DMA:

  • CPU จะตั้งค่าต้นทาง/ปลายทาง, จำนวนข้อมูล, โหมด และเริ่มการทำงาน
  • หลังจากนั้น CPU ไม่ต้องยุ่งเกี่ยวอีก (ว่างไปทำอย่างอื่น)
  • DMA จะ “เฝ้าดู” Event ต่าง ๆ เช่น:
    • Peripheral ขอส่งข้อมูล เช่น USART/ADC/SPI ทำ DMA Request
  • เมื่อเกิด Event (เช่น ADC แปลงข้อมูลเสร็จ):
    • DMA จะ โอนข้อมูลโดยตรง ไปยัง RAM หรือ Peripheral ตามที่ตั้งไว้
  • เมื่อโอนครบที่กำหนด:
    • เกิด Interrupt (Optional) หรือ Flag เพื่อแจ้ง CPU ว่าเสร็จแล้ว

หมายเหตุ:

  • Peripheral Request → DMA Channel ถูก Trigger
  • Address Auto-Increment: Memory Address เพิ่มได้ตามการตั้งค่า
  • Transfer Complete: สามารถขอ Interrupt ไปแจ้ง CPU ได้
  • Error Handling: ถ้าเกิด Error ก็สามารถมี Interrupt ได้เช่นกัน

3. ขั้นตอนการทำงานของ DMA (Cycle จริง)

1. Peripheral หรือ Software สั่งให้ DMA เริ่มงาน
เช่น ADC ทำงานเสร็จ → ส่งสัญญาณ “DMA Request” ออกมา

2. DMA Controller ตัดสินใจเลือก Channel ที่ตรงกับ Peripheral นั้น

3. DMA Channel ตรวจสอบการตั้งค่า:

  • ที่อยู่ต้นทาง (Peripheral Address หรือ Memory Address)
  • ที่อยู่ปลายทาง (Memory Address หรือ Peripheral Address)
  • จำนวนข้อมูลที่จะโอน
  • ขนาดข้อมูล (8/16/32 bits)

4. DMA ทำการโอนข้อมูลหนึ่งคำสั่ง (Transfer Word) ผ่าน AHB Bus

5. ถ้ามีข้อมูลค้าง → ทำขั้นตอนที่ 4 ซ้ำจนจบครบจำนวน

6. เมื่อโอนเสร็จครบตามจำนวนที่ตั้งไว้:

  • ตั้งค่า Flag
  • (ถ้าตั้งไว้) ส่ง Interrupt แจ้ง CPU ทันที

7. ถ้าอยู่ในโหมด Circular:
กลับไปข้อ 3 อัตโนมัติ → ทำงานวนไปเรื่อย ๆ


4. ตัวอย่างรูปแบบการไหลข้อมูล DMA บน CH32V003

ตัวอย่างที่ 1: ADC อ่านค่า แล้ว DMA โอนเข้า RAM โดยตรง

ADC (Sampling Done) → Trigger DMA Request

DMA → อ่านค่า ADC_DR (Data Register) → เขียนเข้า RAM[0]

DMA → อ่านค่า ADC_DR → เขียนเข้า RAM[1] ...

DMA → เมื่อครบจำนวน → แจ้ง CPU

ตัวอย่างที่ 2: USART รับข้อมูล ผ่าน DMA

USART (RX Buffer Full) → Trigger DMA Request

DMA → อ่าน USART_DR → เขียนเข้า RAM[0]

DMA → อ่าน USART_DR → เขียนเข้า RAM[1] ...

DMA → เมื่อครบจำนวน → แจ้ง CPU


5. ความสามารถพิเศษเพิ่มเติมของ DMA CH32V003

  • Ring Buffer Mode: ข้อมูลจะวนซ้ำใน Buffer → เหมาะกับการรับข้อมูลต่อเนื่องเช่น UART
  • Priority Setting: สามารถตั้งลำดับความสำคัญของแต่ละ Channel ได้
  • Auto-Increment: เลือกได้ว่าต้นทาง/ปลายทางจะเพิ่ม Address หรือไม่
  • Memory to Memory Mode: ก็ทำได้ (เช่น Copy RAM → RAM)

สรุปสั้น ๆ:

DMA ของ CH32V003 = ระบบช่วยโอนข้อมูลจาก Peripheral หรือ Memory ไปยัง Memory อัตโนมัติ ด้วยการจัดการเองภายใน Hardware → เร็วมาก + ลดภาระ CPU