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.

3 phút đọc
STM32 / DMA cover

Ghi chú nhanh

DMA có hai kiểu dùng rất hay gặp: Normal modeCircular 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

ModeCách chạyPhù hợp vớiKhông nên dùng khi
NormalTruyền xong một block rồi dừngUART TX từng chunk, SPI transfer, memory copy một lầnCần stream liên tục không ngắt
CircularTự quay vòng quanh một bufferADC sampling, audio stream, UART RX circularDữ 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

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.