大家看看这段代码,很简单,好像没有问题。应该能得到方波输出。
extern u8 gpio_flg;
void TIM2_IRQHandler(void)
{
if(gpio_flg==0) {
gpio_flg = 1;
GPIO_SetBits(GPIOB, GPIO_Pin_12);
} else {
gpio_flg = 0;
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
但实际上的波形确实这样的。 为什么没有得到方波?引脚输出刚拉上去,马上就被拉下来了。就像中断被执行了两次一样。 将代码修改如下,将清除中断的语句往上提;
extern u8 gpio_flg;
void TIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
if(gpio_flg==0) {
gpio_flg = 1;
GPIO_SetBits(GPIOB, GPIO_Pin_12);
} else {
gpio_flg = 0;
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
}
然后得到了想要的方波。 我是不是该理解为 1)即使正在进行中断函数处理,STM32每隔一定时间刷新Timer中断。 2)在中断函数里,仍然会被同一个中断函数嵌套。 看来以后使用STM32中断的时候必须认真考虑清除中断的时机了。
|