目录
ARM的NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是ARM Cortex-M系列微控制器中用于管理中断的重要组件。NVIC提供了优先级管理、中断请求排队、中断嵌套以及快速中断响应的能力。
一 主要功能和特点:**
1. **中断优先级管理**:
NVIC支持多达256个中断源,并可以对每个中断源设置不同的优先级。优先级分为抢占优先级和子优先级,支持嵌套中断,即更高优先级的中断可以打断正在进行的低优先级中断处理。
2. **中断向量表**:
NVIC维护一个中断向量表,每个中断源对应一个向量表中的入口地址,当特定中断发生时,处理器会跳转到该地址执行中断服务程序(ISR)。
3. **中断使能和挂起**:
每个中断源都可以独立地使能和挂起,允许在运行时动态调整系统的中断响应行为。
4. **中断优先级分组**:
NVIC支持优先级分组,通过设置不同的分组可以改变抢占优先级和子优先级的相对权重,从而影响中断响应顺序。
5. **中断嵌套处理**:
如果一个高优先级中断发生在低优先级中断处理过程中,NVIC会暂停当前正在执行的ISR,先处理高优先级中断,处理完毕后再返回继续执行被中断的ISR。
二 **使用实例:**
在基于STM32的Cortex-M微控制器中,通过NVIC库函数可以对NVIC进行配置:
#include "stm32f4xx.h"
// 假设我们有一个EXTI中断线,需要设置它的中断优先级和使能中断
void Configure_EXTI_IRQ(void)
{
// 设置EXTI中断线的中断优先级
NVIC_SetPriority(EXTI0_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 3));
// 这里的2和3分别是抢占优先级和子优先级,数字越小,优先级越高
// 使能EXTI中断线的中断
NVIC_EnableIRQ(EXTI0_IRQn);
}
int main(void)
{
// 初始化系统和EXTI相关配置
SystemClock_Config();
EXTI_Configuration();
// 配置EXTI中断
Configure_EXTI_IRQ();
while (1)
{
// 主循环
}
}
在上述示例中,首先通过`NVIC_SetPriority`函数设置了EXTI0中断线的优先级,然后通过`NVIC_EnableIRQ`函数使能了该中断。当EXTI0中断线上的事件发生时,NVIC将根据配置的优先级调度中断处理。