历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2019年04月22日 | STM32的中断优先级详解

2019-04-22 来源:eefocus

中断优先级设置步骤:


系统运行后先设置中断优先级分组。在主函数调用函数:


void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);


整个系统执行过程中,只设置一次中断分组。


针对每个中断,设置对应的抢占优先级和响应优先级:


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//配置过程


NVIC_InitTypeDef   NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断,此处可改为任何有中断功能的模块定时器,外部中断等,后面有例子参考

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

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2

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

NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器


如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。


优先级分组只是给抢占优先级与响应优先级在中断优先级寄存器中高四位分配各个优先级数字所占的位数,在程序中只能设定一次。


每写一个关于中断优先级的程序必须包含下列两个函数: (1)void NVIC_PriorityGroup();//写在主程序中;


(2)NVIC_Init(); //写在初始化配置中




默认情况下,如何不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级,则无任何抢占优先级,所以无论中断的优先级设多少,都没有抢占中断的功能,所以,如果想要一个中断打断另一个中断,必须设置中断优先级分组为1,2,3,4.


如设置优先级分组为2


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


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


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


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


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


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


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


可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:


NVIC_PriorityGroup_0=> 选择第0组


NVIC_PriorityGroup_1=> 选择第1组


NVIC_PriorityGroup_2=> 选择第2组


NVIC_PriorityGroup_3=> 选择第3组


NVIC_PriorityGroup_4=> 选择第4组  


如 选择使用优先级分组第1组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//高一位就有0,1,四个抢占优先;低三位就是0,1,2,3,4,5,6,7,八个响应优先级


具体例子如下


{


假设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)



// 使能EXTI0中断


NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; 

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

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

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 


NVIC_Init(&NVIC_InitStructure);


// 使能EXTI9_5中断 

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; 

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

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 


NVIC_Init(&NVIC_InitStructure);


//TIM3中断


      NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

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

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

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


   NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设


}


在上例子中,优先抢占优先级,其数字越低,优先级越高。相同下比较响应优先级,其数字越低,优先级越高。


要注意的几点是:


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


2)抢占式优先级别相同的中断源之间没有嵌套关系;


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


推荐阅读

史海拾趣

CDIL[Continental Device India Pvt. Ltd.]公司的发展小趣事

随着市场竞争的加剧和技术的不断进步,CDIL在15年前作出了重要决策——退出晶圆制造,转而专注于IC封装和电子制造服务。这一转型不仅使CDIL能够更好地适应市场需求,也为其带来了更广阔的发展空间。如今,CDIL的IC封装技术已达到国际先进水平,为全球众多知名电子企业提供优质服务。

CONTRINEX公司的发展小趣事

除了上述重要事件外,Contrinex还一直致力于产品创新和技术研发。多年来,公司不断推出新型传感器产品,如防磁防焊型电感式传感器、扩展型纤细型安全光幕等,以满足不同客户的需求。同时,Contrinex还积极与OEM和系统集成商合作,共同开发定制化解决方案,为客户提供更加全面和专业的服务。

这些故事只是Contrinex在电子行业发展历程中的一部分。作为一个不断追求卓越和创新的企业,Contrinex将继续致力于为客户提供高品质、高精度的传感器产品和解决方案,推动电子行业的持续发展。

E-Mark Inc公司的发展小趣事

GHI公司一直致力于提升产品品质和安全性。为了进入欧洲高端市场,GHI公司决定对其核心产品进行E-Mark认证。在认证过程中,GHI公司不断完善质量管理体系,提升生产工艺水平,确保产品质量的稳定性和可靠性。最终,GHI公司的产品成功获得了E-Mark认证,并在欧洲市场获得了良好的口碑和市场份额。

D3 Semiconductor公司的发展小趣事

为了更好地拓展市场,D3 Semiconductor与全球知名的电子元件分销商贸泽电子(Mouser Electronics)建立了合作伙伴关系。根据协议,贸泽电子储备了D3 Semiconductor的完整650伏额定电压超结MOSFET产品线,并将其推向全球市场。这一合作不仅加强了D3 Semiconductor在全球市场的竞争力,也为公司带来了更多的商业机会。

Advanced Semiconductor, Inc.公司的发展小趣事

