NVIC中断优先级管理

笔记基于正点原子官方视频
视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.1007.top_right_bar_window_history.content.click
如有侵权,联系删除

一、NVIC中断优先级分组

1.NVIC中断简介
  • CM4/CM7 内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
  • STM32F4/F7并没有使用CM4内核的全部东西,而是只用了它的一部分。
    ① STM32F40xx/STM32F41xx总共有92个中断。10个内核中断,82个可屏蔽中断。
    ② STM32F42xx/STM32F43xx则总共有97个中断。10个内核中断,87个可屏蔽中断。
    ③ STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。
  • STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。
    10个内核中断如下图

部分可屏蔽中断如下图

2.中断管理方法

首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。
分组配置是在寄存器SCB->AIRCR中配置:
**注意:**抢占优先级和响应优先级是数值越小级别越高

3.抢占优先级 & 响应优先级区别
  • 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
  • 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
  • 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
  • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

举例
假定设置中断优先级组为2,然后设置
中断3(RTC中断)的抢占优先级为2,响应优先级为1。
中断6(外部中断0)的抢占优先级为3,响应优先级为0
中断7(外部中断1)的抢占优先级为2,响应优先级为0。
那么这3个中断的优先级顺序为:中断7>中断3>中断6。
特别说明
一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

4.中断优先级分组函数

在工程中的位置:HALLLIB-stm32f4xx_hal_cortex.c

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{
/* Check the parameters */
assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
NVIC_SetPriorityGrouping(PriorityGroup);
}
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);          //设置分组为2

在工程位置:HALLLIB-stm32f4xx_hal_cortex.c中也提前预设好了中断优先级级别为2

二、NVIC中断优先级设置

1.中断设置相关寄存器

在工程中的位置:CORE-core_cm4.h中

__IO uint8_t IP[240];         //中断优先级控制的寄存器组
__IO uint32_t ISER[8];   //中断使能寄存器组
__IO uint32_t ICER[8];   //中断失能寄存器组
__IO uint32_t ISPR[8];   //中断挂起寄存器组
__IO uint32_t ICPR[8];  //中断解挂寄存器组
__IO uint32_t IABR[8];  //中断激活标志位寄存器组
2.MDK中NVIC寄存器结构体
typedef struct
{
__IO uint32_t ISER[8];
uint32_t RESERVED0[24];
__IO uint32_t ICER[8];
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8];
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8];
uint32_t RESERVED3[24];
__IO uint32_t IABR[8];
uint32_t RESERVED4[56];
__IO uint8_t IP[240];
uint32_t RESERVED5[644];
__O uint32_t STIR;
} NVIC_Type;
3.对于每个中断怎么设置优先级

中断优先级控制的寄存器组:IP[240]
全称是:Interrupt Priority Registers
240个8位寄存器,每个中断使用一个寄存器来确定优先级。
STM32F40x系列一共82个可屏蔽中断,使用IP[81]~IP[0]。
每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。

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

1)中断使能寄存器组:ISER[8]
作用:用来使能中断
32位寄存器,每个位控制一个中断的使能。STM32F40x只有82个可屏蔽中断,所以只使用了其中的ISER[0]~ISER[2]。
ISER[0]的bit0bit31分别对应中断031。ISER[1]的bit0~31对应中断32~63;ISER[2]的bit0~31对应中断64~96;

void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

2)中断失能寄存器组:ICER[8]
作用:用来失能中断
32位寄存器,每个位控制一个中断的失能。STM32F40x只有82个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]。
ICER[0]的bit0~bit31分别对应中断0~31。ICER[1]的bit0~31对应中断32~63; ICER[3]的bit0~对应中断64~95;
配置方法跟ISER一样。

void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);

3)中断挂起控制寄存器组:ISPR[8]
作用:用来挂起中断

4)中断解挂控制寄存器组:ICPR[8]
作用:用来解挂中断

5)中断激活标志位寄存器组:IABR [8]
作用:只读,通过它可以知道当前在执行的中断是哪一个

4.中断优先级设置步骤

①系统运行后在HAL_Init函数中设置中断优先级分组。调用函数:

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
//中断优先级分组2 整个系统执行过程中,只设置一次中断分组。

②针对每个中断,设置对应的抢占优先级和响应优先级:

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

③ 使能中断通道:

void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

