DMA hoạt động như Master, dùng để điều khiển việc truy cập trực tiếp vào bộ nhớ.
Các Slave gồm:
- Memory: SRAM, DRAM,.... (RAM vật lý)
- Peripheral: UART, ADC,....
DMA có 2 cổng:
- Cổng Slave: Nhận lệnh từ CPU để thiết lập quá trình truyền dữ liệu
- Cổng Master: Chủ động thực hiện truyền dữ liệu trên AHB bus hoặc qua cầu nối AHB/APB
1 DMA Controller có thể có nhiều luồng (stream). Mỗi luồng có thể phục vụ 1 kênh (channel) khác nhau. Mỗi luồng chỉ có thể liên kết với 1 kênh tại 1 thời điểm. Nhiều luồng có thể hoạt động đồng thời, miễn là không xung đột tài nguyên.
Khi Channel được bật, nó sẽ tự động truyền dữ liệu mỗi khi nhận được 1 tín hiệu trigger. Trigger đến từ:
- Hardware trigger: Ngoại vi (ADC, USART, SPI, Timer,...)
- Software trigger: Do chương trình kích hoạt bằng lệnh
Mức độ ưu tiên của các kênh DMA (để phân bổ tài nguyên, theo thứ tự:
- Software Priority: Very High, High, Medium, Low. Có thể cài đặt và thay đổi
- Hardware Priority: Các Channel đã được fix cố định mức ưu tiên (về mặt phần cứng). Nếu nhiều kênh có cùng Software Priority, phần cứng chọn kênh có Hardware Priority cao hơn
2. Cách dữ liệu di chuyển
a. Flow-through DMA
DMA đọc dữ liệu từ nguồn vào 1 thanh ghi tạm trong DMA Controller, sau đó ghi dữ liệu từ thanh ghi này đến đích.
2 kiểu xử lý dữ liệu trung gian
-
Direct Mode (Truyền trực tiếp - Giao ngay): Có bao nhiêu truyền bấy nhiêu.
-
FIFO Mode (Dùng bộ đệm - Gom hàng): Nhận đủ một lượng dữ liệu nhất định vào FIFO rồi mới xả một lần vào đích. Giúp giảm số lần sử dụng Bus của hệ thống.
Ưu điểm:
- Hỗ trợ thiết bị có kích thước thanh ghi khác nhau (ví dụ đọc 16 bit ADC, ghi 32 bit vào bộ nhớ)
- Có thể thực hiện Memory-to-Memory DMA, vì dữ liệu có thể được đọc và ghi ở 2 thời điểm khác nhau
Nhược điểm:
- Chậm hơn do cần 2 lần truyền bus (đọc -> lưu vào DMA Controller -> ghi)
- Tốn thêm tài nguyên trong DMA Controller (thanh ghi tạm để lưu dữ liệu)
- Tăng tiêu thụ điện năng, vì có thêm bước lưu trung gian
b. Fly-by DMA
Dữ liệu được truyền trực tiếp từ nguồn đến đích trong 1 lần truyền bus
Ưu điểm:
- Nhanh hơn vì chỉ cần 1 lần truyền bus
- Tiết kiệm điện năng vì không cần lưu dữ liệu vào thanh ghi DMA
- Giảm tải cho hệ thống bus, tối ưu băng thông
Nhược điểm:
- Không hỗ tợ Memory-to-Memory DMA, vì bộ nhớ thường không cho phép đọc và ghi cùng lúc
- Chỉ hoạt động với các thiết bị có cùng kích thước thanh ghi (ví dụ: cả nguồn và đích đều là 16 bit)
- Cần phần cứng hỗ trợ, vì DMA phải có khả năng thiết lập kết nối trực tiếp giữa nguồn và đích
3. Hướng truyền dữ liệu
- Memory -> Peripheral: Gửi dữ liệu (VD: Bắn một chuỗi ký tự từ RAM ra màn hình qua UART).
- Peripheral -> Memory: Nhận dữ liệu (VD: Đọc cảm biến ADC lưu vào mảng).
- Memory -> Memory (Ví dụ: Sao chép dữ liệu giữa 2 bộ nhớ)
Số lượng dữ liệu có thể truyền
- DMA có thể truyền tối đa 65535 đơn vị dữ liệu trong 1 lần cấu hình
- Mỗi lần truyền -> hoàn thành, giảm giá trị trong thanh ghi đếm dữ liệu
- Số lượng dữ liệu phụ thuộc vào độ rộng của nguồn dữ liệu (ví dụ: 8 bit, 16 bit, 32 bit) (8 bit, 1 đơn vị = 1 byte; 16 bit, 1 đơn vị = 2 byte; 32 bit, 1 đơn vị = 4 byte)
Quản lý con trỏ địa chỉ
- Memory (Bộ nhớ):
- Khi lưu dữ liệu vào mảng 1 cách tuần tự: Cấu hình để sau mỗi lần truyền, địa chỉ bộ nhớ tăng để lấy dữ liệu tiếp theo
- Nếu chỉ cần cập nhật giá trị của 1 biến, thì không cần tự tăng địa chỉ bộ nhớ
- Peripheral (Ngoại vi):
- Cấu hình để sau mỗi lần truyền, địa chỉ ngoại vi tăng (dành cho ngoại vi có nhiều thanh ghi như ADC buffer). Ví dụ: cảm biến ADC có nhiều kênh, sau mỗi lần đọc kênh, địa chỉ cần được tăng lên để lấy dữ liệu từ kênh tiếp theo
- UART, SPI, I2C: Chỉ có 1 thanh ghi dữ liệu (DR), nên địa chỉ ngoại vi không cần tăng
1 byte -> địa chỉ tăng 1
2 byte -> địa chỉ tăng 2
4 byte -> địa chỉ tăng 4
Chế độ vận hành
a. Regular mode
Truyền 1 lần rồi dừng (Khi đếm đủ N byte thì Tự động tắt DMA)
Muốn truyền tiếp đợt mới, CPU bắt buộc phải cấu hình lại và bật lại DMA.
b. Các tính năng nâng cao để chạy liên tục
- Circular Mode
- Truyền lặp lại trên 1 đệm (Khi đếm đủ N byte thì Tự reset con trỏ về lại đầu đệm M0 và ghi đè tiếp)
- CPU không cần bật lại DMA, nhưng phải xử lý dữ liệu nhanh kẻo bị DMA ghi đè.
- Double buffer mode
- Truyền lặp lại luân phiên 2 đệm (Khi đếm đủ N byte thì Tự đổi con trỏ sang đệm M1 (xong M1 lại quay về M0).
- DMA và CPU làm việc trên 2 đệm hoàn toàn độc lập.
- Khi bật chế độ này thì Circular Mode sẽ tự động được bật
Bus Matrix - Điều phối giao tiếp
- Xử lý xung đột khi nhiều module muốn truy cập bus cùng lúc
- Round-robin priority: đảm bảo không có module nào chiếm dụng bus quá lâu
6. Ưu và nhược điểm của DMA
a. Ưu điểm:
- DMA tự động xử lý dữ liệu, trong khi CPU có thể làm việc khác
- Tăng tốc truyền dữ liệu (vì truy cập trực tiếp bộ nhớ)
- Giảm số lần ngắt
b. Nhược điểm:
- DMA có thể chiếm bus (AHB) trong khoảng thời gian ngắn, sẽ làm chậm CPU nếu cả 2 truy cập bộ nhớ cùng lúc