【STM32开发之寄存器版】(三)-详解NVIC中断

一、前言

STM32F103ZET6具备强大的中断控制能力,其嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理晚到的中断。NVIC主要具备以下特性:

  • 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);
  • 16个可编程的优先等级(使用了4位中断优先级);
  • 低延迟的异常和中断处理;
  • 电源管理控制;
  • 系统控制寄存器的实现;

二、NVIC相关寄存器介绍

NVIC主要包含以下寄存器组:

寄存器功能
ISER中断使能寄存器组
ICER中断除能寄存器组
ISPR中断挂起控制寄存器组
ICPR中断解挂控制寄存器组
IABR中断激活标志位寄存器组
IPR中断优先级控制寄存器组
STIR软件触发中断寄存器组
SCB_AIRCR应用中断和复位控制寄存器

STM32的NVIC控制器寄存器组看起来比较独特,普通的寄存器可以通过写0和写1实现使能和除能、挂起和解挂,但是NVIC的这些寄存器都是写1有效,写0无效的。因此才会出现“中断使能寄存器”与“中断除能寄存器”、“中断挂起控制寄存器”和“中断解挂控制寄存器”这样的独特寄存器对。 下面将对这些寄存器进行一一解析。 

2.1 ISER中断使能寄存器组

《STM32F10xxx Cortex-M3编程手册》对ISER寄存器的描述如下:

 

Cortex-M3内核支持 256 个中断,这里用 8 个 32 位寄存器(即8个ISER)来控制,每个位控制一个中断。但是STM32 的可屏蔽中断最多只有 68 个(互联型),所以就是三个(ISER[0~2]]),总共可以表示 96 个中断。而 STM32 只用了其中的前 68 位。ISER[0]的 bit0~31 分别对应中断0~31;ISER[1]的 bit0~32 对应中断 32~63;ISER[2]的 bit0~3 对应中断 64~67;这样总共 68 个中断就分别对应上了。 若使能某个中断,必须设置相应的 ISER 位为 1 具体某一位代表哪个中断,可以参考stm32f10x.h的172-477行。

2.2 ICER中断除能寄存器组

《STM32F10xxx Cortex-M3编程手册》对ICER寄存器的描述如下:

该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。若除能某个中断,必须设置相应的ICER位为1。

2.3 ISPR中断挂起控制寄存器组

《STM32F10xxx Cortex-M3编程手册》对ISPR寄存器的描述如下:

通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。

2.4 ICPR中断解挂控制寄存器组

《STM32F10xxx Cortex-M3编程手册》对ICPR寄存器的描述如下:

 通过置 1,可以将挂起的中断解挂。

2.5 IABR中断激活标志位寄存器组

《STM32F10xxx Cortex-M3编程手册》对IABR寄存器的描述如下:

如果为 1,则表示该位所对应的中断正在被执行这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零

2.6 IPR中断优先级控制寄存器组

《STM32F10xxx Cortex-M3编程手册》对IP寄存器的描述如下:

IPR是控制中断优先级的一个非常重要的寄存器,STM32 的中断分组与这个寄存器组密切相关。IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。而 STM32 只用到了其中的 68 个。IP[67]~IP[0]分别对应中断 67~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

2.7 STIR软件触发中断寄存器组

《STM32F10xxx Cortex-M3编程手册》对STIR寄存器的描述如下:

写入 STIR 以生成软件生成中断 (SGI)。需要写入的值是所需 SGI 的中断 ID,范围为 0-239。例如,值 0b00000011 指定中断 IRQ3。

2.8 SCB_AIRCR应用中断和复位控制寄存器

《STM32F10xxx Cortex-M3编程手册》对SCB_AIRCR寄存器的描述如下:

STM32将中断分为5个组,组0-4,该分组由AIRCR的[10:8]决定,最终影响到IPR的[7:4]位分配情况。如下所示:

AIRCR[10:8]IPR[7:4]分配结果
01110:40位抢占优先级,4位响应优先级
11101:31位抢占优先级,3位响应优先级
21012:22位抢占优先级,2位响应优先级
31003:13位抢占优先级,1位响应优先级
40114:04位抢占优先级,0位响应优先级

例:组设置为 2,那么此时所有的 68 个中断,每个中断的中断优先寄存器的高四位中的最高 2位是抢占优先级,低 2位是响应优先级。每个中断,你可以设置抢占优先级为 0~3,响应优先级为0-3。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。  

