电工之家_电工基础知识学习网站
当前位置:电工之家 > 电子技术 > 正文

stm32不同中断可以有不同分组吗

时间:2015-12-03 12:19 来源:电工之家

 一:综述

 
STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),可以提供16 级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位)和16个抢占优先级(因为抢占优先级最多可以有4位)。
 
二:优先级判断
 
STM32(Cortex-M3)中有两个优先级的概念——抢占优先级和响应优先级,其属性编号越小,则优先级别越高。有人把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
三:优先级分组
既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位在NVIC应用中断与复位控制寄丛器(AIRCR)的中断优先级分组域中,可以有8种分配方式:
所有8位用于指定响应优先级
最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
最高7位用于指定抢占式优先级,最低1位用于指定响应优先级
这就是优先级分组的概念。
 
 
--------------------------------------------------------------------------------
 
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这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组
 
中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次。
 
四:中断源的优先级
接下来就是指定中断源的优先级,中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。
 
中断源优先级具体的设置了该中断源的优先级别
 
在一个程序中可以设定多个(最多16个)优先级,每个中断源只能设定的一个。
 
每写一个关于中断优先级的程序必须包含下列两个函数:
 
1)void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置
 
2)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置
 
注意:NVIC能配置的是16种中断向量,而不是16个,当工程中有超过16个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。
 
五:启动所需GPIOn_Pin及AFIO的RCC时钟
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,RCC_APB2Periph_AFIO,ENABLE);
 
注意:千万别忘记启动RCC_APB2Periph_AFIO!否则管脚只能做普通高低电平来用。当把GPIO用作EXTI外部中断或使用重映射功能的时候,必须开启AFIO时钟,而在使用默认复用功能的时候,就不必开启AFIO时钟了。
 
六:实例
 
<span style="font-size:14px;">  NVIC_InitTypeDef    NVIC_InitStructure;   //定义中断初始化类型结构体变量
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //配置优先级分组1 2个两个抢占优先级 8个亚优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //开口外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //亚优先级配置为0号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置
 
 
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //开口外部中断5到9
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置
 
 
  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置
</span>从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。
 
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn表示要配置的为EXTI的第5~9线的中断向量,也就是说EXTI5~EXTI9线是使用同一个中断向量的。这些可写入的参数可以在stm32f10x.h文件中查找到。
看过《stm32不同中断可以有不同分组吗》的人还看了以下文章
52v电压降到5v500mA适合用电阻来降压吗 52v电压降到5v500mA适合用电阻来降压吗
把52v电压降到5v500mA不适合用电阻来降压。因电阻降压有两个致命缺陷就是效率低和降压多少随电流而变。 电阻降压可以理解为把高出所需电压的部分,用电阻消耗掉,所以电阻和负载上的电压比就等于能耗比。 5V的单片机在工作电流500mA时功耗为2.5W,而降压电阻...
怎么避免电压变化引起电流波动造成发光二极管损坏 怎么避免电压变化引起电流波动造成发光二极
LED发光二极管,针对电压和电流的伏安特性曲线来说,它正向电压的微小变化会引起正向电流的很大变化。 例如:3.3V时为20mA的LED灯珠,用三节1.5V干电池串联供电,新电池电压可达4.5V,电流超过100mA,大了5倍,很容易烧毁。而1W大功率LED灯珠,如果正向电压...
戏说电气专业之迷魂阵 戏说电气专业之迷魂阵
一、阵型介绍 阵型:三--三--三 1、前锋(元件):电阻器、电感器、电容器。 2、前卫(导纳) 1)中前卫:电导。 2)边前卫(电纳) (1)左边前卫:感纳。 (2)右边前卫:容纳。 3、后卫(阻抗) 1)中后卫:电阻。 2)边后卫(电抗) (1)左边后卫:感抗...
电子是什么电荷 电子是什么电荷
电子是微观世界中最常见的粒子之一,我们在中学物理电磁学中就了解了关于电子的一些特点。比如在讲到金属导线中电流形成的时候,电子就起到了功不可没的作用,正是由于金属中的电子在电场力的作用下定向移动才形成了电流,这些都是由于自由电子运动形成的结...
怎么在国内使用110v的电器 怎么在国内使用110v的电器
国外带回来的电器,铭牌上已经标注的很清楚了,电压电压是110v,频率60Hz,而我们国内普通家庭用的市电则是220v,频率50Hz,电压高了一倍,频率也不一样,不过频率相差不大,并且一般的电器都支持50Hz和60Hz,主要就是电压,是绝对不能直接插电使用的,否则...