一文读懂STM32中断NVIC(超详细+中断CubeMX配置指南)

image-20231231175604434

1. 中断基础概念

STM32F407的嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC)管理所有中断,它有82个可屏蔽中断,还有13个系统中断。82个可屏蔽中断和部分系统中断可配置中断优先级,总共有16个优先级。

  1. 触发条件: 中断是由外部事件触发的,这些事件可以是来自硬件(比如传感器输入、定时器结束等)或软件(比如系统调用或特定指令)的信号。
  2. 响应过程: 当中断事件发生时,处理器暂停当前正在执行的任务,保存当前状态(比如程序计数器、寄存器状态等),然后跳转执行预定义的中断服务程序(ISR,Interrupt Service Routine)。
  3. 中断服务程序: 这是一段专门设计来处理特定中断的代码。它会执行必要的操作以响应中断事件,可能会读取外部设备状态、清除中断标志、执行特定操作并最终恢复被打断的程序执行。
  4. 中断优先级: 中断可以具有不同的优先级,允许系统在有多个中断发生时确定哪个中断应该首先被处理。

NVIC是ARM Cortex-M处理器内部的模块,负责管理处理器的中断。它的特性包括:

  1. 嵌套性: 允许不同优先级的中断按照其优先级被嵌套处理,优先级高的中断可以中断优先级低的中断。
  2. 向量表: 每个中断都有一个唯一的编号(向量),这些向量存储在向量表中。当中断发生时,处理器通过查找向量表中的特定入口点来确定要执行的中断服务程序。
  3. 优先级和控制: NVIC允许配置每个中断的优先级,并可以通过控制寄存器来使能或禁用特定的中断。

在STM32系列中,要使用中断,通常的步骤包括配置相关的外部硬件(如果需要)、配置NVIC以及编写中断服务程序。在初始化过程中,需要确保配置中断优先级和使能相应的中断。

2. 中断向量表

STM32F4系列使用的是ARM Cortex-M内核,中断向量表是处理器中的一组特殊地址,存储着每个中断服务程序的入口地址。当发生中断时,处理器会根据中断编号查找中断向量表,并跳转到相应中断服务程序的入口地址执行。

STM32F4的中断向量表结构:
  1. 存储位置: 中断向量表存储在处理器的内存中,通常位于微控制器的Flash起始地址处。在STM32F4中,中断向量表通常位于0x00000000的地址处,是一个连续的地址空间。
  2. 向量表项: 每个中断有一个向量表项。这些项是连续存储的,每个项占据4个字节。
  3. 中断服务程序入口地址: 每个向量表项存储着对应中断服务程序的入口地址。当中断发生时,处理器会根据中断编号找到相应的入口地址并跳转执行。
STM32F4的中断向量表组成:

在STM32F4中,中断向量表包括了两种类型的向量表项:

  1. ARM Cortex-M处理器核心向量表: 这部分向量表项包含了Cortex-M处理器的核心中断服务程序入口地址,如:
    • 初始栈指针(Initial Stack Pointer)
    • 复位(Reset)
    • NMI(Non-Maskable Interrupt)
    • Hard Fault等
  2. STM32特定的外设中断向量表: 在ARM Cortex-M处理器核心向量表后面,是STM32特定的外设中断向量表项。这些项存储着与STM32F4系列相关的外设中断服务程序的入口地址,比如TIM1、TIM2、USART1等。如下图所示:

image-20240101233803447

用STM32CubeMX生成代码后,在 startup_stm32f407zgtx.s 汇编文件中,我们可以看到中断向量表具体的定义和中断服务函数。

image-20240102074829476

3. 中断优先级

在STM32F4系列中,中断优先级用于确定当多个中断同时发生时,处理器应该先处理哪个中断。这个优先级系统是由ARM Cortex-M内核提供支持的。

3.1 中断优先级的特点:
  1. 可编程性
    STM32F4允许针对每个可中断的外设配置中断优先级。这使得开发者可以根据系统需求对中断进行优先级管理。

  2. 优先级位数
    Cortex-M内核中的中断优先级分为抢占优先级(Preemption Priority)和子优先级(Subpriority)。在STM32F4中,通常抢占优先级占据较高的位数,子优先级占据较低的位数。

  3. 数值越小,优先级越高
    优先级数值越小,表示优先级越高。比如,抢占优先级数值为0的中断优先级最高。

3.2 中断优先级的配置:

