为什么RESET之后 定时器的中断总会被无端端的触发一次?

2019-07-20 12:19发布

void EXTI4_IRQHandler(void){
        delay_ms(10);
        if(SW3) //判断中断来源,确定是switch3
        {
                BUZZER=1;  //打开蜂鸣器
                TIM3->ARR=3000;  //设置timer时长,arr=3000是300ms
                TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);  //使能timer的中断触发
                TIM_Cmd(TIM3,ENABLE);  //使能timer
        }
        EXTI_ClearITPendingBit(EXTI_Line4);  //清理标志位
}


void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)  //判断中断类型
        {
                BUZZER=0;  //关闭蜂鸣器
                LED1=0; delay_ms(100); LED1=1; //闪一下LED
                TIM_Cmd(TIM3,DISABLE);  //关闭timer
                TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);  //关闭timer的触发
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清理标志位
}


很简单的一个小程序,功能是:按键(触发外部中断)之后,蜂鸣器响300ms(触发定时器中断)之后,关闭蜂鸣器并闪一下LED(示意定时器中断已被触发)。

功能测试基本正常,唯一的问题就是,reset之后第一次按键的时候不响,只有led闪。第二次及之后的按键,就一切正常了,先响后亮。
好像程序运行的第一次触发定时器中断时,没有按照“arr=3000”设定的300ms来跑,而是直接就触发了。

整个project打包放在附件了,LED1上拉在PF9(低电平时亮),蜂鸣器下拉在PD11(高电平时响),多谢各位大佬。




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。