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 无线通信模块使用