STM32_DMA 标准初始化设置解释
DMA 全稱是:Direct Memory Access;根據?ST 公司提供的相關信息,DMA是STM32中一個獨立于?Cortex-M3?內核的模塊,有點類似于?ADC、PWM、TIMER?等模塊;主要功能是起通信“橋梁”的作用,可以將所有外設映射的寄存器“連接”起來,這樣就可以高速訪問各寄存器,其傳輸不受?CPU?的支配,傳輸還是雙向的;例如,從“表面”上看,它可以將?flash?中的數據與儲存器中變量建立通訊,還可以將某一個外設的寄存器或緩沖器與另一個外設的寄存器或緩沖器建立雙向通訊,有點像把外設硬件之間用“導線”連接在一起了。其間的通訊不占?CPU?資源,訪問速度快,對于實時性強的應用將是一個很好的選擇。下面代碼是一個標準?DMA 設置,當然實際應用中可根據實際情況進行裁減:
//開啟時鐘,否則初始化無效。
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
?
DMA_DeInit(DMA_Channel1);
上面這句是給?DMA?配置通道,根據?ST?提供的資料,STM3210Fx?中?DMA?包含?7?個通道(CH1~CH7),也就是說可以為外設或?memory?提供?7?座“橋梁”;
?
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_PeripheralBaseAddr 是?DMA_InitStructure 結構體中一個數據成員,給?DMA?一個起始地址,好比是一個?buffer?起始地址,ADC1_DR_Address?是我定義的一個地址變量;
?
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;
上面這句很顯然是?DMA?要連接在?Memory?中變量的地址,ADC_ConvertedValue?是我自己在memory 中定義的一個變量地址;
?
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
上面的這句是設置?DMA?的傳輸方向,就如前面所說的,DMA?可以雙向傳輸,也可以單向傳輸,這里設置的是單向傳輸,如果需要雙向傳輸:把?DMA_DIR_PeripheralSRC?改成DMA_DIR_PeripheralDST 即可。
?
DMA_InitStructure.DMA_BufferSize = 2;
上面的這句是設置?DMA?在傳輸時緩沖區的長度,前面有定義過了?buffer?的起始地址:ADC1_DR_Address ,為了安全性和可靠性,一般需要給?buffer 定義一個儲存片區,這個參數的單位有三種類型:Byte、HalfWord、word,我設置的?2?個half-word(見下面的設置);32位的 MCU?中?1?個?half-word?占?16 bits。
?
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
上面的這句是設置?DMA?的外設遞增模式,如果?DMA?選用的通道(CHx)有多個外設連接,需要使用外設遞增模式:DMA_PeripheralInc_Enable;我的例子里?DMA?只與?ADC1?建立了聯系,所以選用?DMA_PeripheralInc_Disable。
?
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
上面的這句是設置DMA的內存遞增模式,DMA?訪問多個內存參數時,需要使用DMA_MemoryInc_Enable,當DMA只訪問一個內存參數時可設置成 :DMA_MemoryInc_Disable。
?
DMA_InitStructure.DMA_PeripheralDataSize?=
DMA_PeripheralDataSize_HalfWord;
上面的這句是設置?DMA?在訪問時每次操作的數據長度。有三種數據長度類型,前面已經講過了,這里不在敘述。
?
DMA_InitStructure.DMA_MemoryDataSize =?DMA_MemoryDataSize_HalfWord;
與上面雷同。在此不再說明。
?
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
上面的這句是設置?DMA?的傳輸模式:連續不斷的循環模式,若只想訪問一次后就不要訪問了(或按指令操作來反問,也就是想要它訪問的時候就訪問,不要它訪問的時候就停止),可以設置成通用模式:DMA_Mode_Normal。
?
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
上面的這句是設置?DMA?的優先級別:可以分為?4?級:VeryHigh,High,Medium,Low.
?
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
上面的這句是設置?DMA?的?2?個?memory?中的變量互相訪問的
?
DMA_Init(DMA_Channel1,&DMA_InitStructure);
前面那些都是對?DMA?結構體成員的設置,在次再統一對?DMA?整個模塊做一次初始化,使得?DMA?各成員與上面的參數一致。
?
DMA_Cmd(DMA_Channel1,ENABLE);
使能啟動。
?
要使?DMA?與外設建立有效連接,這不是?DMA?自身的事情,是各個外設的事情,每個外設都有?一個?xxx_DMACmd(XXXx,Enable )函數,如果使?DMA?與?ADC?建立有效聯系,就使用ADC_DMACmd(ADC1,Enable); (這里我啟用了?ADC 中的?ADC1 模塊)。
總結
以上是生活随笔為你收集整理的STM32_DMA 标准初始化设置解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32外设初始化和设置过程
- 下一篇: STM32单片机,禁止系统启动时的变量初