stm32f407探索者开发板(十五)——NVIC中断优先级管理
文章目录
- 零、前言
- 一、NVIC中断优先级分组
- 1.1 中断的管理方法
- 1.2 抢占优先级&相应优先级的区别
- 1.3 举例
- 1.4 特别说明
- 1.5 中断优先级分组函数
- 二、NVIC中断优先级设置
- 2.1 中断设置相关寄存器
- 2.2 中断设置优先级
- 2.2.1 中断优先级控制的寄存器组 IP[240]
- 2.2.2 中断使能寄存器组 ISER[8]
- 2.2.3 中断失能寄存器组 ICER[8]
- 2.2.4 中断挂起/解挂控制寄存器 ISPR[8]和ICPR[8]
- 2.2.5 中断激活标志位寄存器组 IABR[8]
- 2.3 中断参数初始化函数
- 三、NVIC总结
零、前言
- CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
- STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分
— STM32F40xx/STM32F41xx总共有92个中断。
— STM32F42xx/STM32F43xx则总共有96个中断 - STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。
一、NVIC中断优先级分组
1.1 中断的管理方法
首先,对STM32中断进行分组,组0~4。同时,对每个中断设置-一个抢占优先级和一一个响应优先级值。
分组配置是在寄存器SCB->AIRCR中配置:
一、分组有什么意义
系统只设置一次,一旦分组确定下来后[7:4]的分配情况也就确定下来了,即IP的分配结果
二、抢占优先级和响应优先级是干什么的
1.2 抢占优先级&相应优先级的区别
- 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
- 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
- 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
- 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
抢占优先级:数字越低级别越高,0
可以打断1
的中断
响应优先级:在抢占优先级相同的情况下生效,如果两个中断同时发生(抢占优先级一样),哪个响应优先级级别高,则先进行中断(不能进行打断)
如果都相同,则看那个先发生
1.3 举例
假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1中断6 (外部中断0 )的抢占优先级为3,响应优先级为0。中断7 ( 外部中断1 )的抢占优先级为2,响应优先级为0。
优先级顺序:中断7>中断3>中断6
1.4 特别说明
一.般情况下,系统代码执行过程中,只设置次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。
因为IP分配情况会紊乱
1.5 中断优先级分组函数
void NVIC PriorityGroupConfig(uint32_ _t NVIC_ PriorityGroup);
void NVIC_ PriorityGroupConfig(uint32_ t NVIC_ PriorityGroup)
{assert_ param(IS_ NVIC_ PRIORITY_ GROUP(NVIC_ PriorityGroup));SCB->AIRCR = AIRCR_ VECTKEY_ MASK | NVIC_ PriorityGroup;
}
NVIC_ PriorityGroupConfig(NVIC_ PriorityGroup_ _2);
二、NVIC中断优先级设置
2.1 中断设置相关寄存器
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;
2.2 中断设置优先级
2.2.1 中断优先级控制的寄存器组 IP[240]
中断优先级控制的寄存器组:IP[240]
全称是:Interrupt Priority Registers
240个8位寄存器,每个中断使用一-个寄存器来确定优先级。STM32F40x系列一共82个可屏蔽中断,使用IP[81]~IP[0]。
每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。
void NVIC_ Init(NVIC_ InitTypeDef* NVIC_ InitStruct);
入口参数结构体
NVIC_ InitTypeDef
的定义
typedef struct
{uint8_t NVIC_IRQChannel; //确定是哪一个中断(82中) uint8_t NVIC_IRQChannelPreemptionPriority; //设置抢占优先级uint8_t NVIC_IRQChannelSubPriority; //设置相应优先级FunctionalState NVIC_IRQChannelCmd; //使能中断
} NVIC_InitTypeDef;
2.2.2 中断使能寄存器组 ISER[8]
中断使能寄存器组:ISER[8]
作用:用来使能中断
32位寄存器,每个位控制一个中断的使能。STM32F40x只有82个可屏蔽中断,所以只使用了其中的ISER[O]~ISER[2]。
ISER[0]的bit0bit31分别对应中断031。ISER[1]的bit027对应中断3263; ISER[2]的bit017对应中断6481;
void NVIC Init(NVIC_ InitTypeDef* NVIC lnitStruct);
FunctionalState NVIC_IRQChannelCmd;
2.2.3 中断失能寄存器组 ICER[8]
作用:用来失能中断
32位寄存器,每个位控制一个中断的失能。STM32F40x 只有82个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]。
ICER[0]的bit0 ~ bit31分别对应中断0 ~ 31。ICER[1]的bit0 ~ 27对应中断32 ~ 63 ; a器ICER[3] 的bit0 ~ 17对应中断64 ~ 82 ;
用法和ISER一样
2.2.4 中断挂起/解挂控制寄存器 ISPR[8]和ICPR[8]
作用:用来挂起/解挂中断
static 8 INLINE void NVIC SetPendingIRQ(IRQn_ Type IRQn) ;
static 8 INLINE uint32 t NVIC GetPendinglRQ(IRQn_ Type IRQn) ;
static 8 INLINE void NVIC_ ClearPendingIRQ(IRQn Type IRQn)
2.2.5 中断激活标志位寄存器组 IABR[8]
作用:只读,通过它可以知道当前在执行的中断是哪一个
如果对应位为1,说明该中断正在执行。
static INLINE uint32_ t NVIC_ GetActive(IRQn Type IRQn)
2.3 中断参数初始化函数
void NVIC_ Init(NVIC_ InitTypeDef* NVIC_ InitStruct);
typedef struct
{uint8_ t NVIC_ IRQChannel; //设置中断通道uint8_ t NVIC_ IRQChannelPreemptionPriority;//设置抢占优先级uint8_ t NVIC_ IRQChannelSubPriority; //设置响应优先级FunctionalState NVIC_ IRQChannelCmd; //使能/使能
} NVIC_ InitTypeDef;
实例:
NVIC_ InitTypeDef NVIC_ InitStructure;
NVIC_ InitStructure.NVIC_ IRQChannel = USART1_ IRQn;// 串口1中断
NVIC_ InitStructure.NVIC_ IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_ InitStructure.NVIC_ IRQChannelSubPriority= 2;//子优先级位2
NVIC_ InitStructure.NVIC IRQChannelCmd = ENABL E;//IRQ通道使能
NVIC_ Init(&NVIC_ InitStructure); // 根据上面指定的参数初始化NVIC寄存器
三、NVIC总结
中断优先级设置步骤
第一步:系统运行后先设置中断优先级分组。调用函数:
void NVIC_ PriorityGroupConfig(uint32_ t NVIC_ PriorityGroup);
整个系统执行过程中,只设置一次中断分组。
第二步:针对每个中断,设置对应的抢占优先级和响应优先级
void NVIC Init(NVIC InitTypeDef* NVIC InitStruct);
第三步:如果需要挂起I解挂,查看中断当前激活状态,分别调用相关函数即可。
中断实验
相关文章:
stm32f407探索者开发板(十五)——NVIC中断优先级管理
文章目录零、前言一、NVIC中断优先级分组1.1 中断的管理方法1.2 抢占优先级&相应优先级的区别1.3 举例1.4 特别说明1.5 中断优先级分组函数二、NVIC中断优先级设置2.1 中断设置相关寄存器2.2 中断设置优先级2.2.1 中断优先级控制的寄存器组 IP[240]2.2.2 中断使能寄存器组 …...
【Azure 架构师学习笔记】-Azure Logic Apps(6)- Logic Apps调用ADF
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps(5)- 标准和使用量类型的区别 前言 Logic Apps 和 ADF 的搭配使用是常见的组合,它们可以互相弥补各自的不足和…...
python随机获取列表中某一元素
1、利用Python中的random模块中的choice方法 random.choice()可以从任何序列,比如list列表中,选取一个随机的元素返回,可以用于字符串、列表、元组等。 import random arr[1,2,3,4,5,6] print(random.choice(arr))2、利用Python中的random模…...
Nacos微服务笔记
Nacos安装Nacos 的 Github(Tags alibaba/nacos GitHub)下载我们所需的 Nacos 版本,可以选择 windows 或者 Linux。 进入官网,选择合适版本,tar.gz为linux版本,zip为windows版本。下载并解压 nacos-server…...
MAC文件误删怎么办?mac数据恢复,亲测很好用的方法
电脑文件误删,应该很多人都经历过。之前分享了很多关于Windows电脑文件误删如何恢复的方法,那么MAC电脑文件误删该怎么办?有什么好方法可以使得mac数据恢复回来吗?下面就给大家分享一些亲测好用的方法! 一、MAC电脑的文…...
机械革命z2黑苹果改造计划第二番-MacOS实用软件渗透工具
机械革命z2黑苹果改造计划第二番-实用软件 Mac实用工具 这是旧电脑改造计划的第二篇,就是安装一些常用软件和一些渗透测试工具,武装灵魂成为真正的生产力工具 首先推荐一个网站,www.mactools.app,这个软件里边有大多数常用的软…...
【LeetCode】每日一题(4)
目录 题目:1124. 表现良好的最长时间段 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:1124. 表现良好的最长时间…...
Linux内核移植:内核的启动过程分析、启动配置与rootfs必要文件
Linux内核移植:内核的启动过程、启动配置与rootfs必要文件一、启动过程二、启动配置(一)SysV初始化(二)systemd初始化三、rootfs中的启动配置文件1、inittab2、/etc/init.d/rcS 脚本3、fstab4、profile 文件5、其他文件…...
【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代
理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*21,右孩子的下标即为i*22 二叉树的常见遍历形式有:前序遍历、后序遍历、中序遍历和层序遍历 前序遍历:二…...
AXI-Stream 学习笔记
参考 https://wuzhikai.blog.csdn.net/article/details/121326701 https://zhuanlan.zhihu.com/p/152283168 AXI4 介绍 AXI4 是ARM公司提出的一种片内总线,描述了主从设备之间的数据传输方式。主要有AXI4_LITE、AXI4_FULL、AXI4_STREAM三种。 AXI4_LITE࿱…...
【Linux】程序进程地址空间
文章目录程序地址空间进程地址空间程序地址空间 在Linux下,这种地址叫做 虚拟地址, 我们在用C/C语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理 问:C/C程序地址空间是内存吗? -> 根本就不是内存! 是进程虚拟地址空间 堆栈…...
电压放大器在液滴微流控芯片的功能研究中的应用
实验名称:电压放大器在液滴微流控芯片的功能研究中的应用研究方向:微流控生物芯片测试目的:液滴微流控技术能够在微通道内实现液滴生成,精准控制生成液滴的尺寸以及生成频率。结合芯片结构设计和外部控制条件,可以对液…...
Linux操作系统学习(进程地址空间)
文章目录进程地址空间奇怪的现象什么是进程地址空间???虚拟地址是如何与物理内存联系的?页表是什么呢?为什么要有页表和地址空间,让进程直接访问内存不行吗?现象解释进程地址空间 在我们学习其…...
【排序】快速排序实现
目录 一、快速排序是什么? 二、左右指针法 1.实现原理 2.代码如下: 三、挖坑法 1.实现原理 2.代码如下: 四、前后指针法 1.实现原理 2.代码如下: 五、三数取中 1.实现思想 2.代码如下: 3.使用方法 总结…...
YOLOv5/v7 Flask Web 车牌识别 | YOLOv7 + EasyOCR 实现车牌识别
YOLOv7 Flask Web 车牌识别图片效果展示 本篇博文只包含源码以及使用方式,目前不同提供详细开发教程。 YOLOv7 Flask Web 车牌识别视频效果展示 YOLOv7 + EasyOCR 实现车牌识别 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更…...
【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码)
导语 哈喽大家好呀!我是每天疯狂赶代码的木木子吖~情人节快乐呀! 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 我们都知道,有很多经典的老照片…...
React源码分析(一)Fiber
前言 本次React源码参考版本为17.0.3。 React架构前世今生 查阅文档了解到, React16.x是个分水岭。 React15及之前 在16之前,React架构大致可以分为两层: Reconciler: 主要职责是对比查找更新前后的变化的组件;R…...
小樽 C++指针—— (壹) 指针变量
(壹) 指针变量 一、指针的概念与定义 二、给指针变量p赋值 三、指针变量的的、-运算 四、无类型指针 五、多重指针 C (壹) 指针变量 小明想把从李华家借来的书——《CCF中学生计算机程序设计》还给李华,但李华不在家,于是把书放到书架第3层的最右边…...
java 代码块 万字详解
概述 : 特点 : 格式 : 情景 : 细节 : 演示 : 英文 : //v,新版编辑器无手动添加目录的功能,PC端阅读建议通过侧边栏进行目录跳转;移动端建议用PC端阅读。😂一、概述 :代码块,也称为初始化块,属于类中的成员&…...
杂项-图片隐写
图片隐写的常见隐写方法: 三基色:RGB(Red Green Blue) 图片文件隐写 1.Firework 使用winhex打开文件时会看到文件头部中包含firework的标识,通过firework可以找到隐藏图片。 使用场景:查看隐写的图片文件…...
【高性价比】初学者入门吉他值得推荐购买的民谣单板吉他品牌—VEAZEN费森吉他
“在未知的世界里,我们是一群不疲不倦的行者,执念于真善美,热衷于事物的极致。我们抽丝剥茧,不断地打败自己,超越自己,我们无所畏惧终将成为巨人。”这是VEAZEN吉他官网首页上很明显的一段话,也…...
2023年浙江交安安全员考试题库及答案
百分百题库提供交安安全员考试试题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 50.根据《建设工程安全生产管理条例》第65条规定,施工单位有下列()行…...
【新】华为OD机试 - 跳格子(Python)
跳格子 题目 地上共有 N 个格子,你需要跳完地上所有的格子, 但是格子间是有强依赖关系的,跳完前一个格子后, 后续的格子才会被开启,格子间的依赖关系由多组 steps 数组给出, steps[0] 表示前一个格子, steps[1] 表示 steps[0] 可以开启的格子: 比如 [0,1] 表示从跳完第…...
乡村能做社区团购吗?怎么做?我走访调查后发现机会很大
乡村能做社区团购吗?怎么做?我走访调查后发现机会很大#深度触网 #社区团购 #乡村振兴##乡村旅游##县域经济##市场经济##农文旅产业振兴研究院#乡村旅游能带动农产品加工业、服务业、商贸业等相关联产业的发展 乡村能做社区团购吗?怎么做&…...
态路小课堂丨下一代数据中心100G接口第二篇——SFP-DD封装
100G光模块根据封装模式可分为QSFP28、CXP、CFP、CFP2、FCP4、DSFP和SFP-DD等。态路小课堂之前已经大量介绍了相关内容(。 态路小课堂丨下一代数据中心100G接口——DSFP态路小课堂丨100G解决方案-425G NRZ光模块态路小课堂丨什么是100G QSFP28单波光模块?…...
状态栏和导航栏高度获取
/*** 获取导航栏高度*/public static int getNavigationBarHeight(Context context){int navigationBarHeight 0;int resourceId context.getResources().getIdentifier("navigation_bar_height", "dimen", "android")if (resourceId > 0) {…...
插曲:第一桶金 1w 的来由
因为前天跟同事聊天,发现有个比较严重的认知,就是关于赚钱思维。 同事反馈说工作十来年,却没有接过私活,这里话分两头,有可能私 活钱少,但他给我的理由是:私活太麻烦,有时候不敢接&a…...
中国甲基异丁基甲醇行业头部企业市场占有率及排名调研报告
内容摘要 本文调研和分析全球甲基异丁基甲醇发展现状及未来趋势,核心内容如下: (1)全球市场总体规模,分别按销量和按收入进行了统计分析,历史数据2018-2022年,预测数据2023至2029年。 …...
streamlit自定义组件教程和组件开发环境配置
About create your own component: you can follow this tutorial streamlit tutorial 重要!以下步骤都是在教程的基础上更改的。这个教程做的很棒。 Component development environment configuration: 根据文章 https://streamlit-com…...
Windows CMD常用命令
目录 【打开CMD命令】 【网络测试命令】 ipconfig------查看本机网卡信息 ping------测试网络是否通畅 tracert------追踪路由,也可以用来查看网络连通性 telnet------查看目的主机ip的端口号是否开放 tcping------查看目的主机ip的端口号是否开放 【关于路…...
网站建设保障机制/交换友链要注意什么
职业数学家在民间大家好!这里是《职业数学家在民间》公众号的专栏【人人都能欣赏的数学证明】第四期。传播数学是我们的神圣使命,敬请扫描?关注我们!第一期:为什么有无限多个素数?第二期:为什么√2不等于分…...
如何查看网站是哪家公司做的/培训学校怎么招生
我已经到了秃顶几步之遥…我正在尝试运行一项服务,该服务将检查我工作中的服务器是否正在运行。应该每5分钟执行一次。我经历过TimerTask,ScheduledExecutorService,最后是Handler。他们都工作了好几个小时,除了一些不准确的地方外…...
wordpress编辑器移植/企业文化标语
zip: 压缩: zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>][-<压缩效率>][压缩文件][文件...][-i <范本样式>][-x <范本样式>] 解压: unzip [选项] 压缩文件名.zip 选项…...
企业网站建设发展历程/网络推广吧
今天晚上在用opnet进行仿真结果统计的时候,开始写哪个local ** 的名字时写错了,在仿真过后,才发现,再想去改这个名字的时候,发现改完之后再仿真的话,已经没有结果了。应该是跟我的改动有关吧,之…...
网站动态背景欣赏/免费注册个人网站不花钱
前言:在gitee上创建了一个项目,然后通过本地执行 git push origin master 报错: 提示:更新被拒绝,因为远程包含您所做的工作 提示:不要在本地使用。这通常是由另一个存储库推送引起的 提示:对于…...
网站关键词排名优化推广软件/西安网站建设方案优化
PMP考试难吗? 如果我说"只要好好看书就不难"这样的唯心之论,大家肯定会觉得我站着说话不腰疼。 但客观而言,考试的难度并不大,因为全部都是选择题,不需要大段大段地背诵答题模板,相比于国内的考…...