#define ADC1_DR_Address ((uint32_t)0x4001244C) // ADC1外设的地址
__IO uint16_t ADC_ConvertedValue[16] = {0}; // 自定义的DMA数据传输的内存地址,也就是说DMA传输的数据存到这个数组里(这里定义的数组长度为16,数据类型为uint16)
void DMA_InitConf(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1); // 将DMA1_Channel1设为缺省值(也就是重置或复位一下)
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 外设地址,也就是上面定义的ADC1外设地址,DMA从这里取数据,然后通过DMA传输到内存地址里
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; // 内存地址,也就是上面定义的那个数组,DMA传输的数据存在这里,取数据就直接读这个数组里的数据就行
前面的(u32)是将地址扩展为32位长度,因为 DMA_InitStructure.DMA_MemoryBaseAddr 在库里的定义 就是32位长度的地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // DMA的数据传输方向,这里定义外设(ADC1)为数据源,从外设传输数据到内存
DMA_InitStructure.DMA_BufferSize = 16; // 缓冲区大小,用来暂时存储ADC转换的数据,这里与数组的长度一致
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址是否递增,这里数据源只是ADC1,所以外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址是否递增,这里我们设置成内存地址递增,因为我们的内存地址是数组,所以地址要递增,否则就只往首地 址里写
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据长度,也就是ADC转换出来的数据的长度,这里设置为半字,也就是16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 内存数据长度,也就是存数据所用的内存地址的长度,这里设置为半字,也是16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // DMA的传输方式为循环方式,即不断的传输数据
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 所使用的通道的优先级,这里设置为高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // M2M 即 memory_to_memory方式,我们一般不用,选择关闭
DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 完成DMA的配置,同时选择DMA的通道1。因为映射表中ADC1 对应与DMA1的channel_1
DMA_Cmd(DMA1_Channel1, ENABLE); // 使能DMA1的通道1  
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); // DMA1 的中断控制,可以选择中断条件,这里选择的是完全传输完成中断,就是在数据完全传输完成后,产生中断,用户可以 在中断函数中区数据清除中断标志位等操作,中断函数如下:
void DMA1_Channel1_IRQHandler() {
..................... ;
DMA_ClearITPendingBit(DMA1_IT_TC1);
}
} |