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的!