中断是一种硬件机制,允许系统在执行主程序时被外部事件(如外部中断,EXTI)或内部条件(如定时器中断、通信中断等)中断,从而执行特定的处理程序(中断服务函数,ISR)
NVIC(Nested Vectored Interrupt Controller)是Cortex-M系列处理器中的嵌套向量中断控制器,属于内核,用于管理中断请求和中断优先级。允许处理器在执行主程序时响应中断,并根据中断的优先级进行处理
中断向量表(Interrupt Vector Table,IVT)存储了所有中断服务函数的入口地址,处于一块特定的内存中。
DCD表示以4字节对齐
中断向量表定义在启动文件中,当发生中断时,CPU自动执行相应的中断服务函数。
中断优先级基本概念:
- 抢占优先级( pre ):高抢占优先级可以打断正在执行的低抢占优先级中断
- 响应优先级( sub ):当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断
- 抢占和响应都相同的情况下,自然优先级越高的,先执行
- 自然优先级:中断向量表的优先级
- 数值越小,表示优先级越高
一个工程中一般只设置一次优先级分组,如果设置多次会以最后一次为准
NVIC的使用:
- 设置中断分组
- 设置中断优先级
- 使能中断
建议按此顺序设置
中断号对应中断向量表中的位置列(位置号>=0则为外部中断,位置号<0则为内核中断)
中断优先级分组的主要目的是为了灵活地分配和管理中断优先级(合理分配抢占优先级和响应优先级的数量来实现对中断的灵活管理和调度)
EXTI是“外部(扩展)中断/事件控制器”(External(Extended) Interrupt/Event Controller)主要用于处理外部信号的中断请求或事件触发,它不仅可以处理芯片外部的中断或事件,还可以处理芯片内部的某些信号
中断和事件的理解:
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
事件:不进入NVIC,仅用于内部硬件自动控制的,如TIM、DMA、ADC
| 特性 | 中断(Interrupt) | 事件(Event) |
|---|---|---|
| 触发方式 | 由外部信号或内部事件触发,需要中断CPU的主任务 | 由外部信号或内部事件触发,但不需要中断CPU的主任务 |
| 处理机制 | 中断请求 → 中断响应 → 执行中断服务程序(ISR) → 中断返回 | 事件触发 → 触发硬件模块操作(如定时器、DMA等) |
| 实时性 | 高实时性,适合紧急任务处理 | 适合硬件协同工作,对实时性要求较低 |
| 对CPU的影响 | 需要中断CPU的主任务,可能增加系统开销 | 不中断CPU的主任务,对系统性能影响小 |
| 应用场景 | 按键检测、传感器数据采集、通信协议同步等 | 定时器启动、DMA传输、硬件模块协同等 |
EXTI的主要特性:
每条EXTI线都可以单独配置:选择类型(中断或事件)、触发方式(上升沿、下降沿或者双边沿触发)、支持软件触发(通过软件寄存器触发)、开启\屏蔽(中断或事件)、有挂起状态位(发生中断时置1)
STM32H7系列由其他外设对EXTI产生的事件分为可配置事件和直接事件
可配置事件:可配置触发方式等,该系列中,中断属于该类事件
直接事件:固定上升沿触发、不支持软件触发、无挂起状态位(由其他外设提供)
EXTI与IO的映射关系:
P*x=EXTIx
AFIO(Alternate Function I/O,复用功能IO),主要用于重映射和外部中断映射配置
特别注意:配置AFIO寄存器之前必须使能AFIO的时钟
SYSCFG(System Configuration Controller,系统配置控制器),用于外部中断映射配置等
特别注意:配置SYSCFG寄存器之前必须使能SYSCFG的时钟
在STM32微控制器中,某些外设与EXTI(外部中断/事件控制器)的连接是固定的,这些外设的中断信号会直接映射到特定的EXTI线上
这种固定的映射关系是由硬件设计决定的,开发者不能通过软件更改。对于GPIO引脚与EXTI线的映射关系,开发者可以通过软件配置来选择
| 特性 | EXTI中断 | 外设中断 |
|---|---|---|
| 来源 | GPIO引脚或内部事件(如DMA、ADC) | 内部外设模块(如定时器、USART、SPI等) |
| 触发方式 | GPIO引脚电平变化(上升沿、下降沿、双边沿)或内部事件 | 外设模块的特定状态(如定时器溢出、数据接收完成) |
| 用途 | 检测外部信号变化(如按键按下、传感器信号变化) | 处理外设模块的特定事件(如数据传输完成、定时器溢出) |
| 配置步骤 | 配置GPIO、EXTI、NVIC和EXTICR寄存器 | 配置外设、NVIC中断优先级并使能中断 |
| 示例 | 按键检测、传感器信号处理 | 定时器中断、USART接收中断、ADC转换完成中断 |
STM32仅有7个中断服务函数:EXTIx_IRQHandler
| 中断范围 | 中断服务函数 |
|---|---|
| EXTI0 | EXTI0_IRQHandler |
| EXTI1 | EXTI1_IRQHandler |
| EXTI2 | EXTI2_IRQHandler |
| EXTI3 | EXTI3_IRQHandler |
| EXTI4 | EXTI4_IRQHandler |
| EXTI5-9 | EXTI9_5_IRQHandler |
| EXTI10-15 | EXTI15_10_IRQHandler |
中断服务函数(Interrupt Service Routine, ISR)也被称为硬件中断服务函数,它们是固定的,由硬件和编译器生成的中断向量表决定。
这些函数的名称和地址是预先定义好的,不能随意更改。
使用步骤:
- 使能时钟
- 配置中断
- 设置中断优先级分组 (HAL库默认2分组)
- 设置中断优先级
初始化时,需将以上均设置好- 设置中断服务函数
void EXTI_Init()
{
__HAL_RCC_AFIO_CLK_ENABLE(); // 显式开启 AFIO 时钟
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef gpio_init_struct;
gpio_init_struct.Mode=GPIO_MODE_IT_FALLING;
gpio_init_struct.Pin=GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;
gpio_init_struct.Pull=GPIO_PULLUP;
HAL_GPIO_Init(GPIOE,&gpio_init_struct);/*初始化WK_UP*/
gpio_init_struct.Mode=GPIO_MODE_IT_RISING;
gpio_init_struct.Pin=GPIO_PIN_0;
gpio_init_struct.Pull=GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA,&gpio_init_struct);/*初始化KEY0-KEY1*/
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
HAL_NVIC_SetPriority(EXTI4_IRQn,0,1);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);/*使能KEY0*/
HAL_NVIC_SetPriority(EXTI3_IRQn,1,2);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);/*使能KEY1*/
HAL_NVIC_SetPriority(EXTI2_IRQn,2,3);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);/*使能KEY2*/
HAL_NVIC_SetPriority(EXTI0_IRQn,2,1);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);/*使能WK_UP*/
}
void EXTI4_IRQHandler(void)/*线EXTI4的中断服务函数*/
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
}
void EXTI0_IRQHandler()/*线EXTI0的中断服务函数*/
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
void EXTI2_IRQHandler()/*线EXTI2的中断服务函数*/
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
}
void EXTI3_IRQHandler()/*线EXTI3的中断服务函数*/
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)/*回调函数*/
{
delay_ms(20);
switch(GPIO_Pin)
{
case GPIO_PIN_0:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);break;
case GPIO_PIN_2:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);break;
case GPIO_PIN_3:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);break;
case GPIO_PIN_4:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);break;
default:break;
}
}
| 特性 | GPIO中断映射 | GPIO复用功能 |
|---|---|---|
| 基本 GPIO 功能 | ✅ 仍然可用(输入/输出均可) | ❌ 通常不可用(由外设接管) |
| 中断触发能力 | ✅ 支持(EXTI 中断) | ❌ 不支持(除非复用功能本身支持中断) |
| 引脚控制权 | 仍由 GPIO 控制器管理 | 由外设控制器管理 |
| 典型应用场景 | 按钮输入、事件检测 | 串口通信、SPI、ADC 等外设功能 |
- 中断映射后,GPIO 的基本功能仍然可用
- 复用功能后,GPIO 的基本功能通常会被外设接管,无法直接使用
所有中断都必须经过NVIC(嵌套向量中断控制器)
NVIC是ARM Cortex-M系列处理器中用于管理中断的核心模块,它负责中断的优先级管理、中断使能、中断屏蔽、中断挂起等关键功能
3923

被折叠的 条评论
为什么被折叠?



