原创 STM32之NVIC的深入详解

2019-10-18 08:53 236 0 1 分类: MCU/ 嵌入式 文集: 程序设计

朋友们,如果你需要在STM32上移植RTOS,那么首先必须深入理解它的中断系统。什么是NVIC?即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。STM32的中有一个强大而方便的NVIC,它是属于Cortex内核的器件,不可屏蔽中断(NMI)和外部中断都由它来处理,而SYSTICK不是由NVIC来控制的。

特性:

●60个可屏蔽中断通道(不包含16个Cortex?-M3的中断线);

●16个可编程的优先等级(使用了4位中断优先级);

●低延迟的异常和中断处理;

●电源管理控制;

●系统控制寄存器的实现;

1.中断优先级分组

STM32(Cortex-M3)中有两个优先级的概念--抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

Cortex内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为0~15的称为内核异常,而16以上的则称为外部中断,这个表就称为中断向量表。

正是因为每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

1.所有8位用于指定响应优先级

2.最高1位用于指定抢占式优先级,最低7位用于指定响应优先级

3.最高2位用于指定抢占式优先级,最低6位用于指定响应优先级

4.最高3位用于指定抢占式优先级,最低5位用于指定响应优先级

5.最高4位用于指定抢占式优先级,最低4位用于指定响应优先级

6.最高5位用于指定抢占式优先级,最低3位用于指定响应优先级

7.最高6位用于指定抢占式优先级,最低2位用于指定响应优先级

8.最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

以上便是优先级分组的概念,但是Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级。

而STM32对这个表重新进行了编排,把编号从-3至6的中断向量定义为系统异常,编号为负的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断(NMI)、硬错误(Hardfault)。从编号7开始的为外部中断,这些中断的优先级都是可以用户更改的。详细的STM32中断向量号可以在startup_stm32f10x_XX.s中查找。

因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:

第0组:所有4位用于指定响应优先级(16种)

第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级(8种)

第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级(4种)

第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级(2种)

第4组:所有4位用于指定抢占式优先级

这里便对于于文章最前提到的固件库里相关的函数了——NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup),函数的参数共有5种:

这个函数的参数(NVIC_PriorityGroup值)有下列5种:

NVIC_PriorityGroup_0 =>选择第0组

NVIC_PriorityGroup_1 =>选择第1组

NVIC_PriorityGroup_2 =>选择第2组

NVIC_PriorityGroup_3 =>选择第3组

NVIC_PriorityGroup_4 =>选择第4组

这其实也很好理解,比如选择NVIC_PriorityGroup_1,那么抢占式优先级便占一位,也就是说可以有2^1个级别,可以设置为0和1,而响应优先级则占3位,也就是说可以有2^3个选择,可以设置为0~7;总共来说就可以区别>16种优先级了。

//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

举个例子吧,假如现在有4个外部中断,还有一个EXTI9_5中断,那么如果选择优先级分组为第1组,那么抢占式优先级便只有两种,5个中断就至少有3个在抢占式优先级上是相同的优先级上,其他两个在令一优先级别。接着设置响应优先级可以有8种选择;假如现在同时有两个抢占式优先级别相同的中断发生,那么处理的顺序是谁的响应优先级高则谁优先进入中断,另外这点是需要注意的,如果此时进入这个中断之后又来了一个抢占式优先级相同但是响应优先级更高的中断,这时也是不会打断已有的中断的。

void NVIC_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdefVECT_TAB_RAM

//Set the Vector Table base location at 0x20000000

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else

//Set the Vector Table base location at 0x08000000

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级组:1组(整个系统为同一组)

//设置先占优先级0~1,响应优先级0~7

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//* Enable the TIM3 Interrupt

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;// TIM3全局中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//从优先级1

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;// IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}


广告

文章评论 1条评论)

登录后参与讨论

curton 2019-10-18 21:25

学习
相关推荐阅读
minicaihong 2019-10-28 10:27
麦克斯韦方程组来源
美国著名物理学家理查德·费曼(Richard Feynman)曾预言:“人类历史从长远看,好比说到一万年以后看回来,19世纪最举足轻重的毫无疑问就是麦克斯韦发现了电动力学定律。”这个预言或许对吧。可是...
minicaihong 2019-10-25 16:10
十九个5V转3.3V的小技巧 第三部分
十九个5V转3.3V的小技巧时间:2019-10-22本文对稳压电路5V转3.3V的经典方案进行了总结,并进行了详尽的阐述。技巧十六:5V→3.3V有源模拟衰减器此技巧使用运算放大器衰减从 5V 至...
minicaihong 2019-10-25 16:09
十九个5V转3.3V的小技巧 第二部分
十九个5V转3.3V的小技巧时间:2019-10-22本文对稳压电路5V转3.3V的经典方案进行了总结,并进行了详尽的阐述。技巧九:5V→3.3V直接连接通常 5V 输出的 VOH 为 4.7 伏,...
minicaihong 2019-10-25 16:08
十九个5V转3.3V的小技巧 第一部分
十九个5V转3.3V的小技巧 第一部分本文对稳压电路5V转3.3V的经典方案进行了总结,并进行了详尽的阐述。技巧一:使用LDO稳压器,从5V电源向3.3V系统供电标准三端线性稳压器的压差通常是 2....
minicaihong 2019-10-19 13:26
认清陀螺仪“误入歧途”的本质,教你几招轻松“带回”
测量角速率的MEMS陀螺仪有多个误差贡献因素,偏置不稳定性是其中之一。然而,与提供增强性能的分立器件相比,惯性测量单元(IMU)具有多方面优势。六自由度IMU由多个惯性MEMS传感器组成,这些传感器经...
minicaihong 2019-10-19 10:03
单片机编程软件有哪些?Keil、IAR单片机编程软件简介
一、keil c51编程软件可以这么说,凡是搞单片机的,几乎没有人不知道51单片机,而51单片机使用最广泛的编程软件是keil c51。既然用的人多,那么关于keil c51的使用教程、使用方法、技巧...
广告
我要评论
1
0
广告
关闭 热点推荐上一条 /2 下一条