历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2019年03月24日 | STM32 NVIC简化理解

2019-03-24 来源:eefocus

一、STM32 (Cortex-M3) 中的优先级概念


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


1. 何为抢占式优先级(pre-emption priority)


    抢占式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应(后者俗称中断嵌套)。


2. 何为副优先级(subpriority)


    在抢占式优先级相同的情况下,高的副优先级的中断优先被响应;


    在抢占式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应——非抢断式响应不能嵌套。


二、Cortex-M3中对中断优先级的定义(先看下面标题三的内容)


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


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

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

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

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

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

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

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

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


这就是优先级分组的概念。


三、stm32中对中断优先级的定义


    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下: 


第0组:所有4位用于指定副优先级(可以设置16级)

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

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

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

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


四、举例


接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和副优先级:


// 选择使用优先级分组第1组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


// 使能EXTI0中断

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定副优先级别0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);


要注意的几点是:


 1、在一个系统中,通常只使用上面5种分配情况的一种。


2、 如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果。


3、 如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。


五、补充:开关总中断 


在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。


PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。 

FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。 


    在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。 


例如: 


第一种方法: 

NVIC_SETPRIMASK();   //关闭总中断 

NVIC_RESETPRIMASK();//开放总中断 


第二种方法: 

NVIC_SETFAULTMASK();   //关闭总中断 

NVIC_RESETFAULTMASK();//开放总中断 


常常使用:

NVIC_SETPRIMASK();     // Disable Interrupts 

NVIC_RESETPRIMASK(); // Enable Interrupts

可以用: 

#define CLI()  __set_PRIMASK(1) 

#define SEI()  __set_PRIMASK(0) 

来实现开关总中断的功能。


推荐阅读

史海拾趣

Elcos AG公司的发展小趣事

随着国内市场的饱和,Elcos AG开始寻求国际化拓展的机会。公司首先在欧洲市场建立了销售网络,通过与当地合作伙伴的紧密合作,逐渐打开了欧洲市场的大门。随后,Elcos AG又将目光投向了亚洲和北美市场,通过设立海外办事处和参加国际展会等方式,积极推广公司品牌和产品。在国际市场的竞争中,Elcos AG凭借其卓越的产品品质和完善的售后服务体系,赢得了众多客户的信赖和支持。

Colibrys SA公司的发展小趣事

Colibrys在MEMS技术方面拥有深厚的专业知识,这得益于公司长期的研发积累和不断创新的精神。许多客户委托公司建造最苛刻的航空航天、能源、铁路或汽车测试设备,这些成功案例进一步巩固了公司在行业内的领先地位。无论是用于汽车安全气囊的MEMS加速度计,还是用于引导钻头的高温加速度计,都体现了Colibrys在专业知识应用方面的卓越能力。

Acculin Inc公司的发展小趣事

Acculin Inc深知人才是企业发展的核心。为了吸引和留住优秀人才,公司建立了完善的培训体系,并为员工提供了良好的晋升机会。此外,公司还注重团队建设,通过举办各种团建活动活动增强员工之间的凝聚力。这些举措使得Acculin在人才竞争激烈的市场中保持了优势。

FILTRONETICS Inc公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,FILTRONETICS深知技术创新的重要性。公司加大了对研发的投入力度,成立了专门的研发部门和技术中心,致力于新技术、新材料和新工艺的研发和应用。同时,公司还积极关注环保和可持续发展问题,致力于生产绿色、环保的电子产品。通过不断的技术创新和可持续发展实践,FILTRONETICS不仅保持了技术领先地位,也为社会的可持续发展做出了贡献。

GSG公司的发展小趣事
支持多种通信接口(如RS-485、Modbus、HART等),方便与其他系统或设备进行集成。
EZchip Technologies Ltd公司的发展小趣事

随着技术的不断成熟和市场的认可,EZchip开始寻求更广阔的市场空间。公司通过与全球知名通信设备制造商建立合作关系,将其产品应用于各类网络设备和解决方案中。同时,EZchip还积极参与国际标准制定和行业交流活动,不断提升品牌影响力。通过市场拓展和合作,EZchip的产品逐渐覆盖了全球多个国家和地区,成为了网络通信行业的重要参与者。

问答坊 | AI 解惑

置顶-FPGA基础入门教程之学习板/开发板电路图

@@MAX7132学习板电路图完整版 https://bbs.eeworld.com.cn/thread-50800-1-1.html@@ @@EP2C学习板原理图                  https://bbs.eeworld.com.cn/thread-72861-1-4.html@@ @@ ...…

查看全部问答>

【转】电子设计竞赛经验汇总(11楼以后更新获奖团队的成功感言)

本帖最后由 paulhyde 于 2014-9-15 03:22 编辑 竞赛时应该注意的问题: 1、软件与硬件电路最好是同时做,不要前几天都在搞软件,等到最后才来焊板,到时如果出问题都没时间改了,我参加时就是遇到了这种情况。要么也可以在面包板实践下,有人可 ...…

查看全部问答>

关于BGA封装走线的问题!

再好几个论坛发帖,没人鸟窝 首先说明一下问题 我用的是ad 08 在画一个BGA封装的FPGA板子,看到别人在管脚中间放置焊盘,我也试着做,但是放置好以后,无法布线,老是连不上线,也不知道是什么问题,搜了半天,也没结果,就问问大家,谢谢…

查看全部问答>

writing_testbenches_2rd 好书分析

replyreload += \',\' + 278416;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

6410 OPEN GL ES 问题

各位, 我在6410上调试三星opengl es的例子。 1.1 和2.0的  exe文件都可以正常运行,但调试三星带的源码时,初始化全部成功,但一运行到glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);时串口就会输出如下错误信息: Exception \' ...…

查看全部问答>

招聘嵌入式软件工程师

高级软件开发工程师/软件QA. 职位要求: 1、计算机或相关专业本科及以上学历; 2、必需精通C/C++编程; 3、熟悉嵌入式软件开发原则,设计模式及调试技巧; 4、掌握嵌入式操作系统(如Linux, WinCE)平台上的系统及应用程序开发; 5、3年以上嵌 ...…

查看全部问答>

串口调试

我用串口调试助手 为什么显示的东西是乱码   谢谢…

查看全部问答>

电容触摸感应原理与应用(3)

7.在有限的IO中扩展按键数量    前面我们讲到两种多按键的处理方法,仔细观察可以发现,这两种处理方法都是基于多个IO的,也就是说有多少个IO我们就能扩展出多少个按键。如果我只有6个可用的IO,那么能不能实现多于6个按键呢?答案是肯 ...…

查看全部问答>

求助:关于tlv320aic23的电平转换

我用的是5510的一块开发板,上面的codec用的是tlv320aic23,我的程序需要对外界输入的电压值进行判断,如果大于某幅度就怎样,这时候程序该怎样写这个判断语句,不知道模拟电压经codec转换后对应的关系 高手帮忙,不胜感激…

查看全部问答>