代码在后面,前面为理论部分
- 中断服务函数void handle(void),不需要声明,快进快出,避免死循环,大量循环,以及大量延迟函数
- 中断有硬中断(硬件触发),软中断(软件触发);单片机的中断是硬件处理机制
- 接下来都是单片机的中断,都是实际存在的而且固定的东西
分为
内部中断:
内核引发的中断:系统中断(异常)
内核外引发的:片上外设中断,例:串口、ADC引发的
外部中断
外设引发的,例按键,通过GPIO
NVIC:中断嵌套向量控制器(受内核控制)
在内核手册里,但是我们不用寄存器设置,直接用库函数设置;
NVIC_SetPrority()
作用:
- 设置中断优先级
- 使能中断(让开关生效)
- 根据中断编号匹配中断服务函数
优先级:用数字表示,数字越小,优先级越高。
占先优先级(抢占优先级):高的中断可以打断占先优先级低的中断,例:在中断中执行中断;事件1(占先2),事件2(占先3),可以在事件2执行过程中执行事件1;
次级优先级:当占先优先级一样,次级优先级高的先执行;
次级优先级高的中断不可以打断次级优先级低的中断
该图包含了我们要操作的具体部位
故当设置外部中断时候要注意分开引脚号避免冲突
代码实现:
接下来进入正题:
绑定输入线和GPIO口需要配置:
外部中断配置寄存器:1)EXIT通道,2)哪个端口
AFIO->EXTICR[0] &= ~(0XF << 0);//将PA0与EXTI0绑定
EXTI->FTSR |= (0X1 << 0);//EXTI0选择下降沿
EXTI->IMR |= (0X1 << 0);//开放EXTI0的中断请求
//NVIC配置
NVIC_SetPriority(EXTI0_IRQn, 1);//数据设置优先级,1是0x1
NVIC_SetPriority_group(5)//下图,设置一次就行(main函数中)
NVIC_EnableIRQ(EXTI0_IRQN)//中断使能
//EXTIO_IRQN为中断编号
接下来写中断执行服务函数(无需调用)
//先判断挂起寄存器,先清除挂起寄存器
void EXTI0_Handler(void)
{
if(EXTI->PR & (0X1 << 0))//判断是否为1
{//清除中断
EXTI->PR |= (0X1 << 0);
//写要执行的代码
flag ^= 1;//异或实现开关反转
}
}
作业:
按键1呼吸灯,按键2流水灯,按键3中断;