概要
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行,本文将介绍EXTI外部中断的基本知识。(本文部分资料来源于B站UP江协科技)
整体架构流程
外部中断基本逻辑,外设接口上的输入线连接边沿检测电路检测到电平变化,通过提前设置是上升沿触发选择寄存器(上升沿触发中断模式)还是下降沿出发选择寄存器工作来产生中断信号,此时这个中断请求会被挂起到请求挂起寄存器,如果中断屏蔽寄存器“允许”这个中断,即没有被屏蔽就会将这个中断请求传至NVIC中断控制器来决定后续中断的实现。
原理图拆分
中断的产生:
通过配置边沿检测电路的工作方式,如上升沿触发,下降沿触发或者双边沿触发,当触发器检测到了对应的边沿跳变,即产生了中断请求就会输出有效信号‘1’(反之输出‘0’)到或门电路。可以看到与或门电路连接的还与软件中断寄存器相连接,意味着除了通过边沿检测的方式产生中断外还可以通过内部写定的软件中断寄存器,该寄存器不使用时默认为‘0’,使用时置‘1’,我们知道或门电路只有输入端都为‘0’时才输出‘0’,这样经过或门电路就丰富了中断的来源。
中断挂起与屏蔽:
整个图中含有多个20,这个符号表示有20条类似的线路。通过查阅中文参考手册可以找到以下解释:
默认置0表示屏蔽,对于需要开放式的中断请求置‘1’开放。可同时对20位进行配置。
默认置‘0’表示当前没有待处理的中断请求,当外部中断线发生了选择的边沿事件自动置‘1’时表示该处请求等待处理,当手动写‘1’时,寄存器会自动翻转成‘0’来清除这个挂起位。
与门电路理解:
关于这段与门电路,当一个中断请求产生时会被挂起等待,此时请求挂起寄存器置1,如果中断屏蔽寄存器中没有屏蔽这个终端请求即屏蔽寄存器置1,此时与门输出是1,即中断允许处理(如果这个请求被屏蔽,即屏蔽寄存器置0,此时与门输出是0,该终端不会被处理),这样就实现了开关的功能 。这个中断请求就会被输出到NVIC中断控制器进行处理,这时挂起寄存器需要清0表示当前没有等待处理的请求。
事件屏蔽寄存器:
不同于中断屏蔽寄存器主要处理外部中断,此寄存器主要是对如定时器事件、DMA请求等的响应,是用来处理内部中断的。
对于内部事件也有一个事件挂起操作再和事件屏蔽器进行与门处理,也由请求挂起寄存器“胜任”,工作原理与中断屏蔽寄存器类似。、
内部事件的产生跟外部中断的产生是有区别的,此时输入线上的边沿检测有些许不同通常是PWM信号,RTC警报,看门狗复位等本文主要是外部中断事件,故在此不详细展开。
外部中断/事件线路映像
这里使用GPIO作为外部中断源时就使用了GPIO中AFIO的引脚复用功能。
这么一来,刚开始的框架图上的20条中断线了解清楚了,其中16条由GPIO复用而来,另外四条在中文参考手册也有指明
通过这个映射表我们可以看到一个EXTI在使用时只能对应GPIO(A到G)的一个Pin_口即不会出现PA0和PB0同时占用EXTI0口的情况,而且每种Pin_口所使用的EXTI通道是固定的。
值得注意是在查看中断事件映射表时,可以看到EXTI0到EXTI4是可以单独配置的中断线而EXTI9_5和EXTI15_10被划分为了两组进行统一配置。
NVIC中断控制器
NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是ARM Cortex-M微控制器中用于管理中断和异常的硬件组件。它负责处理中断请求、异常和优先级管理。NVIC的设计允许高效的中断处理和灵活的配置。
外部中断源产生的中断传入NVIC后,在NVIC进行中断的优先级处理,再将处理后的信息传给CPU,减少CPU的工作负担,提高处理效率。
中断优先级
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
同类型优先级数字越小的优先级越高,中断号同样也可以在参考手册中断事件向量表中查到