使用
STM32F401RET6芯片,sysem
tick产生5ms中断,主程序查询5ms是否有到,到了就做启动一次ad转换(查询方式),下一个5ms去判断转换是否结束(实际转换不需要这么长时间),如果转换结束就读取转换值。再下一个5ms来又启动转换,如此循环。但是现在现象是,进入调试后,可以正常转换几次,转换值也是正确的,紧接着就是不能查询到转换结束标志EOC,但STRT一直为1. 如果改变写法,启动adc后,立即等待adc做完,这样写就正常。
u16 Get_Adc(void)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_480Cycles );
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);
}
void adc_scan(void) //@5ms
{
#if 1 // 这样写就正常
res = Get_Adc();
cnt++;
return;
#else // 这样写就开始正常转换,几次后EOC标志就不会被置位。
if(index == 0)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_480Cycles );
ADC_SoftwareStartConv(ADC1);
index = 1;
}
else
{
if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ) == SET)
{
ADC1->SR = ~(uint32_t)ADC_SR_EOC;
cnt++;
res = (uint16_t)ADC1->DR;
index = 0;
}
}
#endif
}
哪位有遇到过这种情况吗?为什么不立即去等ADC做完就有问题,还是adc就有这种限制?