坑爹的官方例子代码,坑爹的驱动
整了一下午,终于发现问题:
/*ADC初始化时,将ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;但时钟只转换了一次*/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;//ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;//ADC_DMAMode_OneShot;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
官方驱动ADC_CommonInit(ADC1, &ADC_CommonInitStructure);是对ADCx_CCR进行配置
而器件手册RM3316上明确指出ADCx_CFGR的ADC_CFGR_DMACFG是对DMA单次还是连续转换的控制开关,
使用ADC_DMAConfig(ADC1,ENABLE) ;还是不能连续转换,进入ADC_DMAConfig函数:修改代码
void ADC_DMAConfig(ADC_TypeDef* ADCx, uint32_t ADC_DMAMode)
{
/* Check the parameters */
assert_param(IS_ADC_DMA_PERIPH(ADCx));
assert_param(IS_ADC_DMA_MODE(ADC_DMAMode));
/* Set or reset the DMACFG bit */
ADCx->CFGR &= ~(uint32_t)ADC_CFGR_DMACFG;
/*Modify By SuperSnoic.LYL 2013.7.31*/
if(ADC_DMAMode==ENABLE)
{
ADCx->CFGR |= ADC_CFGR_DMACFG;
}
}
终于连续转换了
坑爹的
|