搞了1天一直ADC没有出来,发现采处理的值一直是固定值..
去21IC求助贴.[STM32F0] STM32F030 ADC1采样问题请教
等了好久都没有人回复,但有人提醒我说需要等待DMA的数据完成.
后面对比了别人的代码,
/* ADC DMA request in circular mode */
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
别人有这句代码,于是我加上这个话,则能够正常采样到数据了,
所以,必须得添加,否则无法获取到采样值.
接着又发现DMA传输到指定的数组数据顺序错乱了.....
类似别人的求助贴:[STM32F0] STM32F030 多通道ADC DMA读取问题
后面解决方式,按照最后帖子的方式解决的
" F0的ADC在使用之前需要校准。这个7位的校准值也是放在ADC_DR中的,它也会触发DMA请求。可以参照F0的ADC-DMA例程,先做ADC校准、然后再设置DMA,再使能ADC的DMA。"
直接插入代码,正确的初始化代码:
- typedef enum
- {
- ADC_PORTA0 = ADC_Channel_0,
- ADC_PORTA1 = ADC_Channel_1,
- ADC_PORTA2 = ADC_Channel_2,
- ADC_PORTA3 = ADC_Channel_3,
- ADC_PORTA4 = ADC_Channel_4,
- ADC_PORTA5 = ADC_Channel_5,
- ADC_PORTA6 = ADC_Channel_6,
- ADC_PORTA7 = ADC_Channel_7,
- ADC_PORTA8 = ADC_Channel_8,
- ADC_PORTA9 = ADC_Channel_9,
- ADC_PORTA10 = ADC_Channel_10,
- ADC_PORTA11 = ADC_Channel_11,
- ADC_PORTA12 = ADC_Channel_12,
- ADC_PORTA13 = ADC_Channel_13,
- ADC_PORTA14 = ADC_Channel_14,
- ADC_PORTA15 = ADC_Channel_15,
- }AD_PORT;
-
- typedef enum
- {
- KEY_LINE_1,
- KEY_LINE_2,
- ADC_KEY_LINE_MAX = KEY_LINE_2,
- BATTERY_AD,
- ADC_NUM_CNT,
- }ADC_NUM;
-
-
- volatile u16 g_uADC_ConVal[ADC_NUM_CNT] = {0};
-
-
- u32 const g_uADNum[]=
- {
-
- ADC_PORTA9,
- ADC_PORTA8,
- ADC_PORTA2,
-
- };
-
-
- void Adc_Init(void)
- {
- ADC_DeInit(ADC1);
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
-
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
-
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
-
-
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
- GPIO_InitStruct.GPIO_Pin = AD_KEY1_PIN;
- GPIO_Init(AD_KEY1_PORT,&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = AD_KEY2_PIN;
- GPIO_Init(AD_KEY2_PORT,&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = BATTERY_AD_PIN;
- GPIO_Init(BATTERY_AD_PORT,&GPIO_InitStruct);;
-
-
- ADC_InitTypeDef ADC_InitStructure;
- DMA_InitTypeDef DMA_InitStructure;
- DMA_DeInit(DMA1_Channel1);
- DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR);
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_uADC_ConVal;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
- DMA_InitStructure.DMA_BufferSize = ADC_NUM_CNT;
- 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);
-
-
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
-
- ADC_StructInit(&ADC_InitStructure);
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;
- ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
- ADC_Init(ADC1, &ADC_InitStructure);
-
- for(u8 uCnt = 0;uCnt < ADC_NUM_CNT;uCnt++)
- {
-
- ADC_ChannelConfig(ADC1, g_uADNum[uCnt] , ADC_SampleTime_55_5Cycles);
- }
-
-
-
-
-
-
-
-
- ADC_GetCalibrationFactor(ADC1);
-
-
- DMA_Cmd(DMA1_Channel1,ENABLE);
-
-
- ADC_DMACmd(ADC1, ENABLE);
-
- ADC_Cmd(ADC1,ENABLE);
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); <span style="white-space:pre"> </span>
-
-
- ADC_StartOfConversion(ADC1);
- }
另外补充,ADC_ScanDirection_Upward及ADC_ScanDirection_Backward的简要说明。假设ADC1有18个通道,1,2....18
ADC_ScanDirection_Upward表示从1~18开始扫描
ADC_ScanDirection_Backward表示从18~1方向扫描
这样就决定了,用户指定的内存数组里面存值的顺序.
像上面的代码,则对应关系为g_uADC_ConVal[0]--->AIN9 g_uADC_ConVal[1]--->AIN8 g_uADC_ConVal[2]-->AIN2