stm32中断优先级

来源:互联网 发布:淘宝皇冠店年入多少 编辑:程序博客网 时间:2024/05/02 20:20

先简单讲个例子:

void NVIC_Configuration(void)          //中断管理初始化

{

         NVIC_InitTypeDef  NVIC_InitStructure;

         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //首先要中断分组。 设置NVIC中断分组2,  2位抢占优先级,2位响应优先级

      //分完组之后,具体对需要的中断进行设置优先级(抢占式优先级和响应式优先级都要设置)

      //这里设置TIM3中断的优先级别

         NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn; // 选择定时器3全局中断。   旧版本为TIM3_IRQChannel 。下面几行程序分别对TIM3中断级别的设置

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

         NVIC_InitStructure.NVIC_IRQChannelSubPriority= 3;                //响应式优先级3级

         NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;              //TIM3通道使能(该句程序可以在写在定时器初始化中)

         NVIC_Init(&NVIC_InitStructure);      //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器,有了这句,上面的设置才有效。

}

总结1:对于中断管理就6句程序便可:先定义个结构体-----然后设置分组------选定中断通道-------设置具体要设置摸个中断的抢占式优先级和响应式优先级----参数化有效。




一:综述

STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级
的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

二:优先级判断

1、每个中断都要设置抢占式优先级别和响应式优先级别

2、抢占式优先级高于响应式优先级

3、高抢占式优先级高于低抢占式优先级

总结:当多个中断同时发生时:优先级高的先执行

      当优先级较低的优先级执行中断函数时,若此时中断高的优先级的到来要打断之前优先级较低的中断,让优先级高的执行完,再继续之前优先级较低的执行。

      若中断优先级相等(抢占式和响应式都相等),那么中断就按照顺序,先到先执行,后到后执行。
三:优先级分组

/*
  既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在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)中断优先级设置

http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html

0 0
原创粉丝点击