娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32一文通(9) DMA

發布者:RadiantJourney最新更新時間:2025-01-20 來源: jianshu關鍵字:STM32  DMA  直接存儲器訪問 手機看文章 掃描二維碼
隨時隨地手機看文章

一. DMA簡介

  • DMA(Direct Memory Access,直接存儲器訪問)  傳輸將數據從一個地址空間復制到另外一個地址空間。而且不占用CPU

  • 數據傳輸支持從外設到存儲器或者存儲器到存儲器,這里的存儲器可以是 SRAM 或者是 FLASH。

  • 我們把外設簡稱為: P, 把寄存器簡稱為: M

  • DMA 控制器包含了 DMA1 和 DMA2,其中 DMA1 有 7 個通道,DMA2 有 5 個通道,這里的通道可以理解為傳輸數據的一種管道。要注意的是 DMA2 只存在于大容量的單片機中。

1. DMA功能框圖

關鍵角色:

  1. DMA請求 : 發送方向MCU請求使用DMA通道發送數據

  2. 通道 : 傳輸數據的管道
    具體通道分配方法:

但是通道表里并沒有 存儲器到存儲器 (M →M的)請求映像, 因為: 它每個通道都可以用!!!!

  1. 仲裁器 :
    當多個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). 數劇從哪來到哪去
  • 外設地址 : 配置的是DMA_CPAR 寄存器, 一般設置為外設的數據寄存器地址,如果是存儲器到存儲器模式則設置為其中一個存儲器地址。

  • 存儲器地址 : 設定DMA_CMAR 寄存器值;一般設置為我們自定義存儲區的首地址。

  • 傳輸方向 : 傳輸方向選擇, 可選外設到存儲器、存儲器到外設。它設定DMA_CCR 寄存器的DIR[1:0]位的值。這里并沒有存儲器到存儲器的方向選擇,當使用存儲器到存儲器時,只需要把其中一個存儲器當作外設使用即可。

(2). 數劇傳多少, 傳的單位是什么?
  • 傳輸數目 : 設定待傳輸數據數目,初始化設定DMA_CNDTR 寄存器的值

  • 外設地址增量模式 : 外設地址是否自動遞增 (比如外設是個串口寄存器,那就不要遞增, 如果是個存儲單元則要遞增)

  • 存儲器地址增量模式存儲器地址是否自動遞增,我們自定義的存儲區一般都是存放多個數據的,所以要使能存儲器地址自動遞增功能

  • 外設數據寬度 : 可選字節(8 位)、半字(16 位)和字(32位),它設定DMA_CCR 寄存器的PSIZE[1:0]位的值。

  • 存儲器數據寬度 : 可選字節(8 位)、半字(16 位)和字(32位),它設定DMA_CCR 寄存器的MSIZE[1:0]位的值。當外設和存儲器之間傳數據時,兩邊的數據寬度應該設置為一致大小。

(3). 什么時候傳輸結束?
  • 模式選擇 : DMA 傳輸模式選擇, 可選一次傳輸或者循環傳輸

(4). 其他設置
  • 通道優先級 : 設置通道優先級

  • 存儲器到存儲器模式 : 當M2M時設置

三. DMA相關庫函數

1. DMA初始化    DMA_Init

例如: DMA_Init(DMA1_Channel7, &DMA_InitStruct)

2. DMA使能 DMA_Cmd

3. DMA狀態查詢   FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);

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).

返回值 SET RESET

4. DMA中斷設置 DMA_ITConfig

void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);

參數2 DMA_IT 可選以下參數

5. 中斷狀態查詢

ITStatus DMA_GetITStatus(uint32_t DMAy_IT);

參數: 和上一節的一樣
返回值 SET RESET

四. M→M 傳輸


關鍵字:STM32  DMA  直接存儲器訪問 引用地址:STM32一文通(9) DMA

上一篇:stm32修改外部晶振頻率的方法
下一篇:STM32新建匯編工程2

推薦閱讀最新更新時間:2025-06-30 22:58

