STM32 DMA Introduction

DMA的基本介紹

DMA,全名Direct Memory Access,即直接暫存器訪問。
DMA傳輸將數據從一個地址空間複製到另一個地址空間,提供在外存器之間或者暫存器和暫存器之間的高速數據傳輸。
無須CPU的介入,透過DMA數據可以快速地移動

DMA mapping

因WB系列是L4系列+Core-M0+因此這邊直接參考L4的Mappong圖表,且由圖表可以知道那些通道支援什麼類型資料存取

DMA事務

DMA傳輸事務包含一系列的给定數目的數據傳輸序列。傳輸的數目可以透過軟體設定,8位,16位或32位。
每一次DMA傳輸包含3个操作

  • 透過 DMA_SxPAR 或 DMA_SxM0AR 暫存器,外部數據暫存器或存儲器單元中加載數據。
  • 透過 DMA_SxPAR 或 DMA_SxM0AR 暫存器,將加載的數據存儲到外部數據暫存器或存儲器內
  • DMA_SxNDTR 計數器在數據存儲结束後遞減,該計數器中包含仍需执行的事務數

DMA Function介紹

表格為F10X系列在WB系列可以參考Description of STM32WB HAL and low-layer drivers (P181 DMA Firmware driver API description)在部分function上有更動

DMA使用

1、查询方式
查询方式可以不使能DMA中斷,透過DMA_GetFlagStatus函数判斷旗標位來辨别是否傳輸完成或過半以及出错,然後關閉DMA通道,用DMA_SetCurrDataCounter函数重設缓存大小,完成相應操作後清除旗標位再使能DAM通道。
2、中斷方式
DMA中斷一般用於定長數據傳輸,以傳輸完成中斷為例。
(1)當產生DMA傳輸完成中斷後,清除中斷旗標位、傳輸完成旗標位;
(2)關閉DMA通道;
(3)處理數據
(4)重新設定DMA通道的DMA缓存的大小(可以省去);
(5)開啟DMA通道
3、不定長度數據傳輸
以串口為例,不定長度數據傳輸的時候,可以透過串口空閒中斷来判斷傳輸是否完成(傳輸缓存大小要大於傳輸的數據大小),數據長度可以透過DMA_GetCurrDataCounter函数来計算,然後關閉DMA通道,重設DMA缓存的大小,再開啟DMA通道。
4、雙緩衝方式
設定2個緩衝區,設定一個緩衝區flag(用來區分當前是處在哪個緩衝區),每完成一次傳輸就透過重新配置DMA_MemoryBaseAddr的緩衝區地址,下次傳輸數據就會保存到新的緩衝區中,可以透過自定暫存區flag来判斷和切換(。

Leave a Comment

Your email address will not be published. Required fields are marked *

Shopping Cart