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(高电平时响),多谢各位大佬。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>