DMA(Direct Memory Access,直接存儲器訪問) 傳輸將數據從一個地址空間復制到另外一個地址空間。而且不占用CPU 數據傳輸支持從外設到存儲器或者存儲器到存儲器,這里的存儲器可以是 SRAM 或者是 FLASH。 我們把外設簡稱為: P, 把寄存器簡稱為: M DMA 控制器包含了 DMA1 和 DMA2,其中 DMA1 有 7 個通道,DMA2 有 5 個通道,這里的通道可以理解為傳輸數據的一種管道。要注意的是 DMA2 只存在于大容量的單片機中。 關鍵角色: DMA請求 : 發送方向MCU請求使用DMA通道發送數據 通道 : 傳輸數據的管道 但是通道表里并沒有 存儲器到存儲器 (M →M的)請求映像, 因為: 它每個通道都可以用!!!! 仲裁器 : 參數詳解 : 外設地址 : 配置的是DMA_CPAR 寄存器, 一般設置為外設的數據寄存器地址,如果是存儲器到存儲器模式則設置為其中一個存儲器地址。 存儲器地址 : 設定DMA_CMAR 寄存器值;一般設置為我們自定義存儲區的首地址。 傳輸方向 : 傳輸方向選擇, 可選外設到存儲器、存儲器到外設。它設定DMA_CCR 寄存器的DIR[1:0]位的值。這里并沒有存儲器到存儲器的方向選擇,當使用存儲器到存儲器時,只需要把其中一個存儲器當作外設使用即可。 傳輸數目 : 設定待傳輸數據數目,初始化設定DMA_CNDTR 寄存器的值 外設地址增量模式 : 外設地址是否自動遞增 (比如外設是個串口寄存器,那就不要遞增, 如果是個存儲單元則要遞增) 存儲器地址增量模式存儲器地址是否自動遞增,我們自定義的存儲區一般都是存放多個數據的,所以要使能存儲器地址自動遞增功能 外設數據寬度 : 可選字節(8 位)、半字(16 位)和字(32位),它設定DMA_CCR 寄存器的PSIZE[1:0]位的值。 存儲器數據寬度 : 可選字節(8 位)、半字(16 位)和字(32位),它設定DMA_CCR 寄存器的MSIZE[1:0]位的值。當外設和存儲器之間傳數據時,兩邊的數據寬度應該設置為一致大小。 模式選擇 : DMA 傳輸模式選擇, 可選一次傳輸或者循環傳輸 通道優先級 : 設置通道優先級 存儲器到存儲器模式 : 當M2M時設置 例如: DMA_Init(DMA1_Channel7, &DMA_InitStruct) DMAy_FLAG可以傳入以下值: 返回值 SET RESET void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); 參數2 DMA_IT 可選以下參數 ITStatus DMA_GetITStatus(uint32_t DMAy_IT); 參數: 和上一節的一樣一. DMA簡介
1. DMA功能框圖
具體通道分配方法:
當多個DMA請求一起來怎么辦?
使用仲裁器來管理
①. 軟件優先級 : DMA_CCRx : PL[1:0]寄存器配置其優先級 , 分為: 低, 中, 高, 最高
②. 硬件優先級 : DMA1>DMA2 , 通道號小的優先二. DMA相關結構體
1. DMA_ InitTypeDef 初始化結構體
typedef struct{
uint32_t DMA_PeripheralBaseAddr; // 外設地址
uint32_t DMA_MemoryBaseAddr; // 存儲器地址
uint32_t DMA_DIR; // 傳輸方向
uint32_t DMA_BufferSize; // 傳輸數目
uint32_t DMA_PeripheralInc; // 外設地址增量模式
uint32_t DMA_MemoryInc; // 存儲器地址增量模式
uint32_t DMA_PeripheralDataSize; // 外設數據寬度
uint32_t DMA_MemoryDataSize; // 存儲器數據寬度
uint32_t DMA_Mode; // 模式選擇
uint32_t DMA_Priority; // 通道優先級
uint32_t DMA_M2M; // 存儲器到存儲器模式} DMA_InitTypeDef;
(1). 數劇從哪來到哪去
(2). 數劇傳多少, 傳的單位是什么?
(3). 什么時候傳輸結束?
(4). 其他設置
三. DMA相關庫函數
1. DMA初始化 DMA_Init
2. DMA使能 DMA_Cmd
3. DMA狀態查詢 FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
* This parameter can be one of the following values:
* @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag.
* @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.
* @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.
* @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.
* @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag.
* @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.
* @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.
* @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.
* @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag.
* @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.
* @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.
* @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.
* @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag.
* @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.
* @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.
* @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.
* @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag.
* @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.
* @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.
* @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.
* @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag.
* @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.
* @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.
* @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.
* @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag.
* @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.
* @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.
* @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.
* @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag.
* @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.
* @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.
* @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.
* @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag.
* @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.
* @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.
* @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.
* @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag.
* @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.
* @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.
* @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.
* @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag.
* @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.
* @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.
* @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.
* @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag.
* @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.
* @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.
* @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.
* @retval The new state of DMAy_FLAG (SET or RESET).
4. DMA中斷設置 DMA_ITConfig
5. 中斷狀態查詢
返回值 SET RESET四. M→M 傳輸
上一篇:stm32修改外部晶振頻率的方法
下一篇:STM32新建匯編工程2
推薦閱讀最新更新時間:2025-06-30 22:58



設計資源 培訓 開發板 精華推薦
- LTC1871、4.5V 至 15V 輸入、12.0V/2A 輸出 SEPIC 轉換器
- AMSRL-7815-NZ 15V 高達 7.5 瓦 DC-DC 開關穩壓器的典型應用
- CY8C5888AXI-LP096 CY8C58LP PSoC 5LP 可編程片上系統的典型應用
- AM1D-0512S-RZ 12V 1 瓦 DC/DC 轉換器的典型應用
- DER-526 - 18W非調光非隔離降壓-升壓LED驅動器
- 使用 Richtek Technology Corporation 的 RT8011APQW 的參考設計
- 使用 Analog Devices 的 LT1317IS8 的參考設計
- AM1D-1505SH30-RZ 5V 1W DC-DC 轉換器的典型應用
- LTC4089 的典型應用,全功能鋰離子電池充電器
- 使用 ON Semiconductor 的 NUD4022 的參考設計
- 納祥科技2W 24位數字功放NX4920,可用于AI語音播報、WIFI播放器
- 常用解調器的定義和工作原理
- 從性能與網絡傳輸出發,講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業與酒店業運營模式
- 跨國商務溝通困局破解之道:時空壺 W4Pro 全場景應用解析
- 從矢量降噪到雙向同傳,時空壺 W4Pro 如何重構 AI 同傳技術標準?
- LoRa+NB-IoT雙模融合,地下車庫信號盲區電梯場景等的冗余通信
- LoRa與UWB的“定位之戰”,成本敏感場景高精度需求的場景切割
- 時空壺X1再升級:引領AI同傳新時代,革新演講翻譯體驗
- ARXML 規則下 ECU 總線通訊與 ADTF 測試方案