外部中断
前言
中断
通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。
这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应。
同步中断
当指令执行时,由控制单元产生的。
之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断。
异步中断。
由其他硬件设备依照 CPU 时钟信号随机产生的。
通常我们所说的中断指的是异步中断,我们将同步中断称为异常。异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的。
作用
通过中断可以使处理器转而去优先运行正常控制流之外的代码。
优先级
中断与IRQ
每个能够发出中断请求的硬件设备控制器都有一条名为IRQ(lnterrupt ReQuest) 的输出线。
STM32中断
Cortex-M
爱特梅尔公司发布的全新ARM® ARM D20微控制器,采用的是全球微控制器标准。
NVIC
提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC)”。
中断优先级
NVIC中有一个8位中断优先级寄存器NVIC_IPR,理论上可以配置0~255共256级中断。
STM32只使用了其中的高4位,并分成抢占优先级和子优先级两组。
中断嵌套
- 多个中断同时提出中断申请时:先比较抢占优先级,抢占优先级高的中断先执行。如果抢占优先级相同,则比较子优先级。
- 二者都相同时,比较中断编号。编号越小,优先级越高。
中断编号位于芯片头文件中。
优先级分组
HAL库初始化函数HAL_Init将优先级分组设置为第4组,即有0~15,共16级抢占优先级,没有子优先级。编号越小的优先级越高。
外部中断
EXTI
External interrupt/event controller,外部中断/事件控制器,管理了控制器的 20个中断/事件线。
每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线单独配置为中断或者事件,以及触发事件的属性。
GPIO引脚的外部中断触发方式
- 上升沿触发
- 下降沿触发
- 双边沿触发
引脚分组
配置外部中断
- 开启IO口时钟,初始化IO口为输入。
- 开启IO口复用时钟。
- 设置IO口与中断线的映射关系。
- 初始化线上中断,设置触发条件等。
- 配置中断分组(NVIC),并使能中断。
- 编写中断服务函数。
- 清除中断标志位。