目录
[1. EXTI 控制的寄存器](#1. EXTI 控制的寄存器)
[2. NVIC 控制的寄存器](#2. NVIC 控制的寄存器)
[3. EXTI 和 NVIC 的交互](#3. EXTI 和 NVIC 的交互)
EXTI(外部中断/事件控制器) 和 NVIC(嵌套向量中断控制器) 的控制寄存器是不同的 。这两个控制器分别有自己独立的一套寄存器来完成不同的功能。EXTI 寄存器主要用于外部中断的配置和管理 ,而 NVIC 寄存器则用于整体中断的优先级管理和使能控制。
1. EXTI 控制的寄存器
EXTI 控制器用于配置和管理外部中断(如 GPIO 引脚上的中断),它有自己专门的寄存器来设置中断的触发条件、使能、屏蔽等功能。EXTI 控制器的寄存器包括:
1.1 EXTI_IMR(中断屏蔽寄存器,Interrupt Mask Register)
- 用于使能或屏蔽 特定的外部中断线。对应位置
1
时,中断使能,0
时,中断被屏蔽。 - 每条 EXTI 线对应一位,位号与中断线号一致。例如,
IMR2
对应 EXTI2 线。
1.2 EXTI_EMR(事件屏蔽寄存器,Event Mask Register)
- 用于使能或屏蔽事件请求。与 IMR 类似,位
1
时,事件使能,位0
时,事件被屏蔽。 - 事件不会触发中断,但可能用于触发其他硬件模块。
1.3 EXTI_RTSR(上升沿触发选择寄存器,Rising Trigger Selection Register)
- 控制 EXTI 线的上升沿触发 。如果某一位设置为
1
,则对应的 EXTI 线会在上升沿(信号从低到高变化)时产生中断。
1.4 EXTI_FTSR(下降沿触发选择寄存器,Falling Trigger Selection Register)
- 控制 EXTI 线的下降沿触发 。如果某一位设置为
1
,则对应的 EXTI 线会在下降沿(信号从高到低变化)时产生中断。
1.5 EXTI_SWIER(软件中断事件寄存器,Software Interrupt Event Register)
- 允许通过软件触发中断 。对应位写
1
后,可以通过软件触发相应的 EXTI 线中断,而不需要等待外部信号变化。
1.6 EXTI_PR(挂起寄存器,Pending Register)
- 当外部中断线检测到有效的边沿变化时,EXTI_PR 的相应位会被置为
1
,表示该中断线有一个中断请求处于挂起状态。 - 在中断服务程序(ISR)中,通过向 PR 对应位写入
1
来清除挂起位,否则该中断可能无法再次触发。
2. NVIC 控制的寄存器
NVIC 控制器是整个系统的中断管理器,负责处理包括外部中断(EXTI)在内的所有中断源,并根据优先级调度这些中断。NVIC 有自己的一套寄存器,主要用于中断的优先级控制和中断使能/屏蔽。
2.1 NVIC_ISER(中断使能寄存器,Interrupt Set-Enable Register)
- 用于使能指定的中断 。如果某位被设置为
1
,对应的中断将被使能。 - STM32 中每个中断都有一个 IRQ 号(例如 EXTI2 对应的 IRQ 号为 EXTI2_IRQn)。通过将该中断对应的 IRQ 位写
1
,可以使能该中断。
2.2 NVIC_ICER(中断清除使能寄存器,Interrupt Clear-Enable Register)
- 用于禁用指定的中断 。如果某位被设置为
1
,对应的中断将被禁用。
2.3 NVIC_ISPR(中断挂起寄存器,Interrupt Set-Pending Register)
- 可以通过软件设置中断为挂起状态 。写
1
会将指定的中断置为挂起状态(即将中断请求传递给 NVIC,即使实际中断没有触发)。
2.4 NVIC_ICPR(中断清除挂起寄存器,Interrupt Clear-Pending Register)
- 用于清除挂起状态 。当某位写入
1
时,表示清除对应中断的挂起状态。
2.5 NVIC_IPR(中断优先级寄存器,Interrupt Priority Register)
- 用于设置每个中断的优先级。STM32 使用 NVIC_IPR 来设置不同中断源的优先级。每个中断的优先级可以独立配置,优先级越高的中断将优先被 NVIC 处理。
3. EXTI 和 NVIC 的交互
尽管 EXTI 和 NVIC 是两个独立的控制器,它们在中断处理中是相互协作的。
-
EXTI 控制器首先检测到外部信号的边沿变化(例如 GPIO 引脚上的变化),并在其 挂起寄存器(PR) 中置位,表示该中断处于挂起状态。这时,EXTI 发送中断请求给 NVIC。
-
NVIC 收到 EXTI 控制器的中断请求后,会根据当前中断的优先级决定是否处理这个中断。如果决定处理,NVIC 将调用中断向量表中与该中断源对应的中断服务程序(ISR)。
-
在 ISR 中,开发者必须手动清除 EXTI_PR 寄存器中的挂起位,表示中断已经被处理完毕。随后,NVIC 将该中断标记为已处理,可以再次接收来自该中断源的请求。