电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

stm32接连优先级概述

2017-11-13 14:41分类:电子技术 阅读:

 

stm32接连优先级概述
一:总述

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时钟了。

六:实例

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文件中查找到。

上一篇:仿照电路缺陷确诊要素剖析

下一篇:纷歧样电路中的电容器常用称谓意义

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部