中断笔记

中断笔记

中断的概念

image

image

image

中断优先级

image

image

image

image

image

image

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

例子:

image

例子:

image

NVIC

image

image

串口中断接收实验

image

image

image

image

中断代码编写逻辑

找中断回调函数()的方法在中断服务函数里 搜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()   ← 你写代码的地方
posted @ 2026-01-24 21:35  wind_one  阅读(4)  评论(0)    收藏  举报