完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

第21章       STM32H7的NVIC中断分组和配置(重要)

本章节为大家讲解STM32H7的中断优先级配置。此章节非常重要,初学者经常在这里犯迷糊,因此很有必要整明白。

21.1 NVIC基础知识

21.2 常用的NVIC API

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

21.4 开关中断

21.5 总结

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 = -,
SysTick_IRQn = -,
DMA1_Stream3_IRQn = ,
DMA1_Stream4_IRQn = ,
DMA1_Stream5_IRQn = ,
DMA1_Stream6_IRQn = ,
ADC_IRQn = ,
} 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 = -,
SysTick_IRQn = -,
DMA1_Stream3_IRQn = ,
DMA1_Stream4_IRQn = ,
DMA1_Stream5_IRQn = ,
DMA1_Stream6_IRQn = ,
ADC_IRQn = ,
} 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教程】第21章 STM32H7的NVIC中断分组和配置(重要)的更多相关文章

  1. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

  2. 【STM32H7教程】第22章 STM32H7的SysTick实现多组软件定时器

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第22章       STM32H7的SysTick实现 ...

  3. 【STM32H7教程】第30章 STM32H7的USART应用之八个串口FIFO实现

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第30章       STM32H7的USART应用之八个串口 ...

  4. 【STM32H7教程】第16章 STM32H7必备的HAL库API(重要)

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第16章       STM32H7必备的HAL库API(重要 ...

  5. 【安富莱STM32H7教程】第1章 初学STM32H7的准备工作

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第1章   初学STM32H7的准备工作 俗话说万事开头 ...

  6. 【STM32H7教程】第33章 STM32H7的定时器应用之TIM1-TIM17的中断实现

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第33章       STM32H7的定时器应用之TIM1-T ...

  7. 【STM32H7教程】第32章 STM32H7的TIM定时器基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第32章       STM32H7的TIM定时器基础知识和H ...

  8. 【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第29章       STM32H7的USART串口基础知识和 ...

  9. 【STM32H7教程】第61章 STM32H7的MDMA基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第61章       STM32H7的MDMA基础知识和HAL ...

随机推荐

  1. @supports特性查询

    特性查询也就是@supports规则,这个属性是作为CSS2.0扩展被引入的,是检测浏览器是否支持css属性值,是由逻辑与,逻辑或和逻辑非组合而成.主要的目的就是为了作者能够在不同的浏览器上根据不同的 ...

  2. Linux tree

    tree命令,是大小写敏感的.常用的是:1.tree -C 颜色显示 2.tree -f 显示文件全路径ls -R也可以显示树结构,但没上面 清晰 3.tree -L n n 是数字,表示显示几层 4 ...

  3. [MySQL] mysql中bitmap的简单运用

    bitmap就是在一个二进制的数据中,每一个位代表一定的含义,这样最终只需要存一个整型数据,就可以解释出多个含义.业务中有一个字段专门用来存储用户对某些功能的开启和关闭,如果是传统的思维,肯定是建一个 ...

  4. Java之线程安全

    什么是线程安全? 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 什么是线程安全问题? ...

  5. IntelliJ IDEA安装与使用

    官网:https://www.jetbrains.com/ 点击 点击下载 点击

  6. 【algo&ds】4.B树、字典树、红黑树、跳表

    上一节内容[algo&ds]4.树和二叉树.完全二叉树.满二叉树.二叉查找树.平衡二叉树.堆.哈夫曼树.散列表 7.B树 B树的应用可以参考另外一篇文章 8.字典树Trie Trie 树,也叫 ...

  7. PHP 微信公众号/小程序获取openid,用户信息

    1.获取code (获得openid的前置条件) 地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redi ...

  8. 深蓝词库转换2.5发布——支持微软五笔,支持Linux和macOS和更多命令行功能

    最近利用晚上的时间,对很久没有新版本发布的深蓝词库转换进行了版本升级.本次升级主要包含的功能包括: 一.支持Win10自带的微软五笔输入法用户自定义短语的导入导出. 1.在转换输入法词库列表中选择“W ...

  9. 请求时发送OPTIONS请求

    最近在用uni-app开发项目时,发现一个之前没注意到的点,当我发送POST请求的时候,在NetWork可以看到在发送正式的POST请求时,会先发送一个OPTIONS请求,OPTIONS请求后才会发送 ...

  10. c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11209807.html 一.1道网易c++的面试题 我当时第一时间的解答方案 #include ...