EXTI

Extern Interrupt 外部中断
EXTI 可以监测指定 GPIO 口的电平信号,当其指定的 GPIO 口产生电平变化时,EXTI 将立即向 NVIC 发出中断申请,经过 NVIC 裁决后即可中断 CPU 主程序,使 CPU 执行 EXTI 对应的中断程序

支持的触发方式:上升沿/下降沿/双边沿/软件触发
支持的 GPIO 口:所有 GPIO 口,但相同的 Pin 不能同时触发中断
通道数:16 个 GPIO_Pin,外加 PVD 输出、RTC 闹钟、USB 唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

Pasted image 20240716212859.png

AFIO 中断引脚选择模块,实际上是一个数据选择器
在所有 GPIO 外设中选择一个 GPIO 连接到之后的 EXTI 通道(相同的 Pin 不能同时触发中断的原因)

GPIO 的 16 个端口与 4 个蹭网的外设并列接入 EXTI 电路
经过 EXTI 电路后分为两种输出

Pasted image 20240716220251.png

屏蔽寄存器与输入的中断信号相与,相当于开关控制
当屏蔽寄存器写 0 时,输出为 0,相当于屏蔽了中断

使用外部中断模块的特性:
外部驱动很快的突发信号

按键不推荐使用外部中断读取,不好处理按键抖动和松手检测
可以在主程序中循环读取,也可使用定时器中断读取

void EXTI_DeInit(void);  //将EXTI配置都清除
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);  //结构体配置EXTI 外设
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); //将传递的结构体变量赋默认的值

void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
//软件触发外部中断

//在主程序中
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); //查看指定标志位是否置1
void EXTI_ClearFlag(uint32_t EXTI_Line);  //对置1的标志位清除

//在中断函数中
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); //在中断函数中查看标志位 是否置1
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);  //清除挂起中断标志位

//四个函数本质上都是读写状态寄存器
typedef enum
{
  EXTI_Trigger_Rising = 0x08,
  EXTI_Trigger_Falling = 0x0C,  
  EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;

实际中断的配置流程

配置 RCC,将涉及到的外设的时钟都打开
EXTI、NVIC 外设时钟一直保持打开,无需开启