在STM32F4中,使用NVIC(Nested Vectored Interrupt Controller)来配置中断优先级。配置中断优先级的步骤如下:

  1. 确定优先级组分配
    Cortex-M内核允许将中断优先级分为不同的组,主要分为4-2-2(4位抢占优先级、2位子优先级)和3-1-4(3位抢占优先级、1位子优先级)两种模式。这决定了中断优先级的位分配,应根据系统需求进行选择。

  2. 设置抢占优先级和子优先级
    使用库函数或直接操作NVIC寄存器来为每个中断分配优先级。通常有函数如NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)用于设置中断的抢占优先级和子优先级。

  3. 优先级的影响
    在相同的优先级组中,较低位的抢占优先级数值越小,优先级越高;较低位的子优先级数值越小,优先级越高。

3.3 示例:
// 设置外设中断优先级为抢占优先级2,子优先级1
NVIC_SetPriority(USART1_IRQn, 2, 1);
// 启用USART1中断
NVIC_EnableIRQ(USART1_IRQn);

这个示例中,针对USART1的中断被配置为抢占优先级为2,子优先级为1。请注意,优先级配置必须在使能相应中断之前完成。

了解并正确配置中断优先级对于确保在系统中正确处理中断,并按照预期的顺序处理多个中断事件至关重要。

4. 中断相关的HAL驱动程序

中断管理相关驱动程序的头文件是 stm32f4xx_hal_cortex.h ,常用函数如下图所示

函数名 功能
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); 设置4位二进制数的优先级分组策略
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); 设置某个中断的抢占优先级和此优先级
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); 启用某个中断
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); 禁用某个中断
uint32_t HAL_NVIC_GetPriorityGrouping(void); 返回当前的优先级分组策略
void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); 返回某个中断的抢占优先级、次优先级数值
uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); 检查某个中断是否被挂起
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); 设置某个中断的挂起标志,表示发生了中断
void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); 清除某个中断挂起标志

5. 外部中断EXTI

外部中断(External Interrupt,通常称为EXTI)在STM32F4系列微控制器中是一个重要的功能,它允许外部事件(例如按键、传感器输入等)引发处理器的中断。STM32F4通过外部中断线(External Interrupt Lines)来处理外部事件,而这些中断线可以与GPIO引脚相连。外部I/O端口的电平可以有三种触发中断的方式:上升沿、下降沿和双边沿触发,如下图所示:

STM32F4的外部中断EXTI的特点:
  1. 支持多个外部中断线: STM32F4具有多个外部中断线,每个中断线可以连接到特定的GPIO引脚。
  2. 多种触发方式: EXTI可以配置为触发不同的边沿或状态,例如上升沿触发、下降沿触发、上升和下降沿触发、低电平触发、高电平触发等。
  3. 中断优先级: EXTI也可以配置其优先级,允许在多个中断发生时确定哪个中断应该首先被处理。
  4. 软件和硬件触发: 可以通过软件手动触发外部中断,也可以通过外部引脚的电平或边沿触发中断。

image-20231231181514810

其原理如下图所示,外部中断是由外部I/O端口产生中断触发,单片机内核中止当前工作,并处理中断。这时就进入了中间部分,这里包括了“CPU参与”方框部分,有CPU进行参与。在中断模式下,CPU参与处理中断服务函数,进而点亮LED灯。

image-20240101233255207

STM32F407有23个外部中断,每个输入线都可以单独配置触发事件,如上跳沿触发、下跳沿触发或双边沿触发。每个EXTI中断可以单独屏蔽,有独立的中断标志,可以单独清除或保持其中断标志。如下图所示,是外部有信号从右边输入线输入,通过边缘检测电路,判断其中断标志位,进而一步步输送到NVIC中断控制器中。

image-20231231181535941

​ STM32F407有23个外部中断,每个输入线都可以单独配置触发事件,其中EXTI0至EXTI4的每个中断有独立的ISR,EXTI线[9:5]中断共用一个中断号,也就是共用ISR,EXTI线[15:10]中断也共用ISR,见下表所示。若共用的ISR,需要在ISR里在判断具体是哪个EXTI线产生的中断,然后做相应处理。

另外7个EXTI线连接的不是某个实际的GPIO引脚,二十其他外设产生的事件信号。这7个EXTI线的中断有单独的ISR:

  • EXTI线16连接PVD输出;
  • EXTI线17连接RTC闹钟事件;
  • EXTI线18连接USB OTG FS唤醒事件;
  • EXTI线19连接以太网唤醒事件;

image-20240102080839382

6. STM32 CubeMX配置实战

1. 环境准备
  1. 正点原子探索者 V2 (STM32F407ZGT6)
  2. STM32CubeMX 6.2.0
  3. STM32CubeIDE 1.14.0
  4. ST-Link V2
2. 硬件配置

从正点原子的原理图中,选择4个按键,2个LED灯作为本次实验的对象,用4个按键来控制2个LED灯实现不同功能的开关LED灯的效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾格北峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值