1. 中断相关概念

1.1 什么是中断?

中断是CPU暂停当前程序以处理内部或外部事件,完成后再继续原程序的过程。

在ARM体系中,中断主要由外设输入或软件触发,用于响应紧急事件如定时器溢出、按键输入或串口数据到达。

1.2中断的意义

中断的核心作用是提升CPU效率,通过事件驱动机制实现:

‌避免空转‌:相比轮询(持续检测),中断仅在事件发生时触发处理,减少CPU资源浪费

实时响应‌:立即处理紧急事件(如按键、数据到达)

多任务支持‌:通过快速切换实现伪并行执行

1.3中断优先级

中断具有优先级高低之分,两个中断同时触发,则优先响应高优先级中断,再响应低优先级中断。

1.4中断嵌套

高优先级中断可打断低优先级中断,形成中断嵌套。

1.5中断执行流程

STM32中断处理流程:

  1. 外设触发中断请求
  2. CPU暂停当前任务,保存现场(PC等寄存器入栈)
  3. 跳转执行对应的ISR
  4. ISR完成后恢复现场(出栈)
  5. 返回原程序继续执行  

2.STM32中断

2.1STM32F103C8T6中断数量

STM32F103C8T6 支持的中断共有 70 个,其中包括 10 个内核中断和 60 个外部中断。外部中断包含 EXTI、 TIM、USART、ADC、I2C、SPI 等等。

2.2中断向量表

STM32中断向量表是存储在Flash起始地址的固定数组,每个元素对应一个中断源,存放该中断服务程序(ISR)的入口地址。硬件中断触发时,CPU通过查表跳转到对应ISR执行,解决编译器随机分配函数地址与硬件固定跳转需求的矛盾。其核心机制是:中断号→向量表定位→地址跳转→执行ISR→返回主程序。

2.3STM32中断框图

3.NVIC

3.1NVIC介绍

NVIC是STM32的中断管理核心,具有以下特性:

中断嵌套机制:高优先级中断可抢占低优先级中断
优先级控制:支持抢占优先级和响应优先级两级配置
中断容量:最多支持256个中断(16个内核异常+240个外部中断)
实时响应:通过硬件级中断向量表实现快速跳转
灵活配置:优先级分组可调,支持中断屏蔽和挂起
该设计显著提升系统实时性,适用于需要快速响应外部事件的场景。

3.2NVIC工作原理

3.3中断优先级基本概念

STM32 NVIC中断优先级机制:

  1. 优先级类型:
  • 抢占优先级:可打断低优先级中断(数值越小优先级越高)
  • 响应优先级:同抢占级时决定响应顺序(数值越小优先级越高)
  • 自然优先级:硬件固定,同级中断的最终裁决
  1. 处理规则:
    (1) 抢占级不同:高抢占级立即响应
    (2) 抢占级相同:高响应级优先处理
    (3) 全部相同:按自然优先级执行

  2. 配置要点:

  • 通过AIRCR寄存器设置4位优先级分组(抢占/响应级位数比)
  • IPR寄存器高4位存储实际优先级
  • 由AIRCR寄存器控制切割如下图

3.4NVIC寄存器

3.5NVIC相关函数介绍

最常用的就是划线的几个分别对应上面表格的

中断失能(配置ICER)、中断使能(配置ISER)、设置优先级(配置IPR(外部中断寄存器)和SHPR(内部中断寄存器))、设置优先级分组(配置AIRCR)

3.6NVIC配置方法

设置中断分组 → 设置中断优先级 → 使能中断

设置中断分组一般在 HAL_Init 函数中进行。

4.EXTI

4.1EXTI简介

STM32的EXTI外部中断控制器核心功能:

基本机制‌
实时监测GPIO电平变化(上升沿/下降沿/双边沿)
触发后向NVIC发送中断请求,由CPU执行中断服务程序
关键特性‌
支持16个GPIO中断线(Pin0-15)+4条特殊功能线(PVD/RTC/USB/以太网)
禁止同编号Pin复用(如PA0与PB0冲突)
应用场景‌
按键检测/传感器信号捕获等实时事件响应
通过AFIO寄存器灵活配置输入源

4.2中断/事件

STM32中断与事件机制对比:

中断机制‌
强制打断CPU当前程序流,跳转执行中断服务程序(ISR)
执行完毕后通过硬件自动恢复原程序现场
典型应用:紧急事件处理(如按键触发、传感器报警)


