您的位置 首页 开关

stm32中止优先级问题

STM32F10x参考手册里并没有关于中断STM32中断优先级的具体介绍,需要参考《STM32F10xxxCortex-M3ProgrammingManual》一、STM32中中断

STM32F10x参阅手册里并没有关于中止STM32中止优先级的详细介绍,需求参阅《STM32F10xxx Cortex-M3 Programming Manual》

一、STM32中中止优先级的概念:
STM32(Cortex-M3)中有两个优先级概念——抢占式优先级和呼应优先级,有人把呼应优先级乘坐“亚优先级”或“副优先级”,每个中止源都需求被指定这两个优先级。
具有高抢占式优先级的中止能够在具有低抢占式优先级的中止处理进程中被呼应,即中止嵌套,或者说高抢占式优先级的中止能够嵌套低抢占式优先级的中止。
当两个中止源的抢占式优先级相一起,这两个中止将没有嵌套联系,当一个中止到来后,假如正在处理另一个中止,这个后到来的中止就要比及前一个中止处理完之后才干被处理。假如这两个中止一起抵达,则中止控制器依据他们的呼应优先级凹凸来决议先处理哪一个;假如他们的抢占式优先级和呼应优先级都持平,则依据他们在中止表中的排位次序决议先处理哪一个。
已然每个中止源都需求被指定这两种优先级,就需求有相应的寄存器位记载每个中止的优先级;在Cortex-M3中界说了8个比特位用于设置中止源的优先级,这8个比特位能够有8种分配办法,如下:
一切8位用于指定呼应优先级

最高1位用于指定抢占式优先级,最低7位用于指定呼应优先级
最高2位用于指定抢占式优先级,最低6位用于指定呼应优先级
最高3位用于指定抢占式优先级,最低5位用于指定呼应优先级
最高4位用于指定抢占式优先级,最低4位用于指定呼应优先级
最高5位用于指定抢占式优先级,最低3位用于指定呼应优先级
最高6位用于指定抢占式优先级,最低2位用于指定呼应优先级
最高7位用于指定抢占式优先级,最低1位用于指定呼应优先级

这便是优先级分组的概念,在CM3中总共分8个组,GROUP0优先级最高,GROUP7最低,可是在后面讲到的STM32这块详细的芯片只完成了5个优先级分组,即简化了规划。

Cortex-M3答应具有较少中止源时运用较少的寄存器位指定中止源的优先级,因而STM32把指定中止优先级的寄存器位削减到4位,这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组

要注意的几点是:

1)假如指定的抢占式优先等级或呼应优先等级超出了选定的优先级分组所限制的规模,将或许得到意想不到的成果;
2)抢占式优先等级相同的中止源之间没有嵌套联系;

3)假如某个中止源被指定为某个抢占式优先等级,又没有其它中止源处于同一个抢占式优先等级,则能够为这个中止源指定恣意有用的呼应优先等级。

二、开关总中止
办法一:
void __disable_irq(void) // Disable Interrupts
void __enable_irq(void) // Enable Interrupts
Cortex-M3编程手册51页
Cortex-M3编程手册98页
Cortex-M3编程手册99-100页
办法二:
//封闭总中止:
__set_PRIMASK(1);
__set_FAULTMASK(1);
//敞开总中止:
__set_PRIMASK(0);
__set_FAULTMASK(0);
Cortex-M3编程手册21页
三、设置中止的次序(PB7为例)
1、 首要设置PB7为悬浮输入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
2、敞开AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
3、衔接EXTI7 Line到PB7
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
4、装备EXTI7 Line
EXTI_InitStructure.EXTI_Line = EXTI_Line7;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
5、设置优先级组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
6、使能并设置EXTI7为最低优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NV%&&&&&%_InitStructure);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/262548.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部