STM32 的优先级NVIC配置

STM32 的优先级NVIC配置1、NVIC优先级介绍2、NVIC优先级比较提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):*强调内容***NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4前提条件2:“组”优先级别>“抢”占优先级别>“副”优先级别前提

大家好,又见面了,我是你们的朋友全栈君。

1、NVIC优先级介绍

这里写图片描述
这里写图片描述

2、NVIC优先级比较

提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):*强调内容***NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4

前提条件2:“组”优先级别>“抢”占优先级别>“副”优先级别
前提条件3:同一组优先级别中,不同的抢占级别之间,其中一抢占级别正在做事,另外抢占级别不能打断他;(即”同一组优先级下的中断源间,没有中断嵌套“)
前提条件4:不同组优先级别间,依据优先级强弱,优先级别高的组的中断源可以打断优先级别低的组的正在做的事情;(即:不同组优先级间,可以中断嵌套)
下面:我们给一段优先级配置的代码进行详尽分析,方便上面的理解:
关以”前提条件一”的实例:
前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):
NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4

/**************************************************************************************************  
**  
** NVIC_Config()  
**  
**  
**  功能描述:中断向量配置。  
**  
**  参  数  :无  
**  
**  返回值  :无  
**  
***************************************************************************************************  
*/  
void NVIC_Config(void)  
{  
 NVIC_InitTypeDef NVIC_InitStructure; 

 /* Configure one bit for preemption priority -------------------------------- */ 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); 


 /* EXTI0 -------------------------------------------------------------------- */ 
 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; 
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; // 指定抢占式优先级别4,可取0-15 
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStructure); 


 /* Configure one bit for preemption priority -------------------------------- */ 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 
 /* SPI1-------------------------------------------------------------------- */ 
 NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel; 
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStructure); 


}  

解析:1.按照NVIC_PriorityGroup_4这么分,就分为了16个抢占(优先)级,每个抢占(优先)级下只有1个副优先级:0;
按照NVIC_PriorityGroup_3这么分,就分为了8个抢占(优先)级,每个抢占(优先)级下只有2个副优先级:0-1;

2.(优先级强弱:) EXTI0_IRQChannel 是0级组> SPI的3级组高优先级组的人,可以打断低阶级的正在做事的人(嵌套),所以当SPI正在工作时, EXTI0可以打断他进入 EXTI0中断;

关于“前提条件3”的实例:
前提条件3:同一组优先级别中,不同的抢占级别之间,其中一抢占级别正在做事,另外抢占级别不能打断他;(即”同一组优先级下的中断源间,没有中断嵌套“)

  /* *************************************************************************************************** ** ** NVIC_Config() ** ** ** 功能描述:中断向量配置。 ** ** 参 数 :无 ** ** 返回值 :无 ** *************************************************************************************************** */  
    void NVIC_Config(void)  
    {  
        NVIC_InitTypeDef NVIC_InitStructure; 

        /* Configure one bit for preemption priority -------------------------------- */  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 


        /* UART1 -------------------------------------------------------------------- */  
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
        NVIC_Init(&NVIC_InitStructure); 

        /* UART2 -------------------------------------------------------------------- */  
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
        NVIC_Init(&NVIC_InitStructure); 


    }  

解析:这个就是我写作的缘由的实例,因为不要求两个串口同时工作,但是又不允许串口之间相互干扰,(相互打断)所以把两个串口的中断归为同一组级别,NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 0组级别下,只有1个抢占优先级; 这1个抢占优先级下,有16个副优先级,所以分别让串口1的副优先级别为1, 串口2的副优先级别为0 ; 虽然串口2 的0优先级别>串口1的1优先级别 ,但是由于他们属于同一组下,所以他们之间,当有一个串口在通讯时,另外一个串口是不能打断正在通讯的串口的;
引申:当有三个串口选择不要求同时工作时,(或者有多个设备要求不在同一时间工作,但是优先响应时,可以把他们放在0组级,0抢占级下的,16个副优先级中)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143975.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 蓝屏终止代码KMODE_windows10重置电脑

    蓝屏终止代码KMODE_windows10重置电脑安装双系统后,Windows10时常出现蓝屏

    2022年10月14日
    1
  • Python新手写出漂亮的爬虫代码1——从html获取信息

    Python新手写出漂亮的爬虫代码1——从html获取信息Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有所耳闻,会觉得是一个高大上的东西,仿佛九阳神功和乾坤大挪移一样,和别人说“老子会爬虫”,就感觉特别有逼格,但是又不知从何入手,这里,博主给大家纠正一个误区:爬虫并不神秘,也不高级,是一个非常好上手和掌握的东西(当然,里面也有很多坑,也有很多细节,展开说的话其实也蛮复杂的,不过它的模式和套路就摆在那里,看了小编的博客,保证你能爬

    2022年5月2日
    36
  • imfilter函数matlab_matlab too many input argument

    imfilter函数matlab_matlab too many input argument认真研读一下MATLAB的help文档吧,解释最权威:BWFILLFillbackgroundregionsinbinaryimage.BWFILLisagrandfatheredfunctionthathasbeenreplacedbyIMFILL.BW2=BWFILL(BW1,C,R,N)performsaflood-filloperationont…

    2022年9月13日
    4
  • tabnine激活码-激活码分享

    (tabnine激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~V…

    2022年3月22日
    85
  • vim保存并退出有几种方法_ubuntu vim保存退出命令

    vim保存并退出有几种方法_ubuntu vim保存退出命令vim基础保存退出命令vimxxx.file输入文件内容;ins按键,切换插入和增加按ESC,左下角就可以进行输入:w保存但不退出:wq保存并退出:q退出:q!强制退出,不保存:e!放弃所有修改,从上次保存文件开始再编辑命令历史…

    2022年8月24日
    6
  • ubuntu修改root密码命令_手机怎么修改wifi密码

    ubuntu修改root密码命令_手机怎么修改wifi密码进入终端,输入sudopasswdroot然后输入当前用户的密码,之后就可以改密码了。需当前用户在sudoersfile里,一般如果是自己电脑的话,就都会在的。

    2022年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号