STM32 UART配置中斷DMA傳輸
在處理UART數據的時候,DMA是一種非常靈活、高效的方式。 ※補記:USART_DR 串口數據寄存器是一個雙寄存器,包含了TDR和RDR,對它讀操作,讀取的是RDR寄存器的值,對它的寫操作,實際上是寫到TDR寄存器;當向該寄存器寫數據的時候,串口就會自動發送,當收到收據的時候,也是存在該寄存器內。 關于讀寫: __STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx);/* 讀取接收寄存器USARTx_DR中8位數據,接收即所得。返回值最大為0xFF 若使能校驗位,接收的最高位MSB將由硬件自動進行校驗。 */ __STATIC_IN
[單片機]
<font color='red'>STM32</font> UART配置中斷<font color='red'>DMA</font>傳輸
STM32串口DMA問題詳解
昨天晚上在STM32串口DMA的問題上糾結了好長時間,所以今天上午寫篇博客來談談我對串口DMA發送的理解。 討論三個問題: 1、什么叫串口DMA 請求; 2、串口簡要復習; 3、串口DMA發送流程。 1、什么叫串口DMA 請求(戰艦STM32開發板) 說這個問題之前先簡單回顧DMA的基本特性。先導出原子哥的PPT內容: DMA 全稱Direct Memory Access,即直接存儲器訪問。 DMA傳輸將數據從一個地址空間復制到另一個地址空間。當CPU初始化這個傳輸動作,傳輸動作本身是由DMA控制器來實現和完成的。 STM32有兩個DMA控制器(DMA2只存在于大容量產品中),DMA1有7個通道,DMA2有5個通道,
[單片機]
<font color='red'>STM32</font>串口<font color='red'>DMA</font>問題詳解
STM32DMA基本原理、寄存器、庫函數(2)
05 DMA中斷狀態寄存器(DMA_ISR) 作用:可以獲取DMA傳輸的狀態標志。 注意:此寄存器為只讀寄存器,所以在這些位被置位后只能通過其他的操作來清除。 06 DMA中斷標志清除寄存器(DMA_IFCR) 作用:通過往寄存器內寫1來清除DMA_ISR被置位的位。 DMA通道配置過程 下面是配置DMA通道x的過程(x代表通道號): 在DMA_CPARx寄存器中設置外設寄存器的地址。發生外設數據傳輸請求時,這個地址將是數據傳輸的源或目標; 在DMA_CMARx寄存器中設置數據存儲器的地址。發生外設數據傳輸請求時,傳輸的數據將從這個地址讀出或寫入這個地址; 在DMA_CNDTRx寄存器中設置要傳輸的數據量
[單片機]
stm32的多通道ADC和DMA的設置問題
最近在倒騰LD驅動的時候遇到不少問題,下面就一一的記錄一下啦,不然五百年以后誰還記得誰是吧。 一、多通道ADC和DMA的配置問題: 剛開始不知道怎么去配置,到處找資料發現很多不是很適用。很盲目的找了很久的資料,后來發現官方的固件庫里面有很詳細的資料。稍微改了一下官方的demo一下就編譯成功了。這個例子的啟示是:別忙著去網上找現成的例子,啟示固件庫里面的例程很給力了。 程序需求是開通三個ADC通道分別采集3V 的基準電壓、控制反饋溫度和環境溫度。 因為用示波器測試時發現TED控制PWM的開關的高頻噪聲耦合到控制地中來了,所以會有一些高頻尖刺。我的解決辦法是每組數據通過DMA采集100個點,除去最大的10個數和最小的10數然后
[單片機]
STM32采用HAL庫使用usart_DMA問題
在這里需要理解一個概念就是,使用hal庫,首先一定要對標準庫中外設的使用,有一個很好的了解,在我這里出現這個原因就是由于對標準庫中外設的使用不夠了解,導致轉移到HAL庫,出現各種問題。 本次采用的是HAL庫串口2中斷的接受,DMA方式發送。 具體想實現的功能是:上位機發送一幀固定的數據(15bit)前面2個字節固定的,在串口中斷中,檢測到了這個前面2個字節是正確的,則進行數據的處理。處理好數據以后,在采用DMA方式發送出去對應的數據。 出現的問題:每次調用函數這個函數后,下次就不能使用了 MYDMA_USART_Transmit(&UART2_Handler(u8*)USART2_TX_BUF,USART2_REC_LEN
[單片機]
STM32之ADC 一個8通道DMA程序
/******************************************************************************* * Function Name : main * Description : Main program * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { #ifdef DEBUG debug(); #endi
[單片機]
STM32 ADC與DMA多通道處理
#define ADC1_DR_Address ((uint32_t)0x4001244C)//ADC1 DR寄存器基地址 DMA_InitTypeDef DMA_InitStructure; //DMA ADC_InitTypeDef ADC_InitStructure; //ADC #define ADC_CH 2 //通道數 #define ADC_num 10 //采集點數 vu16 After_filter ; //用來存放求平均值之后的結果 vu16 ADCConvertedValue ;//AD數據緩存 /*****************************************************
[單片機]
STM32微控制器中采用DMA實現方波的產生和捕獲
   1 STM32微控制器介紹   STM32系列微控制器是ST公司基于Cortex-M3內核的高集成度的微控制器。它在性能、價格、功耗和實時性方面樹立了一個新的標桿,集成了Cortex-M3內核,以及雙ADC、多用途的通用時鐘TIMx、RTC、I2C、SPI、UART、CAN、DMA、USB等豐富的外設。其功耗在全速72MHz所有模塊都打開時也僅僅為36 mA,在低功耗模式下其功耗僅為2 A。   2 DMA和TIMx簡介   STM32系列微控制器均含有DMA和通用時鐘TIMx模塊。其低端型號中僅包含DMA1,支持7個通道;高端型號還包括DMA2,支持5個通道。它的每個通道可任意指定工作模式,如內存到內存、內存到外設或外
[單片機]
<font color='red'>STM32</font>微控制器中采用<font color='red'>DMA</font>實現方波的產生和捕獲
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 安西县| 调兵山市| 祁阳县| 晋城| 肇庆市| 论坛| 乐安县| 获嘉县| 扶风县| 浦江县| 田阳县| 黎城县| 临泽县| 襄垣县| 新平| 克东县| 荥阳市| 万源市| 宜兰县| 抚顺县| 宿州市| 来宾市| 奉节县| 施秉县| 得荣县| 邻水| 泰顺县| 邛崃市| 鄄城县| 安徽省| 法库县| 林西县| 西藏| 梅州市| 文水县| 新绛县| 南开区| 黄石市| 云和县| 水城县| 汕尾市|