源:http://blog.csdn.net/yx_l128125/article/details/9703843

写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项目需要2个串口,但是不是两个串口同时使用,只是随机使用其中一个,程序对2个串口的优先级需要配置;

此文思路:“中断优先级”思维导图-->关键要点--->结合图和要点相关程序应用例程讲解;

我们先来看ST公司的一张图:

我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮    放大看;)

前提条件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

<span style="background-color: rgb(255, 255, 255);">/*
</span>***************************************************************************************************
**
**                                         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-15NVIC_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://www.cnblogs.com/LittleTiger/p/4371487.html

STM32的优先级NVIC_PriorityGroupConfig的理解及其使用(转)相关推荐

  1. CSS优先级的一些理解

    CSS有三个非常重要的特性:层叠性.继承性.优先级 对优先级的一些理解: 当同一个元素指定多个选择器,就会有优先级的产生. 选择器相同,则执行层叠性 选择器不同,则根据选择器权重执行 选择器权重如下表 ...

  2. 【STM32】中断和中断优先级理解

    在嵌入式系统开发过程中,不可避免的会和"中断"打交道.很多初学者对中断的理解不深,往往是看到中断绕着走.其实不然,费点时间搞懂中断能解决不少问题. 中断英文"Interr ...

  3. 关于我对stm32看门狗的一些理解(基于正点原子)

    咕咕咕之后想更会儿stm32哈哈哈,但是其实是之前自己写的笔记,想着以后就写在一起吧,我自己也更好去找到自己写的玩意~毕竟总所周知,博客都是写给自己的. (虽然好像现在自己都看不懂了我的天哪) 一.什 ...

  4. STM32之system_stm32f4xx.c的理解

    对system_stm32f4xx的理解 上一篇博客解释了stm32的启动文件,在启动文件中,在进入__mainC库函数之前,进入了SystemInit函数,如下图所示. 那,今天我们就来探究一下这个 ...

  5. μC/OS任务就绪和优先级查找过程理解

    任务创建时,任务加入就绪表的过程: 1. μC/OS任务共64个优先级,本文中一个优先级只对应一个任务,最低优先级用二进制表示为00111111,只需占用6位,如图1所示. 图1 2. 创建任务时,会 ...

  6. 在c语言中逗号的作用,C语言逗号运算符应用优先级与运算规则理解

    一.逗号运算符介绍 逗号运算符是C语言中常见的数学运算符号儿,多个运算的表达式之间可以用逗号分隔开来,然后用逗号分隔的这几个表达式可以单独进行运算,最后的运算结果取最后一个表达式的值进行返回. 逗号运 ...

  7. axure原件 总是丢失_Axure实现提示文本单击显示后自动消失的效果

    FORM 一 .新增的input输入属性 1.email类型 在表单提交E-mail地址时,无效的输入会生成很多无效数据,对后期的数据检索造成一定的影响.所以在表单提交之前,需要对输入的E-mail地 ...

  8. STM32中断优先级、FreeRTOS中断优先级,任务优先级

    STM32中断优先级 NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,管理着整个芯片与中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设.各 ...

  9. Linux进程中的优先级的理解(PRI 和 NI)

    文章目录 优先级的基本理解 为什么有优先级的概念 查看进程的优先级 对PRI和NI的理解 用top命令更改已存在进程的nice:达到修改进程优先级 总结 优先级的基本理解 cpu资源分配的先后顺序,就 ...

最新文章

  1. windows命令行设置环境变量
  2. 机器学习-逻辑回归-代价函数
  3. 日常生活 -- 感悟
  4. SOAP 1.1 - 学习
  5. [css] clear属性只对块级元素有效么?为何无法应用于行内元素?
  6. HttpURLConnection中connection.getInputStream()报异常FileNotFoundException
  7. php短路逻辑,JS利用短路原理简写if语句
  8. python可以不用主函数吗_python自定义函数可以向前引用不用声明
  9. java输入a控制台打印1_Java—— 流(Stream)、文件(File)和IO
  10. android HierachyViewer使用
  11. 张飞电子工程师速成视频教程百度云_张飞电子工程师速成视频教程第二部
  12. 中国莽草酸行业市场深度调查报告(2022版)
  13. OSChina 周三乱弹 ——怎么样防止隔壁老王
  14. scikit-learn:4.3. Preprocessing data(standardi/normali/binari..zation、encoding、missing value)
  15. PD虚拟机的三种网络模式
  16. 使用着色器模拟雾效果
  17. vue实现select下拉显示隐藏功能【详细功能拓展】
  18. kubectl describe命令详解
  19. Python常用模块——随机函数(random)
  20. 运维实践-使用WebP Server Go无缝转换图片为Google的webp格式让你网站访问加载速度飞起来...

热门文章

  1. php环境模拟stphp_用php模拟做服务端侦听端口
  2. 去哪儿-13-city-vuex
  3. 【例题+习题】【数值计算方法复习】【湘潭大学】(三)
  4. Matlab数据插值-内插、外插
  5. anaconda创建新环境_【创建社会主义新农村】怀城街道:转变整治理念 农村人居环境换新颜...
  6. labelme安装_语义图像分割-DIGITS2-labelme数据集自动扩展
  7. nginx 常用命令整理
  8. mysql如何建立索引workbench_MySQL数据库中如何正确的理解与使用索引?
  9. service和controller都加了事务_「Spring声明式事务」在service内部之间调用竟然失效啦?...
  10. python列表乘数值_《利用Python进行数据分析》十一章· 时间序列·学习笔记(一)...