今天了解了:
中断

中断有多个类别包括:USART中断,I2C中断等;
并通过NVIC来分配中断的优先级


EXTI
EXTI的内部结构:

EXTI线

🔧 一、EXTI系统核心架构
1. 中断源输入(左上区域)
- GPIO引脚 :
支持最多4个GPIO端口(A/B/C/D)的引脚作为中断源。
注意:每个GPIO引脚都能触发中断。 - 信号合并 :
多个GPIO引脚通过 "多路选择器(MUX)" 汇合到一条EXTI线上。
关键限制 :同一时间,每条EXTI线只能连接一个GPIO引脚!
2. 中断线分配(中间黄色铃铛图标)
- EXTI线数量 :
共有20条独立中断线 :EXTI0
~EXTI15
:16条通用线(可分配给任意GPIO引脚)EXTI16
~EXTI19
:4条专用线(用于特定事件,如PVD、RTC闹钟等)
- 资源复用 :
EXTI0可同时被PA0、PB0、PC0、PD0使用,但只能选择其中一个。
3. 中断触发逻辑(右上区域)
- 每条EXTI线可独立配置触发模式 :
- 上升沿触发(
Rising Edge
) - 下降沿触发(
Falling Edge
) - 双边沿触发(
Both Edges
)
- 上升沿触发(
- 中断信号最终传递到 NVIC(嵌套向量中断控制器),执行用户中断服务函数。
⚙️ 二、GPIO与EXTI的绑定规则
1. 引脚号决定EXTI线号
- 引脚0(如PA0/PB0)→ 绑定到EXTI0
- 引脚1(如PA1/PB1)→ 绑定到EXTI1
- ...
- 引脚15(如PA15/PB15)→ 绑定到EXTI15
2. 端口选择(通过AFIO寄存器配置)
- 示例代码(STM32标准库):
- 以中断优先级分组2为例:
cpp
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
cpp
//#1.初始化PA5和PA6
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
//PA5
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//PA6
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//#2.为EXTI5和EXTI6分配引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
//#3.初始化EXTI的线
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line5;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line = EXTI_Line6;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
//#4.配置NVIC
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
⚠️ 三、重要设计约束
-
专用中断线:
EXTI16
:连接PVD(可编程电压检测)EXTI17
:连接RTC闹钟EXTI18
:连接USB唤醒事件EXTI19
:连接RTC入侵检测
注意:这些线无法分配给GPIO引脚。
💎 四、总结与配置流程
-
硬件连接 :
确定要用作外部中断的GPIO引脚(如PA0)。
-
EXTI线映射 :
根据引脚号选择EXTI线(如PA0 → EXTI0)。
-
端口绑定 :
在
AFIO_EXTICR
寄存器中设置EXTI0的信号源为GPIOA(而非GPIOB等)。 -
中断参数配置:
- 选择触发模式(上升沿/下降沿/双边沿)
- 使能中断(
EXTI->IMR
寄存器) - 在NVIC中启用该EXTI线的中断请求
-
实现中断服务函数 :
编写
EXTI0_IRQHandler()
函数并清除中断标志。