stm32 DMA初始化選項研究

stm32 DMA初始化選項研究

DMA比較好用,也比較簡單,今天在做多通道ADC“連續”“掃描”採樣時,對DMA有了更深一點的認識,今天給大家分享下:

#define ADC1_DR_Address    ((uint32_t)0x4001244C)

unsigned short Buff[3];  

......

 DMA_DeInit(DMA1_Channel1);  
 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;  
 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buff;  
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  
 DMA_InitStructure.DMA_BufferSize = 3;  
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  
*** DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;***
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;  
**DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;**
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);  
 DMA_Cmd(DMA1_Channel1, ENABLE);  

初始化時,要先用DMA_DeInit將DMA的通道初始化成缺省值。

外設地址設置,內存基地址設置,設置外設的傳輸屬性(輸入/輸出),這些都容易理解;

 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  

#define DMA_DIR_PeripheralDST              ((uint32_t)0x00000010)  

#define DMA_DIR_PeripheralSRC              ((uint32_t)0x00000000)

這裏是設置誰爲數據傳輸源;

DMA_InitStructure.DMA_BufferSize = 3;

如果是獲取一組數值,像ADC,USART,我們可以用一個緩衝區,如果不用,像ADC數據更新快的,馬上就被刷新了。我這裏的DMA_Buffersize 是 Buff的大小;


DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

#define DMA_PeripheralInc_Enable           ((uint32_t)0x00000040)  
#define DMA_PeripheralInc_Disable          ((uint32_t)0x00000000)  

#define DMA_MemoryInc_Enable               ((uint32_t)0x00000080)  
#define DMA_MemoryInc_Disable              ((uint32_t)0x00000000)  

這個根據需要進行設置;

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  

#define DMA_PeripheralDataSize_Byte        ((uint32_t)0x00000000)  
#define DMA_PeripheralDataSize_HalfWord    ((uint32_t)0x00000100)  
#define DMA_PeripheralDataSize_Word        ((uint32_t)0x00000200)  

#define DMA_MemoryDataSize_Byte            ((uint32_t)0x00000000)  
#define DMA_MemoryDataSize_HalfWord        ((uint32_t)0x00000400)  
#define DMA_MemoryDataSize_Word            ((uint32_t)0x00000800)  

這個設置獲取數據的大小;


*DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;*  

#define DMA_Mode_Circular                  ((uint32_t)0x00000020)  
#define DMA_Mode_Normal                    ((uint32_t)0x00000000)  

這個要強調下,像我這裏,要不斷更新Buff[0],Buff[1],Buff[2],我上面設置的緩衝區正好也是3,我們可以用Circular屬性來設置!他就不停的刷新這段地址!

他還有一種屬性是Normal,這種屬性一般用在Point 2 Point時使用;

DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

#define DMA_Priority_VeryHigh              ((uint32_t)0x00003000)  
#define DMA_Priority_High                  ((uint32_t)0x00002000)  
#define DMA_Priority_Medium                ((uint32_t)0x00001000)  
#define DMA_Priority_Low                   ((uint32_t)0x00000000)  

因爲DMA有多路,所以我們要規定先傳哪路數據,所以我們就要規定一個優先級;

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

#define DMA_M2M_Enable                     ((uint32_t)0x00004000)  
#define DMA_M2M_Disable                    ((uint32_t)0x00000000)  

這個是設置是不是Memary to Memary的!

發佈了4 篇原創文章 · 獲贊 85 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章