事件机制‌
仅标记状态变化(如GPIO电平跳变)而不触发程序跳转
需配合中断屏蔽寄存器配置才能转化为实际中断
典型应用:DMA触发、低功耗模式唤醒


关键差异‌
| 特性      |           中断             |           事件          |
|------------|--------------------------|-----------------------|
| CPU响应 | 立即抢占式处理  |     无自动响应     |
| 处理方式 | 通过ISR软件处理 | 硬件自动标记    |
| 资源占用 | 需要保存上下文 | 零CPU开销         |

|------------|--------------------------|-----------------------|

4.3EXTI基本结构

4.4EXTI框图

4.5EXTI寄存器

参考手册

4.6EXTI相关函数介绍

主要用到这三个函数

HAL_GPIO_init(配置了下降沿触发寄存器(FTSR)、上升沿触发寄存器(RTSR)、中断屏蔽寄存器(IMR)、事件屏蔽寄存器(EMR))

HAL_GPIO_EXTI_IRQHandler(配置了挂起寄存器(PR)查询有没有触发中断)

调用HAL_GPIO_EXTI_IRQHandler函数里面还包含两个函数

_HAL_GPIO_EXTI_CLEAR_IT这个函数是清楚中断标志位否则一直调用中断函数

HAL_GPIO_EXTI_Callback这个函数是回调函数中断执行该函数,该函数内容由用户编写

5. AFIO

5.1AFIO简介

STM32的AFIO(复用功能IO)核心功能:

基本作用‌
实现GPIO复用为外设功能(如USART/I2C引脚)
支持引脚功能重映射(通过AFIO_MAPR寄存器配置)
关键应用‌
引脚复用‌:将普通IO(如PA9)切换为外设功能(如USART_TX)
重映射优化‌:解决小封装芯片的外设冲突(如将TIM1通道1从PA8重映射到PE9)
中断配置‌:管理EXTI中断线0-15与GPIO的映射关系
使用注意‌
重映射前需开启AFIO时钟(RCC_APB2ENR.AFIOEN=1)
同组外设重映射需整体配置(如USART1全部引脚)

5.2AFIO与IO口对应关系

5.3AFIO寄存器

参考手册一共有四个寄存器其余三个大差不差

为什么要有4个外部中断寄存器?

因为每个寄存器高16位保留只能配置低16位(分成了四份每一份配置一个选择器)

AFIO一共有16个选择器所以要四个外部中断寄存器       

5.4AFIO相关函数介绍

外部中断寄存器(EXTICR)也在HAL_GPIO_init的函数里

6.中断实验(主函数led2闪烁 中断函数按下key1翻转led1状态)

6.1EXTI配置流程

6.2代码实现

6.3代码讲解

6.3.1首先查看原理图

我们要key1实现中断所以打开GPIOA的时钟

__HAL_RCC_GPIOA_CLK_ENABLE();

6.3.2给GPIO_InitTypeDef gpio_initstruct参数赋值

1.设置引脚

key1的引脚为A0所以

gpio_initstruct.Pin=GPIO_PIN_0;

2.设置模式

根据原理图按键按下是低电平接通所以要选择中断模式为下降沿触发

gpio_initstruct.Mode=GPIO_MODE_IT_FALLING;

3.设置状态

根据原理图默认为上拉状态所以

gpio_initstruct.Pull=GPIO_PULLUP;

4.设置速度

速度根据个人来配(建议选择高速)

gpio_initstruct.Speed=GPIO_SPEED_FREQ_HIGH;

5.赋值完成传参

HAL_GPIO_Init(GPIOA,&gpio_initstruct);

6.3.3设置优先级和使能中断

1.给HAL_NVIC_SetPriority传参;

HAL_NVIC_SetPriority第一个参数是中断线,第二个参数是抢占优先级,第三个参数是相应优先级

怎么看中断线?

key1的引脚是A0所以中断线是EXTI0_IRQn

因为该实验只有一个中断函数抢占优先级和相应优先级可以随意配置

 HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);

2.打开使能中断

HAL_NVIC_EnableIRQ(EXTI0_IRQn);

6.3.4中断函数

1.查找中断服务函数

到启动文件里查找

这个就是我们中断服务函数

2.调用公共服务函数

在中断函数里调用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

3.编写回调函数

实现按下key1翻转led1状态

6.3.5主函数编写

实现led2闪烁的效果

7.完整代码

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