STM32的优先级NVIC_PriorityGroupConfig的理解及其使用

发布者:HarmoniousDream最新更新时间:2016-12-28 来源: eefocus关键字:STM32  优先级 手机看文章 扫描二维码
随时随地手机看文章

写作原由:因为之前有对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

  1. /*  

  2. ***************************************************************************************************  

  3. **  

  4. **                                         NVIC_Config()  

  5. **  

  6. **  

  7. **  功能描述:中断向量配置。  

  8. **  

  9. **  参  数  :无  

  10. **  

  11. **  返回值  :无  

  12. **  

  13. ***************************************************************************************************  

  14. */  

  15. void NVIC_Config(void)  

  16. {  

  17.     NVIC_InitTypeDef NVIC_InitStructure;  

  18.       

  19.     /* Configure one bit for preemption priority -------------------------------- */  

  20.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);  

  21.       

  22.   

  23.         /* EXTI0 -------------------------------------------------------------------- */  

  24.     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;  

  25.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; // 指定抢占式优先级别4,可取0-15  

  26.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

  27.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

  28.     NVIC_Init(&NVIC_InitStructure);  

  29.           

  30.   

  31.         /* Configure one bit for preemption priority -------------------------------- */  

  32.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);  

  33.     /* SPI1-------------------------------------------------------------------- */  

  34.     NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;  

  35.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

  36.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

  37.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

  38.     NVIC_Init(&NVIC_InitStructure);  

  39.   

  40.       

  41. }  

解析: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:同一组优先级别中,不同的抢占级别之间,其中一抢占级别正在做事,另外抢占级别不能打断他;(即”同一组优先级下的中断源间,没有中断嵌套“)


  1. /*  

  2. ***************************************************************************************************  

  3. **  

  4. **                                         NVIC_Config()  

  5. **  

  6. **  

  7. **  功能描述:中断向量配置。  

  8. **  

  9. **  参  数  :无  

  10. **  

  11. **  返回值  :无  

  12. **  

  13. ***************************************************************************************************  

  14. */  

  15. void NVIC_Config(void)  

  16. {  

  17.     NVIC_InitTypeDef NVIC_InitStructure;  

  18.       

  19.     /* Configure one bit for preemption priority -------------------------------- */  

  20.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

  21.       

  22.   

  23.     /* UART1 -------------------------------------------------------------------- */  

  24.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

  25.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

  26.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  

  27.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

  28.     NVIC_Init(&NVIC_InitStructure);  

  29.   

  30.     /* UART2 -------------------------------------------------------------------- */  

  31.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;  

  32.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

  33.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

  34.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

  35.     NVIC_Init(&NVIC_InitStructure);  

  36.   

  37.       

  38. }  

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


关键字:STM32  优先级 引用地址:STM32的优先级NVIC_PriorityGroupConfig的理解及其使用

上一篇:stm32 IAP + APP ==>双剑合一
下一篇:ARM 之FIQ(快速中断) IRQ(中断)

推荐阅读最新更新时间:2024-03-16 15:27

