最近使用到了STM32F030CCT6,较之前经常使用的STM32F207还是有些区别的,今天主要说一下STM32F030 多路ADC采样(非DMA连续方式)遇到的一些问题,供其他同志参考。
首先,ST官方的STM32F0系列的官方标准库函数存在问题,也有可能是我手上的不是最新版本,但着实是个不小的坑,之前在使用STM32F07X系列的时候就遇到了,但过了一段时间又给忘了,让我调试了半天才发现。
官方原版:
void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_ADC_ALL_PERIPH(ADCx));
assert_param(IS_ADC_CHANNEL(ADC_Channel));
assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));
/* Configure the ADC Channel */
ADCx->CHSELR |= (uint32_t)ADC_Channel;
/* Clear the Sampling time Selection bits */
tmpreg &= ~ADC_SMPR1_SMPR;
/* Set the ADC Sampling Time register */
tmpreg |= (uint32_t)ADC_SampleTime;
/* Configure the ADC Sample time register */
ADCx->SMPR = tmpreg ;
}
修改之后:
void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_ADC_ALL_PERIPH(ADCx));
assert_param(IS_ADC_CHANNEL(ADC_Channel));
assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));
/* Configure the ADC Channel ,删除或运算 */
ADCx->CHSELR = (uint32_t)ADC_Channel;
/* Clear the Sampling time Selection bits */
tmpreg &= ~ADC_SMPR1_SMPR;
/* Set the ADC Sampling Time register */
tmpreg |= (uint32_t)ADC_SampleTime;
/* Configure the ADC Sample time register */
ADCx->SMPR = tmpreg ;
}
其次,在多路ADC通道非DMA连续采样方式下,发现各通道ADC采样数据出现了一个偏移错位,这里和我的采样方式有一定的关系。但确实在操作上和STM32F2系列有些不同,我是将之前STM32F207的采样程序直接拿过来用的,分析之后发现了问题所在,即配置通道启动采样后必须读取采样数据,如果没有读取数据,即使随后配置了其他通道并启动采样也会导致读取的数据是之前的采样数据(间隔很短的情况下),所以STM32F030尽量保证通道配置、启动与读取匹配出现,防止数据异常。
ADC_ChannelConfig(ADC1, chanel_num[AI_CurrentCH], ADC_SampleTime_55_5Cycles);
ADC_StartOfConversion(ADC1);
ADC_GetConversionValue(ADC1);即使有一次的采样数据不需要,也要执行对应的读取操作