中断笔记
中断笔记
中断的概念



中断优先级






是否发生中断嵌套之和抢占优先级有关
例子:

例子:

NVIC


串口中断接收实验




中断代码编写逻辑
找中断回调函数()的方法在中断服务函数里 搜weak
总结成一句「找中断的口诀」
🔑 中断三层结构(必背)
IRQHandler → HAL_IRQHandler → HAL_Callback
🔍 去哪找?
| 想找什么 | 去哪 |
|---|---|
| 中断名(EXTI0_IRQHandler) | startup_stm32f1xx.s |
| 中断函数实现 | stm32f1xx_it.c |
| HAL_xxx_IRQHandler | stm32f1xx_hal_xxx.c |
| 真正写逻辑的地方 | HAL_xxx_Callback(自己写) |
一、GPIO + EXTI 初始化(exti.c)
#include "exti.h"
#include "stm32f1xx_hal.h"
void EXTI_Init(void)
{
GPIO_InitTypeDef gpio_init = {0};
/* 1. 使能 GPIO 时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_AFIO_CLK_ENABLE();
/* 2. 配置 PA0 为外部中断输入 */
gpio_init.Pin = GPIO_PIN_0;
gpio_init.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发(按键)
gpio_init.Pull = GPIO_PULLUP; // 上拉
HAL_GPIO_Init(GPIOA, &gpio_init);
/* 3. NVIC 中断优先级配置 */
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
📌 说明(你要真正理解的点):
GPIO_MODE_IT_xxx:GPIO 作为外部中断EXTI0_IRQn:PA0 对应 EXTI0- NVIC 决定 能不能进中断
二、中断服务函数 ISR(stm32f1xx_it.c)
👉 这个函数名必须严格匹配
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
📌 这一层你不写逻辑,只是“转交”给 HAL
三、真正写逻辑的地方:中断回调函数(任意 .c)
👉 重点:你只在这里写业务代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
// 你的中断处理代码
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}
📌 HAL 会自动在中断中调用这个函数
四、你现在已经拥有的「完整调用链」
按键按下
↓
EXTI0_IRQHandler()
↓
HAL_GPIO_EXTI_IRQHandler()
↓
HAL_GPIO_EXTI_Callback() ← 你写代码的地方

浙公网安备 33010602011771号