stm32CAN波特率计算小程序(QT源码)
软件:Qt Creator 开发环境:Window7 用qt做得一个计算波特率的小程序,在实际的应用中我们设置波特率的时候是通过以下参数来定的: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_6tq; CAN_InitStructure.CAN_Prescaler=5; 波特率计算小程序的截图: 根据所需的的采样点、波特率以及错误率得到以上外设初始化所需的参数。 据网上资料,采样点的设置有以下规律: 75% when 波特率
[单片机]
stm32CAN波特率计算小程序(QT源码)
SPI(STM32
SPI 是英语S erial Peripheral interface的缩写,是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI是一种高速的,全双工,同步的通信总线 Standard SPI, Dual SPI, Quad SPI Standard SPI: 标准SPI通常就称SPI,它是一种串行外设接口规范 CLK, /CS, DI, DO, /WP, /Hold 全双工模式,输入和输出可以同时进行(mosi,miso分别对应的是DI和DO) Dual SPI: CLK, /CS, IO0, IO1, /WP, /Hold 半双工模式,mosi和miso对应
[单片机]
STM32基础定时器详解
定时器最基本的功能就是定时处理事情。比如定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。可以实现非常丰富的功能。定时器是一个很强大的外设,不同行业使用的方式不同,知识面很广。 01、定时器介绍 首先我们可以在STM32F207数据手册找到定制器的资源,从下图可以看到STM32F207一共10个通用定时器,2个高级定时器,2个基本定时器。 不同定时器的区别 在STM32F207的用户参考手册中可以看到定时器的基本框图,下图是定时器1&8的看图。 由上图看出,不同寄存器具有不同的参数,位数的区别,计数模式的区别,DMA请求的区别,通道得的区别,互补输出的区别和其他。在具体项目中
[单片机]
<font color='red'>STM32</font>基础定时器详解
STM32串口使用详解
一、关于串口需要了解的几个知识点: 1.波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称为波特率。 波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。 串口的传输与网络等其他的传输有着相似之处,比如常用的wifi,区别在与这些网络的单位是k,只有串口是按位来计数的。 2.单工,半双工,全双工: 单工:只能一个方向传输 半双工:可以两个方向传输,但需要分时复用 全双工:两个方向传输 二、初始化函数 串口的初始化包括以下几部分: 1.时钟初始化: RCC_APB2PeriphClockCmd(RCC_APB2Per
[单片机]
STM32学习------SPI笔记【寄存器版】
一、介绍 简述: 1)通常 SPI 通信要求 4 根线,分别是 MOSI(主机输出从机输入), MISO(主机输入从机输出), CLK(时钟线), CS(片选线) 2)当发送和接受数据的工作都准备好了,只要有时钟 CLK,就发送数据,没有时钟就不发送,而且一个时钟周期发送一位(bit)数据,所以发送数据的快慢由时钟频率来控制。 3)至于时钟和数据的相位没有特别严格的要求(而 IIC 中,数据的变化只能在 SCL 是低电平的时候发生), SPI数据的变化是一个时钟周期一次,这样的方法来传输数据就简单多了。我们可以根据需求对时钟的极性和相位做调整,看看是在时钟上升沿还是下降沿来发送数据,还有停止发送时时钟的极性,是保持高电平还是低电平
[单片机]
<font color='red'>STM32</font>学习------SPI笔记【寄存器版】
STM32高级开发(9)-学习与编译libopencm3-example
在前面的几篇中我们为大家介绍了在Linux下stm32开发环境的新特性和使用方式,可能大家觉得,我怎么写一个工程还要自己写链接文件和启动文件,是不是太不方便了点。那么这篇中我会告诉大家其实并不是这样的。在我们日常的一些小规模工程下我们是可以使用一个叫做libopencm3的cortexM核的通用驱动库来配置我们的工程。那么大型的工程呢?有童鞋还会问道。对于大型的工程,我想:自己去改写链接文件和启动文件,使得你对整个系统的启动及运行流程更好的把控绝对是物有所值的,在这两个文件上付出的短短的时间绝对会为我们带来超出他们花费的价值。 Libopencm3简介 libopencm3项目(以前称为libopenstm32)旨在创建一个适
[单片机]
<font color='red'>STM32</font>高级开发(9)-学习与编译libopencm3-example
stm32 GPIO原理: 输入和输出控制
pre name= code class= html #include stm32f10x.h int main(void) { //1.PA.0 工作在推揽输出,50MHZ; PA.8输入 浮空输入 GPIOA- CRL=0X03; GPIOA- CRH=0X04; //2. PA.0 输出 = PA.8输入 while(1){ if((GPIOA- IDR&0X0100)==0X0100) GPIOA- ODR=0X01; else GPIOA- ODR=0x00; } return 0; }
[单片机]
STM32基础知识:中断系统
中断系统 1 数据传输方式 无条件传输 :处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备.。 查询方式 :传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询。 中断方式 :一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作。 直接存储器访问 :处理器内部建立片内外设和内存之间的数据传输通道,传输过程不需要处理器参与。 2 中断系统的基本概念 2.1 中断全过程 中断发生: 当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理。 中断处理: CPU暂停当前的工作,转去处理事件B。 中断返回: 当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继
[单片机]
<font color='red'>STM32</font>基础知识:中断系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved