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的!
- 前言
- 【菜鳥入門】stm32的第一個程序--LED
- 【菜鳥入門】stm32 之 掃描按鍵
- 【菜鳥入門】stm32 之 中斷按鍵
- 【菜鳥入門】stm32 之 USART
- 【菜鳥入門】stm32 之 iic
- 【菜鳥入門】stm32 之 eeprom
- 【菜鳥入門】stm32 之 pwm
- 【菜鳥入門】stm32 之 ADC 模數轉換
- 【菜鳥入門】stm32 之 實時時鐘
- 【菜鳥入門】stm32 之 DMA
- 【菜鳥入門】stm32 之 DAC
- 【STM庫應用】stm32 之 USART
- 中斷源去抖辦法
- stm32 啟動代碼應用技巧
- 【STM庫應用】stm32 之 IIC應用
- 【STM庫應用】stm32 之 中斷按鍵初始化(注意事項)
- 關于結構體初始化
- 【STM庫應用】stm32 之 TIM (詳解一 通用定時器)
- 【STM庫應用】stm32 之 TIM (詳解二 脈沖寬度、周期測量)
- 【stm32庫應用】SD驅動移植(基于SDIO外設)
- SD卡fat文件系統移植
- stm32 DMA初始化選項研究
- stm32 靈活靜態存儲控制器(FSMC)(NORFLASH\PSRAM)
- 【stm32+uC/OS-II】ucosii移植簡單詳細步驟
- STM32 加入調試信息來調試代碼
- NRF24L01 無線通信模塊使用