三、中断打断方式

STM32的中断按照如下约定进行相互打断:

  • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
  • 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

四、 程序实现

4.1 NVIC分组函数

NVIC分组函数位于SYSTEM/sys.c/MY_NVIC_PriorityGroupConfig()。值得注意的是,在对SCB_AIRCR寄存器写入之前,需要在高16位灌入密钥0X05FA,在改变其中10:8位时,不能更改其他位的数值。具体程序如下所示:

//设置NVIC分组
//NVIC_Group:NVIC分组 0~4 总共5组 		   
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)	 
{ 
	u32 temp,temp1;	  
	temp1=(~NVIC_Group)&0x07;//取后三位
	temp1<<=8;
	temp=SCB->AIRCR;  //读取先前的设置
	temp&=0X0000F8FF; //清空先前分组
	temp|=0X05FA0000; //写入钥匙
	temp|=temp1;	   
	SCB->AIRCR=temp;  //设置分组	    	  				   
}

4.2 NVIC初始化设置函数

NVIC初始化设置函数位于SYSTEM/sys.c/MY_NVIC_Init()。该函数主要通过ISER寄存器使能相应中断位,通过IPR寄存器设置响应优先级和抢断优先级。具体程序如下所示:

//设置NVIC 
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority       :响应优先级
//NVIC_Channel           :中断编号
//NVIC_Group             :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先	   
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)	 
{ 
	u32 temp;	
	MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
	temp=NVIC_PreemptionPriority<<(4-NVIC_Group);	  
	temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
	temp&=0xf;								//取低四位  
	NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK) 
	NVIC->IP[NVIC_Channel]|=temp<<4;		//设置响应优先级和抢断优先级   	    	  				   
} 

有以下两点务必注意:

  • 注意优先级不能超过设定的组的范围,否则会有意想不到的错误!
  • 一个系统代码里面,所有的中断分组都要统一! 

五、STM32F103ZET6中断向量表

来源:《STM32中文参考手册_V10》表55

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/887400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典文献阅读之--WiROS(用于机器人的WiFi感知工具箱)

0. 简介 近期的许多研究探索了使用基于WiFi的感知技术来改善SLAM&#xff08;同时定位与地图构建&#xff09;、机器人操控或探索。此外&#xff0c;WiFi的广泛可用性使其成为最具优势的射频信号。但WiFi传感器缺乏一个准确、易处理、多功能的工具箱&#xff0c;这限制了它们与…

VUE2常见问题以及解决方案汇总(不断更新中)

解决vue项目中 el-table 的 row-click 事件与行内点击事件冲突&#xff0c;点击事件不生效&#xff08;表格行点击事件和行内元素点击事件冲突&#xff09;需要阻止事件冒泡 问题描述 1.点击列的编辑按钮&#xff0c;会触发按钮本身事件&#xff0c;同时会触发行点击事件 2.点…

SaaS 应用如何助长网络犯罪

过去十年&#xff0c;软件即服务 (SaaS)的采用呈爆炸式增长&#xff0c;彻底改变了我们的工作方式。 从电子邮件平台到通信和协作应用程序&#xff0c;再到文件存储和共享服务&#xff0c;这些工具有望为我们的日常工作生活带来更大的灵活性和效率&#xff0c;尤其是在当今的远…

Linux环境基础开发工具使用(2)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(2) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. Li…

VS开发 - 静态编译和动态编译的基础实践与混用

目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件&#xff08;从VS2015起&#xff09; 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库&#xff08;Runtime Library&#xff09;就是WINDOWS系统…

防反接电路设计

方案1 串联二极管&#xff0c; 优点&#xff1a;成本低、设计简单 缺点&#xff1a;损耗大&#xff0c;P ui 方案2 串联自恢复保险丝 当电源反接的时候&#xff0c;D4导通&#xff0c;F2超过跳闸带你留&#xff0c;就会断开&#xff0c;从而保护了后级电路 方案3 H桥电路…

解决DHCP服务异常导致设备无法获取IP地址的方法

DHCP在网络环境中会自动为网络中的设备分配IP地址和其他关键网络参数&#xff0c;可以简化网络配置过程。但是&#xff0c;如果DHCP服务出现异常时&#xff0c;设备可能无法正常获取IP地址&#xff0c;会影响到网络通信。 本文讲述一些办法可以有效解决DHCP服务异常导致设备无法…

