历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2019年08月27日 | 【STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)

发布者:WhisperingWind 来源: eefocus关键字:STM32H7  NVIC  中断分组  配置 手机看文章 扫描二维码
随时随地手机看文章

21.1 NVIC基础知识

NVIC的全称是Nested vectored interrupt controller,即嵌套向量中断控制器


对于M3/M4/M7内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。8位的话就可以设置2^8 = 256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如ST的STM32F1xx,F4xx和H7只使用了这个8位中的高四位[7:4],低四位取零,这样2^4=16,只能表示16级中断嵌套。


对于这个NVIC,有个重要的知识点就是优先级分组、抢占优先级和子优先级。STM32F1xx,F4xx和H7都是只使用了这个8位寄存器的高四位[7:4]。

从上面的表格可以看出,STM32支持5种优先级分组。系统上电复位后,默认使用的是优先级分组0,也就是没有抢占式优先级,只有子优先级。关于这个抢占优先级和子优先级有几点一定要说清楚。


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


在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。

在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。

  

Reset、NMI、Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。


初学者还有一个比较纠结的问题,就是系统中断(比如:PendSV,SVC,SysTick)是不是一定比外部中断(比如SPI,USART)要高。答案:不是的,它们是在同一个NVIC下面设置的。

 


掌握了这些基础知识基本就够用了。另外特别注意一点,配置抢占优先级和子优先级,它们合并成的4bit数字的数值越小,优先级越高,这一点千万不要搞错了。


21.2 常用的NVIC API

下面将外设配置中经常用到的两个函数做个说明。


  HAL_NVIC_SetPriority

  HAL_NVIC_EnableIRQ

 


21.2.1 函数HAL_NVIC_SetPriority

函数原型:


void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

函数描述:


此函数主要用于设置中断的抢占优先级和子优先级。


函数参数:


1、  第1个参数IRQn是中断号,由IRQn_Type定义的枚举类型,原始定义在stm32h743x.h。


typedef enum

{

  /* 部分定义,其它省略未写 */

  PendSV_IRQn                 = -2,    

  SysTick_IRQn                = -1,   

  DMA1_Stream3_IRQn           = 14,   

  DMA1_Stream4_IRQn           = 15,    

  DMA1_Stream5_IRQn           = 16,    

  DMA1_Stream6_IRQn           = 17,     

  ADC_IRQn                    = 18,    

} IRQn_Type;

2、  第2个参数PreemptPriority用于设置抢占优先级,范围0 - 15。


3、  第3个参数SubPriority用于设置子优先级,范围0 -15。


使用举例:


此函数的调用比较简单,比如设置ADC中断的抢占优先级是1,子优先级是0,那么此函数的设置就是:HAL_NVIC_SetPriority(ADC_IRQn, 1, 0)。


21.2.2 函数HAL_NVIC_EnableIRQ

函数原型:


void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

函数描述:


此函数主要用于使能中断。


函数参数:


1、第1个参数IRQn是中断号,由IRQn_Type定义的枚举类型,原始定义在stm32h743x.h。


typedef enum

{

  /* 部分定义,其它省略未写 */

  PendSV_IRQn                 = -2,    

  SysTick_IRQn                = -1,   

  DMA1_Stream3_IRQn           = 14,   

  DMA1_Stream4_IRQn           = 15,    

  DMA1_Stream5_IRQn           = 16,    

  DMA1_Stream6_IRQn           = 17,     

  ADC_IRQn                    = 18,    

} IRQn_Type;

注意事项:


调用此函数前要先调用优先级分组设置函数NVIC_PriorityGroupConfig,而这个函数会在HAL_Init里面被调用。函数基本都会在main函数里面优先被调用,所以保证HAL_Init优先被调用即可。


使用举例:


此函数的调用比较省事,比如使能ADC中断,那么此函数的设置就是:


HAL_NVIC_EnableIRQ (ADC_IRQn, )。


21.3 MDK中查看实际优先级配置

如果想查看配置的外设优先级是否正确设置了,MDK进入调试状态后,先点击全速运行,然后查看如下调试组件:


弹出如下窗口,在这个窗口里面就可以查看实际优先级了,比如滴答定时器Systick的优先级就是240,即240>>4 = 15。


21.4 开关中断

V7开发板的BSP驱动包在bsp.h文件里面对开关中断做了一个宏定义:


/* 开关全局中断的宏 */

#define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中断 */

#define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */

__set_PRIMASK就是对寄存器primask做的开关设置,如下表所示:


对于寄存器basepri我们举一个例子,帮助大家理解。比我们配置寄存器basepri(对于STM32H7,范围0-255)的数值为16,所有优先级数值大于等于16的中断都会被关闭,优先级数值小于16的中断不会被关闭。但0比较特殊,对寄存器basepri寄存器赋值0,那么被关闭的中断会被打开。


21.5 总结

最后,我们再强调一下,在NVIC分组为4的情况下,抢占优先级可配置范围是0-15,那么数值越小,抢占优先级的级别越高,即0代表最高优先级,15代表最低优先级。

