今天了解了:
中断
中断有多个类别包括: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为例:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//#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()
函数并清除中断标志。