最近在做定时器中断服务调用AD转换时遇到了“while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET)”死循环的问题。
后来在调试的过程中发现,上电后在进入定时器初始化函数时,定时器直接触发了中断服务。然而若此时还未执行ADC初始化函数,那么进入中断后ADC未被配置,所以会陷入上述的死循环。解决方法可以将ADC初始化函数放到定时器初始化函数前;或在定时器初始化种清中断标志位。
uint16_t ADC_value;
int main()
{
ADC_INIT();
TIMER1_INIT();
while(1)
{
}
}
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1, TIM_IT_Update)==SET)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);
ADC_value = ADC_GetConversionValue(ADC1);
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清定时器1中断标志位
}
}