关于stm32ADC的DMA采样,求大神看程序
时间:10-02
整理:3721RD
点击:
为什么我的采样老是有问题啊?求大神帮忙看看程序
用的是循环方式采样adc两个通道的值(10跟12), 通过dma来传输两个值。最后通过串口打印出来
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC1 工作在独立模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE;// 规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //规定了模数转换工作在连续还是单次模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对
ADC_InitStructure.ADC_NbrOfChannel=2; //the number of the channel is 2,
ADC_Init(ADC1, &ADC_InitStructure);//init dac1
ADC_DMACmd(ADC1, ENABLE);
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_12,2,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);//使能adc1
ADC_ResetCalibration(ADC1); // 重置adc校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)==SET);//得到重置校准寄存器状态
ADC_StartCalibration(ADC1); // 开始校准
while(ADC_GetCalibrationStatus(ADC1)); // 得到校准的寄存器的状态
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动软件转换
}
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//打开DMA1的时钟
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)0x4001244C;
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC1_ConvertValue;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//配置为外设作为数据的源头
DMA_InitStructure.DMA_BufferSize=2;//配置DMA通道的DMA缓存的值.感觉这里有问题,什么是dma缓存?如何确定大小?
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc=DMA_PeripheralInc_Enable;//内存地址寄存器不变
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
//这里跟寄存器的大小有关系,是16位,故为半字
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循环缓存模式
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//中优先级
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//不设置为内存到内存的传输,外设到内存
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化通道1
DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA1通道1
}
RCC_Configuration();
GPIO_Configuration();
Usart_Configuration();
TIM4_Configuration();
DMA_Configuration();
NVIC_Configuration();
ADC_Configuration();//这部分的配置应该没有问题,问题可能出在主函数和adc和dma的配置中
printf("\r\n");
GPIO_WriteBit(GPIOA,GPIO_Pin_1,(BitAction)0xff);
while(1)
{
printf("%d %d",ADC1_ConvertValue[0],ADC1_ConvertValue[1]);
printf("\r\n");
delay_ms(1000);//延时1s
}
}
用的是循环方式采样adc两个通道的值(10跟12), 通过dma来传输两个值。最后通过串口打印出来
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC1 工作在独立模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE;// 规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //规定了模数转换工作在连续还是单次模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对
ADC_InitStructure.ADC_NbrOfChannel=2; //the number of the channel is 2,
ADC_Init(ADC1, &ADC_InitStructure);//init dac1
ADC_DMACmd(ADC1, ENABLE);
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_12,2,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);//使能adc1
ADC_ResetCalibration(ADC1); // 重置adc校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)==SET);//得到重置校准寄存器状态
ADC_StartCalibration(ADC1); // 开始校准
while(ADC_GetCalibrationStatus(ADC1)); // 得到校准的寄存器的状态
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动软件转换
}
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//打开DMA1的时钟
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)0x4001244C;
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC1_ConvertValue;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//配置为外设作为数据的源头
DMA_InitStructure.DMA_BufferSize=2;//配置DMA通道的DMA缓存的值.感觉这里有问题,什么是dma缓存?如何确定大小?
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc=DMA_PeripheralInc_Enable;//内存地址寄存器不变
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
//这里跟寄存器的大小有关系,是16位,故为半字
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循环缓存模式
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//中优先级
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//不设置为内存到内存的传输,外设到内存
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化通道1
DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA1通道1
}
RCC_Configuration();
GPIO_Configuration();
Usart_Configuration();
TIM4_Configuration();
DMA_Configuration();
NVIC_Configuration();
ADC_Configuration();//这部分的配置应该没有问题,问题可能出在主函数和adc和dma的配置中
printf("\r\n");
GPIO_WriteBit(GPIOA,GPIO_Pin_1,(BitAction)0xff);
while(1)
{
printf("%d %d",ADC1_ConvertValue[0],ADC1_ConvertValue[1]);
printf("\r\n");
delay_ms(1000);//延时1s
}
}