EXTI
EXTI简介
EXTI:译作外部中断/事件控制器,STM32的众多片上外设之一,能够检测外部输入信号的边沿变化并由此产生中断。
例如,在检测按键时,按键按下时会使电平产生翻转,因此可以使用EXTI来读取按下时的边沿变化,从而给NVIC输出一个中断触发信号,通过中断响应函数实现想要的功能。
EXTI内部结构
当外部输入信号输入时,首先会经过一个叫边沿检测的模块,它有两路输出信号,分别是上升沿信号和下降沿信号。当外部输入信号发生一个上升沿时,边沿检测模块会在上升沿信号路输出一个脉冲信号(下降沿正好相反)。这两路输出信号再经过一个或门,形成双边沿信号路,即无论上升沿还是下降沿都会此路产生脉冲信号。
通过数据选择器(复用器),从上述的三路里选择一路,连接到输出(例如,选择上升沿信号路,相当与选择了上升沿进行触发,意思是只有当输入信号发生上升沿时,会触发中断)。数据选择器就是用来选择中断触发的边沿。
再往右走,有一个或门,一端连接了外部输入信号变化所触发的脉冲信号,另一端连接到了软件触发。(即:我们既可以通过外部输入信号的边沿变化去触发一个中断,也可以通过软件编程直接去触发中断)
再往右还有中断屏蔽和事件屏蔽,最后是中断挂起(其实就是挂起寄存器的一个比特位),当中断挂起收到脉冲信号后,其值由0变1,但是它不能完成自动清零,我们必须手动向这个寄存器写0。
因为挂起寄存器直接与NVIC相连接 ,若不置零,则NVIC输入端一直有中断触发信号,中断响应函数就会一直被循环执行。
EXTI通道
有时为了检测多个信号,将上图所示结构复制很多份,在EXTI里有20份这样的结构(即:EXTI0~EXTI19,且20份合起来才是一个完整的片上外设)。
作用:
1、让所有IO具有触发中断的能力
每个普通IO引脚都可以被设置为中断/事件的输入线,占用EXTI0~EXTI15共16个通道。但需要注意的是,对于数字编号相同的引脚来说,不能同时触发中断(例如我使用了PA0,就不能同时使用PB0、PC0等)。
注意,EXTI5~EXTI9、EXTI10~EXTI15这两组通道的输出端连接在或门上。
2、其他功能
如下所示,用于特定的外设事件的EXTI16~EXTI19:
EXTI寄存器组
对于EXTI模块,其寄存器组如下(6个):
每一个寄存器有20个比特位,对应了EXTI的20个通道。
上升/下降沿选择寄存器
通过这两个寄存器来配置外部输入信号的触发方式(即:上升沿、下降沿或双边沿触发),相当于控制了复用器。
以TR0为例,当上升/下降沿选择触发器TR0分别为1、0时,为上升沿触发;分别为0、1时,为下降沿触发;均为1时,为双边沿触发。
其他寄存器
软件触发寄存器 :将对应比特位置1,软件触发的位置就会发出一个脉冲。
中断屏蔽寄存器:向其比特位写0,中断就被屏蔽;写1,中断就会被挂起;
挂起寄存器:通常写这个寄存器,将其主动清零。
事件屏蔽寄存器:负则事件屏蔽的开关,方法与中断屏蔽寄存器一样。
事件
指突发事件本身,一般是一个脉冲信号,事件的处理过程不需要CPU介入(例如片上外设A产生了一个事件,那么它可以直接调用片上外设B去处理事件)。
EXTI标准库编程
在文件夹std_periph_driver里面存储着标准库的源码,其中stm32f10x_exti.h和stm32f10x_exti.c两个文件组成了EXTI的驱动。
EXTI_Init
用于初始化EXTI的某个通道。
cpp
void EXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);
此函数的参数为结构体变量,初始化之前需要自己对其赋值,具体赋值的内容如下 :
需要注意,EXTI也不需要开启时钟,虽然EXTI是片上外设,但它与芯片唤醒有关,比较特殊,其时钟默认开启,且不可关闭。
附其他函数: