昨天写的一个外部中断的程序,其中用到两个外部中断,每个中断只能触发一次,主函数运行正常,但是如果第一个中断触发完就不能再继续触发,只能触发第二个中断去。每个中断均只能触发一次。一下是中断的服务函数和初始化函数:
void EXTI15_10_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY0==0) //按键0
{
GPIOB->CRH&=0XFF0FFFFF;
GPIOB->CRH|=0X00300000;
GPIOB->ODR|=0<<13;
delay_ms(1000);
GPIOB->ODR|=1<<13;
}
else if(KEY1==0)//按键1
{
GPIOB->CRH&=0XFFF0FFFF;
GPIOB->CRH|=0X00030000;
GPIOB->ODR|=0<<12;
delay_ms(1000);
GPIOB->ODR|=1<<12;
}
KEY0==1;
KEY1==1;
EXTI->  R=1<<13; //清除LINE13上的中断标志位
EXTI->  R=1<<15; //清除LINE15上的中断标志位
}
//外部中断初始化程序
//初始化PA0,PA13,PA15为中断输入.
void EXTIX_Init(void)
{
// RCC->APB2ENR|=1<<2; //使能PORTA时钟
// JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
GPIOC->CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOC->CRL|=0X00000008;
GPIOC->CRH&=0X0F0FFFFF;//PA13,15设置成输入
GPIOC->CRH|=0X80800000;
GPIOC->ODR|=1<<13; //PA13上拉,PA0默认下拉
GPIOC->ODR|=1<<15; //PA15上拉
// Ex_NVIC_Config(GPIO_C,0,RTIR); //上升沿触发
Ex_NVIC_Config(GPIO_C,13,FTIR);//下降沿触发
Ex_NVIC_Config(GPIO_C,15,FTIR);//下降沿触发
// MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
}
|