历史上的今天

今天是: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应用之无源蜂鸣器

推荐阅读

大安防时代到来,我国安防市场需求进一步增加,“构建和谐社会”、“平安建设”、“智慧城市”等成为各级政府长期任务。受益于此,我国安防视频监控行业继续保持快速发展趋势。前瞻产业研究院数据显示,2010-2017 年期间,我国视频监控市场规模从242亿元增长到1124亿元,年均复合增长率达24.53%。未来,2018年预计突破1300亿,至2023年达到2000亿。我...
TDK株式会社(东京证券交易所股票代码:6762)推出更堅固耐用的新型B3277*M系列电容器,进一步扩展了爱普科斯 (EPCOS) 薄膜电容器直流支撐应用的产品系列。新系列产品适用于极端环境条件,并在温度为85°C、相对湿度为85%和额定电压条件下,通过1000小时的THB(温度、湿度和偏压)测试认证。新系列电容器符合RoHS要求,额定电压为450 V DC至1600 V ...
由Summit Wireless Technologies(纳斯达克股票代码:WiSA)发起创立的无线扬声器和音频协会(WiSA® LLC)宣布,协会成员、中国最大的电视制造商创维(SKYWORTH)集团有限公司(港股代码:00751),推出了配有无线连接技术的美兹雕塑 1(Metz Skulptur 1)电视和扬声器。作为美兹黑标品牌的一部分,此次推出的产品是拥有百年历史的奢华电视制造商美...
PWM的说明PWM有三个关键指标: PWM频率, 占空比, 区分度对于同一个时钟频率下工作的单片机, 区分度是和PWM工作频率相关的, 因为总频率是固定的, PWM工作频率越高, 留下给区分度的部分就越低, 因此区分度就越低. 对于STM32, 如果时钟是72MHz, 在PWM频率为1KHz时, 区分度为16bit, 在281KHz时, 为8bit, 在4.5MHz时, 就时4bit了.STM32F4 Timer...

史海拾趣

问答坊 | AI 解惑

绿色动力新潮流——燃料电池

随着能源紧张、油价攀升,环境污染严重,节能环保成为人类不懈努力的方向。燃料电池以其效率高、零污染、使用方便等特点进入人类的视野,在诸多领域的应用也应运而生,成为人们关注的热点。  工作原理   1839年英国的Grove发明了燃料电池,并 ...…

查看全部问答∨

各位推荐一下最好的荧光粉品牌

我使用过的是日雅,中村于及,宏大。日雅的要好点但贵点。大家还知道那几个好的啊…

查看全部问答∨

WinCE

我做实验用的是ARMS3C2410的板,烧写wince,每次重启板子,wince就不见了?怎么回事呢?怎么能让wince不不见呢?哪为高手能够给我一下指教!谢谢了!…

查看全部问答∨

一起开发嵌入式操作系统

打算开发嵌入式操作系统,召集有志同道合者,现在已经做好了semaphore部分,其它部分正在开发中,论坛:http://dawn.tech.topzj.com/index.php, 欢迎大家光临指导! …

查看全部问答∨

mp3模块

请问有没有朋友做过mp3模块或者正在做的?基于单片机 [ 本帖最后由 guoyuanqiang 于 2010-12-10 16:34 编辑 ]…

查看全部问答∨

堆叠技术

由于微型化以及性能发展趋势,设计者们一直努力在最小可能的空间内实现最高可能的电子产品的功能与性能。而典型的两大限制因素分别是:集成水平和I/O焊点的限制。硅片在空间和连接上的限制可在两个层次上得以解决。一是在芯片上通过编程压缩实现更 ...…

查看全部问答∨

TI 原装DK-LM3S9B96开发板经验、心得

说实话,从来没有用过TI的ARM产品,   但是玩过早期的ARM7,工作中用过TI的dsp,另外对FPGA最熟悉。   觉得这块板子挺超值的,不光是价格,而且可扩展性比较强。   为了买这块板子,也为了督促自己学习,先在这里写一篇凑数。 ...…

查看全部问答∨

帮帮忙 看看这个程序的问题在哪儿?

大侠们帮忙看看这个程序24c64读写程序 在keilc上运行时提示target not created,电脑是win7系统,跟这个有关系吗?#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define writedeviceadd ...…

查看全部问答∨

单片机I/O输出PWM波可以直接接直流电机吗?

如题,让P10输出PWM波,然后直接接在直流电机一级,另一级接地,这样为什么直流电机不转?一定需要外接电路吗?看网上的列子都接了外接电路谢谢…

查看全部问答∨

msp入门程序

msp入门程序 三位数自加…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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