关键字:STM32H7  NVIC  中断分组  配置 引用地址:【STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)

上一篇:【STM32H7教程】第22章 STM32H7的SysTick实现多组软件定时器
下一篇:【STM32H7教程】第20章 STM32H7的GPIO应用之无源蜂鸣器

推荐阅读

科技博客The Verge撰文指出,三星最近发布的Galaxy Note 9加入苹果iPhone X、Galaxy Note 8和OPPO Find X等高端机型的行列,加入1000美元手机俱乐部。在不到一年的时间里,千美元手机便已经变得司空见惯了。 以下是文章主要内容: 如果你密切关注科技行业动态时,变化的步调似乎是合理的、有条不紊的,有时甚至有点缓慢。然而,当你回头来看的时候...
年初的时候就有 5G 手机的很多风声,我很同意很多专业回答的观点,那就是真正消费者用得到且用的舒服的 5G 手机,需要等到下半年才会出现,刚好现在就已经是下半年了。最近我体验了一段时间的中兴天机 Axop 10 Pro 5G 版本,它在 7 月 18 日拿到了入网许可, 7 月 23 开启预售, 8 月 5 日已经正式开卖,而且价格只有 4999 人民币...
据外媒报道,Ibeo正式交付新型固态激光雷达传感器ibeoNEXT。该传感器基于新型光子激光测量技术,并且没有任何转动部件,可生成额外的单色图像。ibeoNEXT适用于驾驶辅助系统,以及L3和L4自动驾驶。此外,该公司还将于2021年推出用于环境感知和物体分类的软件。(图片来源:www.eenewsautomotive.com)在辅助系统领域,许多汽车制造商都依赖激光雷达这项关键...
  近几十年间,水泥工业的工艺过程有了大幅度的提升与革新,逐步向设备大型化、节能和高效率方向发展,而检测控制设备也从模拟式仪表向计算机控制系统和分散的直接数字控制方向发展,并日益多样化起来。其中,料位开关作为测量仪表不可缺少的一类,合理正确地选用料位开关,对物料存储的安全性起到非常重要的作用,同时还能节省大量的人力,提高生产的效...

史海拾趣

问答坊 | AI 解惑

多媒体协处理器SM501在嵌入式系统中的应用

引言 近年来,从手持消费电子到工业控制系统,嵌入式处理器的应用已经深入到人们工作和生活的方方面面,在某些应用领域,系统需要提供如1280×1024这类高分辨率的显示界面,而多数嵌入式处理器不能支持,或者在高分辨率下提供的显示效果不好。 ...…

查看全部问答∨

2007年全国大学生电子设计竞赛 题目推测汇总(不断更新中8.30)

本帖最后由 paulhyde 于 2014-9-15 04:19 编辑 2007年全国大学生电子设计竞赛 题目一: 一、 设计任务 设计一多功数字自适应电参数测试仪 二、设计要求 1、 基本要求 系统功能具体要求如下: (1)基本输入信号: 电 阻:电阻0~1MΩ。 输 ...…

查看全部问答∨

求一个关于单片机20000字符的英文文献+翻译

本帖最后由 paulhyde 于 2014-9-15 09:50 编辑 毕业设计要求找一个20000字符的英文文献 翻译过来 急求!!!!!!!  …

查看全部问答∨

matlab第二课---switch-case的用法!

看看分支选择结构吧! [ 本帖最后由 gaoxiao 于 2009-6-11 21:27 编辑 ]…

查看全部问答∨

【藏书阁】LCD12232点阵液晶模块使用说明

[ 本帖最后由 wzt 于 2010-3-12 17:32 编辑 ]…

查看全部问答∨

请教各位硬件实验PlatForm Builder 平台有关的问题

最近老师让交个硬件实验设计 ,要求在PlatForm Builder平台下实现,请教各位PlatForm Builder平台怎么装,有些同学装上这个平台不是系统崩溃,就是电脑运行速度速减,请教各位了,谢谢…

查看全部问答∨

为便携式 MFF 显示器选择最佳的 LED 背光驱动器

关键词:LED、WLED、白光 LED、CCFL、便携式 MFF 显示器、TPS61195、德州仪器、TI   为便携式 MFF 显示器选择最佳的 LED 背光驱动器 作者:Jeff Falin,德州仪器 (TI) 工厂应用工程师   摘要   白光 LED 将迅速取代冷阴极灯 ...…

查看全部问答∨

1602液晶显示程序

新手写了一个用1602液晶在第二行第一位显示字母A的程序,程序可以通过编译,但是液晶上部显示,不知道什么原因?求助解答,谢谢 LIST P=16F873a           ;  告诉编译程序使用何种PIC单 ...…

查看全部问答∨

TI秀+13年的开发板

本帖最后由 gaon 于 2014-1-24 14:49 编辑 TI推广又一年。参加活动送了些开发板, 340,最早拿到的一块板子。 2000 参加研讨会送的。          电源评估板。           ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved