本帖最后由 涵潇舒雅 于 2013-11-29 19:15 编辑
首先介绍一下大体功能,我用的是adc1 通道1,2,3.利用DMA将采集到的数据保存到下面的二维数组里面;
vu16 ADC_RCVTab[10][3] ;//保存ADC的转换值
这是DMA的配置
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟
DMA_DeInit(DMA1_Channel1); //将DMA的通道1寄存器重设为缺省值
Dma_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//ADC1_DR_Address; //DMA外设ADC基地址
Dma_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RCVTab; //DMA内存基地址
Dma_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存
Dma_InitStructure.DMA_BufferSize = 30; //DMA通道的DMA缓存的大小
Dma_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
Dma_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
Dma_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据宽度为16位
Dma_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存数据宽度为16位
Dma_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环模式
Dma_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
Dma_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &Dma_InitStructure); //根据DMA_InitStruct中付ǖ牟问跏蓟疍MA的通道USART1_Tx_DMA_Channel所标识的寄存器
DMA_Cmd(DMA1_Channel1, ENABLE);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //工作在扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; //定时器TIM2_CH2触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 2, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3 , 3, ADC_SampleTime_239Cycles5);
因为我想对三条通道采样10次,然后求其最大值和最小值,以通道1为例 ADC_RCVTab[x][0]这是通道1十次采样的数据,存在的问题:在采样期间ADC_RCVTab[0][0] 发生变化,理论上说应该是每十次采样之后,才发生一次变化,但是实际运行的时候,有时候采样2或3最多是4次 就发生变化了;
|