21.NVIC中断优先级管理相关推荐

  1. 关于嵌入式学习随笔-6《NVIC中断优先级管理》

    1.中断技术概述 在单片机应用系统中,中断技术主要用于时时检测与控制,也就是要求单片机能感及时地响应中断请求源提出的服务请求,进行快速响应并及时处理,这些工作是由单片机片内的中断系统来实现的.当中断请 ...

  2. STM32F4 HAL库开发 -- NVIC 中断优先级管理

    一.中断寄存器 STM32F429xx的96个中断里面,包括10个内核中断和91个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这91个可屏蔽中断.在MDK内,与NVIC相关的寄存器,MD ...

  3. 【STM32】NVIC 中断优先级管理,抢占优先级,响应优先级,中断寄存器

    文章目录 抢占优先级和响应优先级 抢占 响应 NVIC 的优先级组 中断寄存器 ISER[8] ICER[8] ISPR[8] ICPR[8] IABR[8] IP[240] 中断优先级设置步骤总结 ...

  4. 【STM32】NVIC中断优先级管理(中断向量表)

    STM32F1xx官方资料: <STM32中文参考手册V10>-第9章 中断和事件 Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有25 ...

  5. STM32外部中断与(NVIC)中断优先级管理

    文章目录 1.中断介绍 1.中断的概念 2.中断的产生 3.中断处理的流程 2.STM32内嵌向量中断控制器NVIC 1.NVIC控制器的寄存器 2.STM32中断配置 3.STM32外部中断EXIT ...

  6. 【STM32】 NVIC 中断优先级管理

    目录 中断解释 相关寄存器组介绍 设计逻辑 配置方法 总结 中断解释 NVIC:向量中断控制器. 中断可以看作是一个事件. 举例来说,你正在家里学习,突然来了电话,你只能停下当前的学习去接电话,在接电 ...

  7. STM32F1笔记(四)NVIC中断优先级管理

    STM32将中断分为5个组,组0~4.配置代码如下: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 在标准库里,分组的定义如下: /** @defgr ...

  8. NVIC中断优先级管理

  9. (四)STM32F407总线架构、时钟系统配置相关的函数,IO 引脚复用器和映射,NVIC中断管理,寄存器地址映射

    基础知识 一.GPIO输入输出各种模式 二.STM32F407总线架构 三.STM32F407时钟系统 (1) STM32F4 时钟树概述 (2)STM32F4 时钟初始化配置 (3)STM32F4 ...

最新文章

  1. 2018秋寒假作业4—PTA编程总结1
  2. html5 drap 文件夹,带有显示ID的Html5 drap and drop问题
  3. QT中button中没有accept()和reject()这两个槽解决办法
  4. chameleon 算法_使用Chameleon,Shrinkwrap,Drone / Graphene与Arquillian进行Java EE集成测试...
  5. 克隆安装oracle,Oracle 之 Cloning $oracle_home (克隆安装oracle软件)
  6. async和await理解代码
  7. 2013年工作中遇到的20个问题:241-260
  8. 读取模式错误、计算引擎操作复杂:这些Hadoop问题该如何应对?
  9. BP神经网络:feedforwardnet版回归预测
  10. Excel中,通过 「条件格式」 实现, 下拉菜单选择某个值时,这一行的颜色改变。
  11. 汇编语言源程序基础分析--跑马灯
  12. 手机录音ogg格式怎么转换mp3
  13. Wireshark通过TCP协议抓取QQ好友IP以及定位
  14. Android-APP内存优化
  15. 锐起无盘精华100问!(包括3.1,3.0版本)
  16. CVTE笔试面试经验分享(硬件)—2020秋招
  17. 微信小程序低功耗蓝牙(BLE)开发总结
  18. [10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: timeout
  19. winForm欢迎界面
  20. 炫龙P6笔记本搭建Windows 10+Ubuntu双系统

热门文章

  1. 上海市计算机一级考试英语考试,全国计算机一级考试测试题及答案
  2. PORTESCAP涡轮盘步进电机PH010 104
  3. google G1,G2,G3比较(YY)
  4. 如何解决Coursera看不了视频的问题
  5. iOS-AES加解密各模式(ECB、CBC、CFB、OFB)的实现
  6. Go后台管理系统 | EasyGoAdmin
  7. 服务器端口冲突必杀技
  8. 前端(vue)文件流下载
  9. 2020中国独角兽分析报告!(附榜单)
  10. 开学第一周(习题+感悟)