历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2020年01月09日 | STM32 nvic 解释

2020-01-09 来源:eefocus

朋友们,如果你需要在STM32上移植RTOS,那么首先必须深入理解它的中断系统。[转载]STM32之NVIC的深入详解


什么是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;

 #ifdef  VECT_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); 

}

推荐阅读

史海拾趣

ARCOLECTRICSWITCHES公司的发展小趣事

在技术进步的基础上,ARCOLECTRIC SWITCHES公司积极拓展国内外市场。公司通过与各大电子厂商建立合作关系,将产品广泛应用于家电、通讯、汽车等多个领域。同时,公司注重品牌建设,通过广告宣传和市场推广活动提升品牌知名度和美誉度。这些努力使得ARCOLECTRIC SWITCHES公司的市场份额逐年增长,品牌影响力不断扩大。

EMC Component Group公司的发展小趣事

在市场竞争日益激烈的情况下,ARCOLECTRIC SWITCHES公司始终坚持质量至上的原则。公司建立了完善的质量管理体系,从原材料采购到生产加工、产品检验等各个环节都严格把关,确保产品质量符合客户要求。同时,公司不断创新升级产品,推出更加智能化、节能环保的新型开关产品,满足市场不断变化的需求。

Electech Electronics公司的发展小趣事

在快速发展的同时,Electech Electronics也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。此外,Electech Electronics还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了公司的社会责任感,也为公司的长期发展奠定了基础。

Aleph America Corporation公司的发展小趣事

Electech Electronics一直非常重视产品质量和品质管理。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测和包装等各个环节都进行严格把控。此外,公司还不断引进先进的生产设备和技术,提升产品的制造精度和品质。这些举措使得Electech Electronics的产品在市场上享有很高的声誉,赢得了客户的信赖。

Amphenol Aerospace公司的发展小趣事

随着科技的不断发展,Electech Electronics意识到仅仅依赖电子元器件的代理和销售已经无法满足市场的需求。于是,公司开始投入研发,专注于电子产品的设计和制造。经过数年的努力,Electech Electronics成功开发出一系列具有竞争力的电子产品,如智能控制模块、高精度传感器等。这些产品的推出不仅拓宽了公司的产品线,也提升了公司的市场竞争力。

Esterline Technologies Corporation公司的发展小趣事

随着公司业务的不断发展,Electech Electronics开始实施国际化战略,积极开拓海外市场。公司先后在亚洲、欧洲和北美等地设立了分公司和办事处,与当地的企业和渠道商建立了紧密的合作关系。同时,Electech Electronics还积极参加国际电子产品展会,展示公司的最新产品和技术,吸引更多的海外客户。

问答坊 | AI 解惑

基础问题:FPGA中寄存器的长度有限制吗?

FPGA 是硬件编程器件,器寄存器的长度理论上没有限制,受限与硬件容量,以及对寄存器的时钟速率要求。比如要实现一个256位的串并转换。只需如下编程即可:     din :  in   std_logic_vector(255 downto 0);   ...…

查看全部问答>

仿真正常 固化后不正常

我用的伟福仿真器,p89c51的片子,通过串口写入数据,控制液晶屏的显示 在同一块板子上,仿真完全正常 固化后液晶屏就没有反映 检查发现串口通讯是正常的,在程序中加入测试点,证明程序运行也正常 仿真时就用的板子上的晶振 给液晶屏的控制管脚加了 ...…

查看全部问答>

从万文数据库下载的一个关于Q格式应用的资料

从万文数据库下载的一个关于Q格式应用的资料 …

查看全部问答>

程序没写多少怎么出现了这样的错误.

 ERRO[e89]:too much object code produced[more than 0x800 byte] for this pack-age  我用的是EW430,147的片子.…

查看全部问答>

求解决啊·~~

用STM32的开发板 做一个无线光通信系统  STM32要完整的功能就是用串口中断方式接收PC机发送的数据 然后把接收到的数据进行OOK调制 去控制PWM的输出…

查看全部问答>

07年A题——音频分析仪

本帖最后由 paulhyde 于 2014-9-15 03:26 编辑 最近在做这个题目,07年A题。音频分析仪。有没有大神有资料的。求助。  …

查看全部问答>

【TI经典】LMK0480X holdover 功能分析

亲爱的朋友们,新的一周开始了,希望大家在工作学习生活中能有更多收获哦!今天小编为大家带来由德州仪器中国工程师团队所创作的《LMK0480X holdover 功能分析》。 本文首先主要介绍了TI 的新一代时钟产品LMK0480X 的holdover 功能和指标,以及在 ...…

查看全部问答>

AD9851模块使用说明

AD9851模块使用说明…

查看全部问答>

高低电压转换电路

输入电路电源是5V电压,输出电路电源是10V电压,因此共模电压分别为2.5V和5V。如果有共模电压为2.5V,幅值为1V的正弦波如何通过电路放大成共模电压为5V,幅值为3V的正弦波,共模电压由基准单独提供,也就是实现正弦波幅值放大3倍,共模电压也发生变 ...…

查看全部问答>

使用ASF在不同MCU中创建CDC项目的比较

很多人不喜欢用AS6和ASF,因为AS6+ASF的组合运行程序慢、打开项目文件慢、编译速度慢,的确是不够方便。但是AS6和ASF毕竟是ATMEL官方的主要开发工具,还是有它的一些优点的,比如使用ASF快速建立项目、通过ASF向导添加新的功能模块、程序在不同MCU ...…

查看全部问答>