STM32的中断优先级和库函数的 开、关总中断

发布者:DelightfulSmile最新更新时间:2018-12-28 来源: eefocus关键字:STM32  中断优先级  库函数  关总中断 手机看文章 扫描二维码
随时随地手机看文章

一,中断优先级:

STM32(Cortex-M3)中的优先级概念

STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3 中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

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

这就是优先级分组的概念。




--------------------------------------------------------------------------------

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组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

// 使能EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

要注意的几点是:

1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

2)抢占式优先级别相同的中断源之间没有嵌套关系;

3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

二,开关总中断:

在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。PRIMASK位:只允许NMI和hard fault异常,其他中断/ 异常都被屏蔽(当前CPU优先级=0)。
FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。

在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。

下面两个函数等效于关闭总中断:
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);

下面两个函数等效于开放总中断:
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);

上面两组函数要成对使用,不能交叉使用。

例如:

第一种方法:
NVIC_SETPRIMASK();   //关闭总中断
NVIC_RESETPRIMASK();//开放总中断

第二种方法:
NVIC_SETFAULTMASK();   //关闭总中断
NVIC_RESETFAULTMASK();//开放总中断

常常使用

NVIC_SETPRIMASK();                    // Disable Interrupts
NVIC_RESETPRIMASK();                  // Enable Interrupts

 

3.0库没有上面的函数了,

补充 可以用  
#define cli()     __set_primask(1)  
#define sei()  __set_primask(0)  

来实现


关键字:STM32  中断优先级  库函数  关总中断 引用地址:STM32的中断优先级和库函数的 开、关总中断

上一篇:stm32中一些常用基本库函数以及串口配置步骤
下一篇: STM32外部中断方式按键操作(STM32_09)

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

STM32定时器 输入捕获实现双边沿检测
STM32的定时器有输入捕获功能,在STM32F10x_tim.h中对于TIM_Input_Capture_Polarity有如下定义 #define TIM_ICPolarity_Rising ((uint16_t)0x0000) #define TIM_ICPolarity_Falling ((uint16_t)0x0002) #define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) #define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) ||
[单片机]
自动驾驶的“全图”外挂?小鹏和高德的CP局
前几日,高德地图举办第三代车载导航发布会,并公布小鹏汽车成为首家搭载高德第三代车载导航的车企。 之所以这则信息引起了我的注意,是因为电哥不久前刚刚体验了小鹏NGP Beta,独一份的全新交互给我留下了深刻的印象;搭配上新一代车载导航,能够动态计算车道以及路况变化,提供更多维度的信息。 ▽P7中“SR自动驾驶环境模拟显示 这也是首次将信息娱乐和自动驾驶两个分割的域进行打通,不仅仅是导航精进为车道级,自动驾驶系统的感知、分析、决策过程也通过可视化的方式传递给了驾驶者,丰富的道路信息会提前告知于驾驶者,无论是是技术层面还是驾驶层面,都带来了全新的体验。 ▽基于激光点生成的高精地图 为什么首先落地的是小鹏?
[汽车电子]
自动驾驶的“<font color='red'>开</font>全图”外挂?小鹏和高德的CP局
stm32串口首次发送数据丢失
查阅stm32f10X参考手册 : TC:发送完成 当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位 也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。 而硬件复位后,串口发送的首个数据之前没有read SR的操作,是直接write DR,也就是说,TC没有被清除掉。 所以在发送数据指令之前加上USART_ClearFlag(USART2,USART_FLAG_TC);或者USART_GetFlagStatus(USART2, USART_FLAG_TC);指令,先读取一下USAR
[单片机]
Galaxy A23高清渲染 水滴孔屏幕
据报道,三星正在研发新的A系列智能手机,如Galaxy A23、Galaxy A33、Galaxy A53和Galaxy A73,其中一些手机最早可能在本月底或3月亮相。 近日,爆料者Steve Hemmerstoffer和CollegeDunia提供了一份最新的爆料,从各个角度揭示了Galaxy A23的整体设计。 最新的CAD渲染表明,它的设计将与去年的Galaxy A系列手机类似。 Galaxy A23 5G的CAD渲染显示,它的正面有一个水滴开孔,下巴很厚。而Galaxy A23 5G的背面设计与去年的Galaxy A32、A52和A72相似。 该设备的尺寸约为165.4 x 77 x 8.5 mm,它的厚
[手机便携]
Galaxy A23高清渲染 水滴<font color='red'>开</font>孔屏幕
STM32 DAC简单介绍
1.DAC模块 1.数模转换功能 2.可以配置为8位和12位模式(8位右对齐,12位左对齐,12位右对齐) 3.DAC模块有两个单独的控制器,每个通道有着单独的转换器,可以独立转换,也可以同时转换 4.可以实现噪声波形和三角波形的生成 5.每个通道有着DMA功能 6.图示: PS:左上方为一些触发的条件,左下方为一些数字电源(VDDA,VSSA) Vref+为参考电压,DAC_OUT_x为DAC的输出通道,(2.4v Vref VDDA) 数据并不是直接传入DORx的,需要先传入DHRx(如果没有选择硬件触发(TENx=0),在一个时间周期后传入DORx),同时,又经过Tsetting(大约3u
[单片机]
<font color='red'>STM32</font> DAC简单介绍
STM32通过ADC模拟看门狗实现掉电保存
1.前言 很多时候我们需要将程序中的一些参数、数据等存储在EEPROM或者Flash中,达到掉电保存的目的。但有些情况下,程序需要频繁的修改这些参数,如果每次修改参数都进行一次保存,那将大大降低存储器的寿命。尤其是单片机内部Flash,以STM32F030K6T6为例,擦写寿命只有1000次。当然,这是最小值,实际可能比这个多,但也是有风险。 因此,最好的办法就是在程序运行中不进行保存操作,只在断电时保存一次。掉电保存的关键是怎样检测掉电瞬间,方法有很多种:1.通过外部电路检测电源,触发IO中断。2.通过单片机的PVD(可编程电压检测器) 中断检测。3.通过ADC看门狗中断检测。不管哪种方式,一般都是通过中断来实现,主要是为了
[单片机]
STM32之SysTick
STM32单片机是以Cortex-M3为内核的 以用Cortex-M3中关于SysTick的描述: SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 Co
[单片机]
<font color='red'>STM32</font>之SysTick
基于STM32的步进电机速度控制
项目需求 在制作一个使用全向轮的机器人底盘,对于全向轮,电机的精度是影响效果的重要因素。所以使用了步进电机,使用步进电机的优点是可以不使用编码器,开环控制即可达到高精度的效果。 调整占空比或者调整周期 众所周知,PWM有两个重要参数,周期与占空比。 步进电机的运动方式是,每收到一个脉冲,就旋转指定的角度。因此影响电机速度的唯一参数就是PWM的频率。以下附图两张来说明调整占空比与调整周期的区别。 周期固定,调整占空比 上图中有4个PWM,它们的周期是一样的,不同之处是拥有从80%至20%的占空比。可以看出,无论占空比为多少,在1s内,它们产生的高电平的数量是一样的,即无论占空比为多少,PWM的频率都一致。因此也就无法调整步进
[单片机]
基于<font color='red'>STM32</font>的步进电机速度控制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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