26.3.20 ZD-EP61 [EXTI] EXTI介绍及其工作原理
1 EXTI简介
1.1 EXTI介绍
EXTI,External(Extended) interrupt/event Controller,外部(拓展)中断事件控制器。包含23(F4系列)个产生事件/中断请求的边沿检测器,即23条EXYI线。
中断和事件的对比:
- 中断:进入NVIC、有中断服务函数、需CPU处理
- 事件:不进入NVIC、仅用于内部硬件自动控制、无需CPU,如TIM,DMA,ADC
之前误认为中断事件是一个完整的词,所以在之前的文章有出现类似描述一般指中断而非事件。
1.2 EXTI支持的外部中断/事件请求
如图,展示了各个系列支持的外部中断/事件请求,其中H7系列因其功率较高,因此提供了更多的中断选择来提高程序效率降低功耗。

1.3 EXTI的主要特性
对于F1/F4/F7系列,其每条EXTI线都可以单独进行配置:选择类型(中断/事件),触发方式(上升/下降/双边沿触发,即电平的高低变化),支持软件触发(不常用),开启/屏蔽,有挂起状态位(指明该EXTI线已触发但位处理,需要手动置0)。
而H7系列因其独特的特性,将其他外设对EXTI产生的事件分为可配置事件和直接事件,可配置事件类似于上述描述,而直接事件则固定了为上升沿触发,不支持软件触发,无挂起状态(由其他外设提供)。
2 EXTI工作原理(F4系列)
2.1 EXTI工作原理图

从 EXTI 功能框图可以看到有两条主线,一条是由输入线到 NVIC 中断控制器,一条是由输入线到脉冲发生器。这就恰恰是 EXTI 的两大部分功能,产生中断与产生事件,两者从硬件上就存在不同。
下面让我们看一下 EXTI 功能框图的产生中断的线路,最终信号是流入 NVIC 控制器中。输入线是线路的信息输入端,它可以通过配置寄存器设置为任何一个 GPIO 口,或者是一些外设的事件。输入线一般都是存在电平变化的信号。
标号① 是一个边沿检测电路,包括边沿检测电路,上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’到标号②部分电路,否则输入无效信号‘0’。边沿跳变的标准在于开始的时候对于上升沿触发选择寄存器或下降沿触发选择寄存器对应位的设置,对应位的设置可以参照一下表 16.1.1.2.1。
选择寄存器置1代表生效,检测到对应信号则输出,都置1即双边沿检测。
标号② 是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输入信号。或门电路只要输入端有信号‘1’,就会输出‘1’,所以就会输出‘1’到标号③电路和标号④电路。通过对软件中断事件寄存器的读写操作就可以启动中断/事件线,即相当于输出有效信号‘1’到或门电路输入端。
标号③是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号。与门电路要求输入都为‘1’才输出‘1’,这样子的情况下,如果中断屏蔽寄存器(EXTI_IMR)设置为 0 时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是 0;假如中断屏蔽寄存器(EXTI_IMR)设置为 1 时,最终标号③电路输出的信号才由标号②电路输出信号决定,这样子就可以简单控制 EXTI_IMR 来实现中断的目的。标号③电路输出‘1’就会把请求挂起寄存器(EXTI_PR)对应位置 1。
与前面相反,置0表示生效(即中断被屏蔽)
最后,请求挂起寄存器(EXTI_PR)的内容就输出到 NVIC 内,实现系统中断事件的控制。
标号④电路输出有效信号 1 就会使脉冲发生器电路产生一个脉冲,而无效信号 就不会使其产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。
2.2 EXTI寄存器实现
参见参考手册:

对上升/下降沿触发选择器,其0-22位使用(对应23条EXTI线),其余位保留,置1表示启用。

位的使用与R/FTSR同理,但置0才表示启用屏蔽。

当有信号1输入时,PR硬件置1,再写入1可以清除,也可改变边沿检测极性(对当前检测方式取反)来清除。
对应H7系列,较为繁琐,这里不做介绍,可以自行查阅参考手册。
3 EXTI与IO的映射关系
前面我们可以知道EXTI0~15对应的GPIOx_PIN0~15,但是这里还有一个x,这个x如何确定就是EXTI与IO的映射关系。
3.1 AFIO(F1系列)
AFIO,Alternal Function IO,即复用功能IO,主要用于重映射和外部中断映射配置。其功能如下:
- 调试IO配置:AFIO_MAPR[26:24],配置JTAG/SWD开关状态。
- 重映射配置:AFIO_MAPR,部分外设IO重映射配置。(MAPR配置用处不大,主要掌握EXTICR)
- 外部中断配置:AFIO_EXTICR(EXTI Configuration Register)1~4,配置EXTI中断线0~15具体对应到哪个IO口。
注意:在启用AFIO前要将AFIO的时钟使能,通过__HAL_RCC_AFIO_CLK_ENABLE()函数实现。
3.2 SYSCFG(F4/F7/H7系列)
SYSCFG,System Configuration controller,即系统配置控制器,用于外部中断映射配置等(含其他功能,不过多解释),其主要功能就是用于外部中断配置,通过SYSCFG_EXTICR1~4寄存器实现,原理与AFIO_EXTICR类似,下面会介绍到。
注意:同理,在启用SYSCFG之前要将SYSCFG的时钟使能,通过__HAL_RCC_SYSCFG_CLK_ENABLE()函数实现。
3.3 EXTI与IO的对应关系
如图:

简单来说,EXTIx中对应的x是多少,体现在PXx中就是PX的引脚号为多少,那端口号X呢?就是通过我们前面说到的EXTICR的[3:0]位域进行配置的。
3.4 EXTICR1~4寄存器(针对SYSCFG)
为什么有1~4?我们看图:

我们可以看到,EXTICR是一个32位寄存器,而它的高16位保留,只使用了0~15位,又将这16位分成了4组,即对应EXTI0~3,每个EXTIx都占用4个位,这四个位就决定了这个EXTI线到底连接的是哪个GPIO端口。
可知一个32位的EXTICR只分配了四个EXTI线,因此要有四个EXTICR来对应总共4*4=16个EXTI线,也就是16个GPIO引脚。
4 结语
睡觉。