外部中断
1.初始化 IO 口为输入。
2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。
3)开启与该 IO 口相对的线上中断/事件,设置触发条件。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数
GPIOA 有16个中断通道
RCC->APB2ENR|=1; //AFIO时钟
RCC->APB2ENR|=1<<3; // GPIOB
RCC->APB2ENR|=1<<6; //GPIOE
AFIO->EXTICR[0] &=0x0FF0;//中断0 中断3
AFIO->EXTICR[0] |=0x4000;//PA0 PE3
AFIO->EXTICR[1] &=0xFFF0;
AFIO->EXTICR[1] |=0x0004;//PE4 中断4
EXTI->IMR |=1<<0;//开放来自线0上的中断请求。
EXTI->RTSR|=1<<0;//线0上的上升沿触发事件配置位
EXTI->IMR |=1<<3;//开放来自线3上的中断请求。
EXTI->FTSR|=1<<3;//线3上的下降沿触发事件配置位
EXTI->IMR |=1<<4;开放来自线4上的中断请求。
EXTI->FTSR|=1<<4;//线4上的下降沿触发事件配置位
服务函数
void EXTI0_IRQHandler(void)
{
delay_ms(10);
if(KEYUP==1)
{
beep=!beep;
}
EXTI->PR|=1;
}
void EXTI3_IRQHandler(void)
{
delay_ms(10);
if(KEY0==0)
{
led0=!led0;
}
EXTI->PR|=1<<3;
}
void EXTI4_IRQHandler(void)
{
delay_ms(10);
if(KEY1==0)
{
led1=!led1;
}
EXTI->PR|=1<<4;
}