EXTI简介:
EXTI 是 External Interrupt 的缩写,表示外部中断事件控制器。EXTI 可以监测指定 GPIO 口的电平信号变化,并在检测到指定条件时,向内核的中断控制器 NVIC 发出中断申请。NVIC 在裁决后,如果满足条件,会中断CPU的主程序,使 CPU 转而执行 EXTI 对应的中断服务程序。
EXTI 支持的触发方式:上升沿、下降沿、双边沿或软件触发。
EXTI 支持所有的 GPIO 口,但需要注意的是,相同的 Pin 不能同时触发中断。例如,PA0 和 PB0 不能同时被配置为中断源。
EXTI 提供了 16 个 GPIO_Pin 的中断线,以及额外的中断线如 PVD 输出、RTC 闹钟、USB 唤醒和以太网唤醒。
EXTI的基本结构:
EXTI框图:
EXTI有关寄存器函数:
HAL_GPIO_EXTI_IRQHandler——用于处理外部中断请求(External Interrupt)
(EXTI的中断服务函数)
它的主要作用是处理通过 GPIO 引脚触发的外部中断事件。
具体说明:
1. 函数含义:HAL_GPIO_EXTI_IRQHandler`是 与 GPIO 外部中断相关的中断处理函数。当某个 GPIO 引脚配置为外部中断模式,并且在引脚上发生中断事件(如上升沿或下降沿),这个函数会被调用。
2. 主要功能:这个函数的主要功能是调用相应的中断回调函数(HAL_GPIO_EXTI_Callback),以处理特定的中断事件。它内部首先会清除中断标志位,防止中断重复触发,随后会调用由用户实现的回调函数,这样用户可以在这个回调函数中编写具体的中断处理逻辑。
3. 使用场景:
- 当你需要响应外部信号(例如按键、传感器信号等)时,可以将某个 GPIO 引脚配置为外部中断模式。当信号触发中断时,系统会自动调用 `HAL_GPIO_EXTI_IRQHandler` 来处理这个中断。
- 例如,如果一个按钮连接到某个 GPIO 引脚,当用户按下按钮时引脚电平变化,产生一个中断,这时 `HAL_GPIO_EXTI_IRQHandler` 函数会被执行,从而调用用户定义的中断回调函数来处理按钮按下的事件。
示例代码:
void EXTI0_IRQHandler(void)
{
// 调用 HAL 库的中断处理函数
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
// 在这里处理按钮按下的事件
// 例如:点亮一个 LED
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
}
}
__HAL_GPIO_EXTI_GET_IT是 STM32 HAL 库中的一个宏定义,用于获取指定 GPIO 引脚的中断标志位(Interrupt Flag)。
它的主要作用是检查某个引脚是否触发了中断,判断这个引脚的中断事件是否已经发生。
(简单来说就是查询挂起寄存器的状态,并返回挂起寄存器的值)
具体说明:
1. 宏定义含义:`__HAL_GPIO_EXTI_GET_IT` 是一个宏,用于检查 EXTI(External Interrupt/Event Controller) 中的中断挂起寄存器(Pending Register),判断指定的 GPIO 引脚是否触发了中断。简单来说,它返回一个布尔值,表示该引脚的中断标志是否被置位。
2. 使用场景:
- 当你在处理中断时,需要确定是哪一个引脚产生了中断,`__HAL_GPIO_EXTI_GET_IT` 可以用于判断特定引脚是否触发了中断。
- 这在需要处理多个引脚的中断或需要手动检查某个中断状态时非常有用。
3. 使用方式:
- 该宏的输入是某个 GPIO 引脚号(例如 `GPIO_PIN_0`, `GPIO_PIN_1` 等),它返回一个值,用于指示这个引脚的中断标志位是否被置位。
代码示例:
下面是一个使用 `__HAL_GPIO_EXTI_GET_IT` 的简单例子,展示如何在中断处理程序中使用这个宏来检查某个引脚的中断标志。
void EXTI0_IRQHandler(void)
{
// 检查引脚 GPIO_PIN_0 是否触发了中断
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET)
{
// 处理 GPIO_PIN_0 的中断事件
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
// 清除中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
}
在这个例子中:
- `__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0)` 用于检查 `GPIO_PIN_0` 是否触发了中断。如果返回值不是 `RESET`,则说明该引脚的中断标志已经被置位。
- 如果中断确实发生了,执行相应的中断处理逻辑(例如,切换 LED 的状态)。
- 最后,通过调用 `__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0)` 来清除中断标志位,防止中断被重复触发。
void HAL_GPIO_EXTI_Callback——回掉函数
如果外部触发了中断,我们就需要回调中断处理函数