自学内容网 自学内容网

NVIC中断控制器

      

目录

1. NVIC 基本概念

2. NVIC 相关寄存器介绍

3. NVIC 工作原理

4. STM32 中断优先级基本概念

5. STM32 中断优先级分组

6. STM32 NVIC 的使用


          NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是嵌入式系统,特别是 ARM Cortex-M 系列微控制器中用于管理中断的关键模块。NVIC 提供硬件支持,用于嵌套中断优先级控制和中断服务程序调度,确保实时任务能够有效响应。

1. NVIC 基本概念

NVIC 是 ARM Cortex-M 处理器内集成的中断管理器,能够处理从 1 到 240 个中断通道,具体数量取决于所使用的微控制器型号。它允许微控制器在中断发生时及时处理事件,并能够根据设定的优先级处理多个中断的嵌套和抢占。

主要特点:

  • 支持优先级嵌套:NVIC 支持为每个中断设置不同的优先级,并允许高优先级的中断抢占正在处理的低优先级中断。
  • 矢量表:每个中断有对应的中断向量,NVIC 根据中断号直接跳转到对应的中断服务例程(ISR)。
  • 灵活的中断屏蔽:NVIC 允许开发者屏蔽和启用特定中断。

2. NVIC 相关寄存器介绍

NVIC 的配置和控制主要通过一系列寄存器来实现,以下是一些重要寄存器的功能:

  • ISER (Interrupt Set Enable Register):用于启用特定中断。每一位代表一个中断,置 1 时对应的中断被使能。
  • ICER (Interrupt Clear Enable Register):用于禁用特定中断。与 ISER 类似,置 1 时禁用相应中断。
  • ISPR (Interrupt Set Pending Register):用于设置中断挂起状态。置 1 时会将对应中断挂起。
  • ICPR (Interrupt Clear Pending Register):用于清除中断挂起状态。
  • IPR (Interrupt Priority Register):用于设置每个中断的优先级,通常每个中断会有 4 位或更多的优先级设置。
  • STIR (Software Trigger Interrupt Register):允许软件触发指定的中断。

这些寄存器允许开发人员精确控制中断的启用、禁用及优先级管理。

3. NVIC 工作原理

NVIC 的工作机制围绕中断优先级和中断响应展开。当一个外部或内部事件触发时(如定时器溢出、外部按键按下等),微控制器生成一个中断信号并发送给 NVIC。

工作步骤:

  • NVIC 识别到中断信号并判断该中断是否已启用。
  • NVIC 根据当前中断的优先级与正在执行的任务进行比较。如果该中断的优先级高于当前任务,则立即抢占当前任务并跳转到该中断的服务例程。
  • 当中断服务例程结束后,NVIC 将返回到被中断的任务,继续执行未完成的指令。

如果多个中断同时发生,NVIC 将根据设定的优先级进行排序,优先处理高优先级的中断。NVIC 通过自动保存和恢复上下文来支持中断嵌套。

4. STM32 中断优先级基本概念

在 STM32 微控制器中,中断优先级分为两类:抢占优先级(Preempt Priority)子优先级(Sub Priority)。抢占优先级决定了中断的抢占顺序,子优先级则在抢占优先级相同时决定处理顺序。

基本概念:

  • 抢占优先级:允许更高优先级的中断打断当前正在处理的中断或任务。
  • 子优先级:同一抢占优先级下,子优先级决定中断响应顺序。
  • 优先级分组:STM32 中 NVIC 提供了灵活的优先级分组设置,可以在不同场景中灵活调整抢占和子优先级的权重。

5. STM32 中断优先级分组

STM32 的 NVIC 允许开发者通过 NVIC_PriorityGroupConfig() 函数对中断优先级进行分组配置。分组的目的是为了划分抢占优先级和子优先级的位数,从而平衡中断抢占和优先级排序。

常见的优先级分组如下:

  • Priority Group 0:所有 4 位都用作抢占优先级,没有子优先级。适合需要较严格的抢占控制的场景。
  • Priority Group 1:3 位抢占优先级,1 位子优先级。抢占优先级和子优先级均有一定作用。
  • Priority Group 2:2 位抢占优先级,2 位子优先级。
  • Priority Group 3:1 位抢占优先级,3 位子优先级。更多依赖子优先级排序。
  • Priority Group 4:没有抢占优先级,所有 4 位用于子优先级。适用于对抢占没有要求的场景。

每个中断的优先级通过 NVIC_SetPriority() 函数设置。

6. STM32 NVIC 的使用

在 STM32 中,使用 NVIC 控制中断的过程如下:

  1. 启用中断:通过调用 NVIC_EnableIRQ(IRQn_Type IRQn) 来使能某个特定的中断。例如,启用外部中断 EXTI 的 IRQ 通道。

  2. 设置中断优先级:使用 NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) 函数设置中断优先级。优先级可以通过分组调整抢占优先级和子优先级的占用比。

  3. 处理中断:编写中断服务例程(ISR),响应中断时 NVIC 会跳转到对应的中断服务函数。中断服务函数中,开发者可以根据需要编写相应的代码,处理外部设备输入、定时器事件等。

  4. 禁用中断:在某些场景下,开发者可能需要禁用特定中断。可以通过 NVIC_DisableIRQ(IRQn_Type IRQn) 禁用某个中断。


原文地址:https://blog.csdn.net/2301_78622258/article/details/142966612

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!