随着全球对环保和可持续发展的重视,ASI也积极响应这一趋势,致力于研发更加环保、节能的半导体产品。公司不断投入资源研发低功耗、高性能的芯片技术,为推动绿色电子产业的发展贡献力量。同时,ASI也对未来充满信心,将继续加大在新技术、新应用领域的投入,为半导体行业的未来发展贡献更多的智慧和力量。

这五个故事展示了Advanced Semiconductor, Inc.在电子行业中的发展历程和取得的成就。从创立初期的艰难探索到如今的行业领先地位,ASI凭借其独特的技术、创新的精神和敏锐的市场洞察力,不断突破自我、超越自我,成为了半导体行业的一颗璀璨明星。

台湾凌通(Generalplus)公司的发展小趣事
光敏元件的性能可能随温度变化而变化,需考虑应用场合的温度条件,选择温度稳定性好的光敏元件。

问答坊 | AI 解惑

LED行业究竟现状如何?

很早以前就知道led行业,但一直未做深入了解 , 今天去爬山碰到一个哥们, 向我吹嘘: 1.单多的做不完,要经常性加班. 2.很难在市场上招到合适的人 ,也就是有点led水平的人很难找 3.tcl和创维,不做led研发 ,而将研发生产全外包 4.利润好,银行 ...…

查看全部问答>

无线数传模块--全透明串口TTL、232、485电平

无线数传模块 无线数传模块   液晶模块 一. 功率:20mW - 1W     串行接口 TTL 、232、485可选,波特率1200----115200     电源:DC3.3V--5.5V     距离:500m-5Km   ...…

查看全部问答>

windows CE重启之后 怎样才能让自己对系统的修改设定保存下来呀?

1.我自己开发的程序,烤的到windows CE系统里面,重启就没有了,还有触摸屏的设定,usb conection的设定都没有了 2.usb conection的波特率对应注册表的哪个键值?…

查看全部问答>

关于2410唤醒的疑惑

我使用的平台是2410 ,系统为CE5.0   ,在做电源管理的时候遇到了如下的问题 1、能够休眠。 经过fw.s中的CPUPOWEROFF后系统可以确定是休眠了,理由是:PWREN 脚为低,CLK0,CLK1,SCK也都为低,虽然我没有把内核的1.8V分开,但是系统的 ...…

查看全部问答>

WIN CE 系统声音大小要如何改变

WIN CE 系统声音大小要如何改变? 我改了注册表里的 [HKEY_CURRENT_USER\\ControlPanel\\Volume]下面\"Volume\"这一项 但是改完了声音好像并没有改变。是不是还要做什么动作? 我看WIN CE 自带的Volurne&Sounds里声音一改变[HKEY_CURRENT_USER\ ...…

查看全部问答>

求助大家关于中断的问题

小弟在这里请问各位大虾:在一个中断服务程序里又遇到同一个中断会再次响应吗?进中断服务程序时已经把标志位清零了。…

查看全部问答>

调用API如何刷新另一窗口的RECT

正在写一个SIP的程序。 遇到了这样一个困难。 首先在生成SIP软面板的时候,创建了一个窗口,得到句柄hwndsip。 我可以在这个面板上直接TextOut就输出了文本,直接InvalidateRect就可以将文本清除掉,在同一窗口下做这样的一系列操作都没什么问题 ...…

查看全部问答>

程序怎样变成电路地?

由于刚学,可能提的问题不是太有价值,但突然想到,困惑很长时间。我们现在做单片机实验,流程是这样:先在IDE里用汇编写出了源程序,然后编译成*.HEX,然后调试状态全速运行,如果对的话就能看结果了。我有点晕,这源文件变成1 0后怎样变成高低电 ...…

查看全部问答>

如何开发WINCE5.0 环境下的NDIS网络驱动

主要是如何初始化那个微端口驱动程序,具体操作是什么?我的PC安装了EVC 4SP4和PB 5.0,还需要怎么做才能开发NDIS网络驱动? 这个驱动程序最后是要写入S3C2440开发板上运行的…

查看全部问答>

【设计工具】赛灵思FPGA PLL 动态重配置技巧

          本应用指南首先介绍了通过动态重配置端口 (DRP) 对Spartan-6 FPGA 锁相环(PLL) 的时钟输出频率、相移及占空比进行动态修改的方法。在阐述了内部DRP 控制寄存器的功能后,提供了一个通过状 ...…

查看全部问答>