DMA Normal mode và Circular mode khác nhau thế nào?
Phân biệt DMA Normal mode và Circular mode khi dùng UART, ADC, audio stream hoặc logger trên STM32.
Ghi chú nhanh
DMA có hai kiểu dùng rất hay gặp: Normal mode và Circular mode.
Nói đơn giản:
Normal mode = truyền xong một block rồi dừng.
Circular mode = cứ chạy vòng quanh cùng một buffer.
Nếu bạn đang làm UART TX logger với Ring Buffer phần mềm, lựa chọn thường hợp lý là:
UART TX DMA = Normal mode
Lý do là phần mềm mới là người quyết định đoạn nào trong Ring Buffer cần được gửi tiếp theo. DMA chỉ nên nhận một chunk cụ thể, truyền xong, rồi báo callback để firmware quyết định chunk kế tiếp.
Một ví dụ dễ hình dung
Hãy tưởng tượng bạn có một nhân viên giao hàng.
- Normal mode: bạn đưa cho người đó một gói hàng, giao xong thì quay lại hỏi “còn gói nào nữa không?”.
- Circular mode: bạn bảo người đó cứ chạy vòng quanh một tuyến cố định, hết vòng lại quay lại đầu.
Với UART logger, log không phải lúc nào cũng đều đặn. Có lúc im lặng, có lúc bắn ra cả đống dòng debug. Vì vậy mô hình “giao từng gói” thường dễ kiểm soát hơn.
So sánh nhanh
| Mode | Cách chạy | Phù hợp với | Không nên dùng khi |
|---|---|---|---|
| Normal | Truyền xong một block rồi dừng | UART TX từng chunk, SPI transfer, memory copy một lần | Cần stream liên tục không ngắt |
| Circular | Tự quay vòng quanh một buffer | ADC sampling, audio stream, UART RX circular | Dữ liệu cần chia message/chunk rõ ràng |
Vì sao UART TX logger thường dùng Normal mode?
UART TX logger có một vấn đề nhỏ nhưng rất quan trọng: dữ liệu log có thể được ghi thêm trong lúc DMA đang truyền.
Nếu dùng Ring Buffer phần mềm, firmware cần tự quản lý:
head: nơi producer ghi log mới;tail: nơi consumer lấy log để gửi;dma_busy: DMA có đang truyền hay không;tx_len: chunk hiện tại dài bao nhiêu byte.
Khi DMA truyền xong, callback chỉ nên cập nhật tail theo đúng số byte đã truyền, rồi kiểm tra xem còn dữ liệu mới không. Đây là cách làm tự nhiên với Normal mode.
Bẫy dễ gặp
Đừng chọn Circular mode chỉ vì nghe chữ “circular” giống Ring Buffer.
Ring Buffer phần mềm vòng tròn ≠ DMA Circular mode luôn phù hợp
Ring Buffer là cấu trúc dữ liệu do firmware quản lý. DMA Circular mode là cơ chế phần cứng tự quay vòng trên một vùng nhớ cố định. Hai thứ này có thể phối hợp với nhau trong một số bài toán, nhưng không phải cứ thấy Ring Buffer là bật Circular mode.
Cách nhớ
Firmware tự chia chunk để gửi → DMA Normal mode
Hardware tự stream liên tục → DMA Circular mode
UART TX logger bằng Ring Buffer → thường chọn Normal mode
Bài liên quan nên đọc tiếp
- Thiết kế hệ thống UART logging non-blocking trên STM32
- Ring Buffer là gì trong firmware embedded?
- HAL_BUSY xảy ra khi nào trong UART DMA?
Thấy nội dung này hữu ích?
Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
HAL_BUSY xảy ra khi nào trong UART DMA?
Giải thích lỗi HAL_BUSY khi gọi HAL_UART_Transmit_DMA() trong lúc UART/DMA vẫn đang truyền dữ liệu trước đó.
UART non-blocking logger trên STM32 với DMA + Ring Buffer
Thiết kế debug UART non-blocking cho STM32: tránh printf, xử lý mất log với DMA, dùng ring buffer và DMA callback.
STM32 Non-Blocking UART Logger
Case study thiết kế module logging non-blocking cho STM32, hỗ trợ UART DMA, Ring Buffer, bare-metal, FreeRTOS và production build mode.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.