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