No.2 笔记 | 网络安全攻防:PC、CS工具与移动应用分析

引言 在当今数字化时代,网络安全已成为每个人都应该关注的重要话题。本文将总结一次关于网络安全攻防技术的学习内容,涵盖PC端和移动端的恶意程序利用,以及强大的渗透测试工具Cobalt Strike的使用。通过学习这些内容,我们不仅能够了解攻击者的手法,更能提高自身的安全意识和防…

Java编码方式:Base64编码与解码

1、Base64 算法介绍 Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。它主要用于在不支持二进制数据的场合&#xff08;如电子邮件、URL、文件系统名等&#xff09;传输二进制数据。严格来说 Base64 并不是一种加密/解密算法&#xff0c;而是一种编码方式。Bas…

基于Springboot+Android的的电子书阅读器系统的设计与实现(含源码+数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

二分查找一>山脉数组的峰顶索引

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; public int peakIndexInMountainArray(int[] arr) {int left 1, right arr.length-2;while(left < right) {int mid left (right-left1) / 2;if(arr[mid] > arr[mid-1]) left mid;else right mid-1;}ret…

openpnp - 视觉原点的位置要离设备的软限制点远一点

文章目录 openpnp - 视觉原点的位置要离设备的软限制点远一点笔记备注END openpnp - 视觉原点的位置要离设备的软限制点远一点 笔记 最开始的视觉原点&#xff0c;是在设备X 0, Y 0的附近位置&#xff0c;粘了一块20x20x20的铝块&#xff0c;铝块上面贴着用黑塑料皮打印的1…

esp8266 at指令链接wifi时一直connect disconnest

那是你的连接wifi的名字密码有误或者热点有问题&#xff0c;看看热点是不是把设备拉入黑名单或者设置为5G或者连了校园网或者设置了最多链接设备

IntelliJ IDEA 2024.2 新特性概览

文章目录 1、重点特性:1.1 改进的 Spring Data JPA 支持1.2 改进的 cron 表达式支持1.3 使用 GraalJS 作为 HTTP 客户端的执行引擎1.4 更快的编码时间1.5 K2 模式下的 Kotlin 性能和稳定性改进 2、用户体验2.1 改进的全行代码补全2.2 新 UI 成为所有用户的默认界面2.3 Search E…

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…

设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、原型模式2、原型模式的使用场景3、优点4、缺点5、主要角色6、代码示例7、总结题外话关于使用序列化实现深拷贝 设计模式概述 创建型模式&#xff1a;工厂方法、抽象方法、建造者、原型、单例。 结构型模式有&#xff1a;适配器、桥接、组合、装饰器、…

深度学习中的结构化概率模型 - 结构化概率模型的深度学习方法篇

序言 在深度学习的广阔领域中&#xff0c;结构化概率模型&#xff08; Structured Probabilistic Model \text{Structured Probabilistic Model} Structured Probabilistic Model&#xff09;扮演着至关重要的角色。这类模型利用图论中的图结构来表示概率分布中随机变量之间的…

Spring Boot ⽇志

目录 1.⽇志使⽤ 2.⽇志级别 3.⽇志配置 3.1配置⽇志级别 3.2⽇志持久化 3.3配置⽇志⽂件分割 4.更简单的⽇志输出 1.⽇志使⽤ 在使用之前我们先来了解一下为什么要使用&#xff1f; ⽇志的⽤途 1.系统监控 我们可以通过⽇志记录这个系统的运⾏状态&#xff0c;对数…

20款奔驰CLS300升级原厂抬头显示HUD 23P智能辅助驾驶 触摸屏人机交互系统

以下是为您生成的一份关于 18 款奔驰 CLS 老款改新款的改装文案&#xff1a; 18 款奔驰 CLS 老款改新款&#xff1a;科技升级&#xff0c;畅享极致驾驶体验 在汽车改装的世界里&#xff0c;每一次的升级都是对卓越的追求。今天&#xff0c;让我们一同探索 18 款奔驰 CLS 老款改…

在登陆功能中添加Redis缓存

目录 基于Redis实现短信登录 实现流程图 实现代码 解决登录状态刷新问题 初始方案思路&#xff1a; 实现代码 发送验证码 登陆实现 如果是新用户则自动创建 运行测试 基于Redis实现短信登录 实现流程图 实现代码 Overridepublic Result login(LoginFormDTO loginForm…