概念简介
NVIC,即嵌套向量中断控制器,控制着中断相关的功能,是内核里面的一个外设。
中断在单片机编程中的作用是使单片机能及时响应需要立即处理的事件,但是这些事件也分紧急和非紧急,因此需要优先级来区分。
优先级分为主优先级和子优先级,其中主优先级又叫抢占优先级(后面主优先级全部称为抢占优先级),当同时有多个时间产生中断时,比较抢占优先级,该优先级高的先响应,抢占优先级相同的比较子优先级。优先级分组如下图。
简单应用
在配置每个中断的时候一般需要注意如下问题:
-
使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。
-
初始化 NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求。NVIC_InitTypeDef 结构体在固件库头文件 misc.h 中定义。
在实际使用时,需要定义以下两个函数。
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 配置中断源 */
NVIC_InitStructure.NVIC_IRQChannel = xxx_IRQ;
/* 抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* 初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);
}
void xxx_IRQHandler(void)
{
}
上面两个函数,第一个是NVIC的配置函数,和GPIO的使用方法类似,也是给结构体成员进行定义,最后调用初始化函数;第二个是中断触发时运行的事件。通过这两个函数,就可以在达到触发中断条件的时候进行某样操作。
需要注意的是,优先级分组NVIC_PriorityGroupConfig()只能在程序中配置一次,如果多次配置的话会使优先级紊乱,导致出现运行错误。