STM32基础--NVIC中断控制器

一、NVIC是什么?

NVIC是一种中断控制器。当一个中断正在处理时,另一个更高优先级的中断可以打断当前中断的执行,并立即得到处理。这种机制使得处理器在高速运行的同时,能够及时响应不同优先级的中断请求。

二、有哪些优先级?(只有抢占优先级才会发生中断嵌套!!

抢占优先级: 抢占优先级是指中断的打断优先级,抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
响应优先级: 响应优先级是指中断的响应顺序,响应优先级只有在抢占优先级相同的情况下才有意义。当抢占优先级相同时,俩个中断同时发生,响应优先级高的中断先响应。
自然优先级: 按照自带的优先级编号(硬件固定)在抢占和响应优先级相同的情况下决定先执行哪个中断,数字越小级别越高。这个是由厂家设计好的。
每个中断源的抢占优先级和响应优先级由用户决定(软件设置),而自然优先级已经被硬件固定, 不可更改。优先级越高其对应的值越低。数字越小,优先级越高。

三、什么是中断嵌套?

答:通俗来讲就是停止当前正在进行的任务去执行抢占优先级更高的中断任务。
例如:A的抢占优先级为0,B的抢占优先级为1。则当两个中断请求同时发生时,先执行抢占优先级高的A。但是当CPU正处理B时发生了A的中断请求,则停止执行B,先去执行A的中断,当执行完A中断后再去执行剩下的B程序。这就是中断嵌套。

四、优先级的优先等级(序号越低,优先级越高)

(1)优先级大小:抢占优先级>响应优先级>自然优先级。
(2)抢占优先级相同,响应优先级不同,则先处理响应优先级高的。但是响应优先级没有中断嵌套。
例:如果A的抢占优先级为0,B的抢占优先级也为0。A的响应优先级为0,B的响应优先级为1。则两个同时发生中断请求时,在抢占优先级相同时先处理响应优先级高的A。但是如果CPU正在处理B时发生了A的中断请求,则继续执行B,当B完成后再执行A。因为响应优先级不会发生中断嵌套。
(3)如果抢占优先级和响应优先级都相同,则比较它们的硬件中断编号(自然优先级),中断编号越小,优先级越高。(硬件中断编号从中断向量表中查看)

五、优先级分组

Core-M4内核最多支持256级的可编程优先级。用8位来表示优先级级别,,优先级级别分为8组,分别是组0~组7。但是ST公司设计STM32F407ZGT6时,为了精简设计,只用了16 个可编程优先级(使用了 高四位4 位来设置中断优先级,设置低四位的值是无效的)。所以不同的芯片优先级分组会有不同。

以STM32F407ZGT6为例:

分组配置寄存器SCB->AIRCR。
由 3bit ( AIRCR[10:8] ) 控制抢占优先级与响应优先级分别占几位。
由 4bit ( IP bit[7:4] ) 控制不同的优先级决定中断发生的先后。
在这里插入图片描述

IP bit[7:0]:
在这里插入图片描述

STM32的中断优先级使用4~7共4个位控制。抢占优先级占2位有4种选择,响应优先级占2位有4种选择,故中断共可配置16种优先级。
例如:要配置2位抢占优先级,2位响应优先级,就需先配置 寄存器AIRCR[10:8]的数值为101。
注意:一般情况下,系统代码执行过程中,只设置一次中断优先级分组,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。如果设置了多次,则以最后一次为准。

六、优先级设置示例

例如在同一工程项目中有TIM3_IRQn、USART1_IRQn。优先级配置如下(可根据自己目的修改)。
优先级分组设置(初始化):

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组,一般在初始化中进行

如当我们选择优先级分组为2时,则有2个位决定抢占优先级,2个位决定响应优先级。抢占优先级两个位有4种选择值:00、01、10、11。分别是0~3(不能超过,除非先修改优先级组)。响应优先级同理。
TIM3_IRQn优先级设置:

	NVIC_InitTypeDef NVIC_InitStructure; //结构体重命名
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //选择通道(要中断的对象)
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //设置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //设置响应优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
	NVIC_Init(&NVIC_InitStructure);  //根据以上参数初始化NVIC寄存器

USART1_IRQn优先级设置:

	NVIC_InitTypeDef NVIC_InitStructure; //结构体重命名
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器**

当配置好优先级后,当中断响应时就可以根据优先级响应规则进行处理。规则如上文标题四中所示。

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

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

相关文章

ElasticSearch7.x - HTTP 操作 - 查询文档操作

查询索引下的所有文档 http://192.168.254.101:9200/shopping/_search 条件查询 请求路径上添加条件:http://192.168.254.101:9200/shopping/_search?q=category:小米 请求体上添加条件:http://192.168.254.101:9200/shopping/_search 请求体内容 {"query" :{&qu…

Character.AI:产品优势和商业壁垒在哪里?

OpenAI DevDay 上发布的 GPTS 和 Assistants API 功能,过去几个月里流行的GPT 套壳应用已经在某种程度上正式宣告「死亡」。有些观点认为这次的DevDay杀死了很多新的创业公司,甚至像Character.Ai 这样的应用也可能被取代。 趁此机会重新来梳理下Characte…

GEE ——errors & debuggings (2023GEE峰会总结)

简介: 在gee中有三种错误,一种就是系统错误,也就是我们看到的会在JavaScript code editor中出现的错误,也就是在程序还没有启动之前就会提示的错误,而客户端错误则主要是会提示一些在代码过程中的错误,比如…

粤嵌实训医疗项目--day06(Vue + SpringBoot)

往期回顾 粤嵌实训医疗项目(小组开发)--day05-CSDN博客粤嵌实训医疗项目--day04(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目--day03(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目day02(Vue SpringBoot)-CS…

【数据结构】堆详解!(图解+源码)

🎥 屿小夏 : 个人主页 🔥个人专栏 : 数据结构解析 🌄 莫道桑榆晚,为霞尚满天! 文章目录 🌤️前言🌤️堆的理论☁️二叉树的顺序存储☁️堆的概念 🌤️堆的实现…

Java类和对象(续)

书接上回我们已经学完了对象的初始化,今天的内容更加精彩。 1.封装 面向对象程序的三大特征:封装,继承,多态。 本章主要也是要研究封装,简单来说就是套壳屏蔽细节。 封装的概念: 封装:将数据和…

Redis系列-Redis安装与配置【2】

目录 Redis系列-Redis安装与配置【2】二、Redis安装与配置Redis安装步骤windowDocker安装 Redis配置文件说明Redis启动和停止命令启动Redis服务打开Redis客户端进行连接 使用可视化工具Another Redis Desktop ManagerRedisInsight 个人主页: 【⭐️个人主页】 需要您的【&#…

element-plus 循环生成的多个input输入框如何校验

我们知道正常写出来的input输入框如何校验&#xff0c;那循环出来的输入框应该怎么校验咧&#xff0c;这里就教大家如何的去校验通过循环出来的输入框。 首先先看单个的input如何做校验 <template><div><el-form ref"ruleFormRef" :model"ruleF…

通过海康私有协议Ehome/ISUP协议将海康摄像头、录像机等设备统一接入到LiveNVR Web流媒体平台实现统一汇聚及Web播放等的配置说明,

LiveNVR海康摄像头海康NVR通过EHOME协议ISUP协议接入支持转GB28181级联 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关问题4.1…

K8S容器内安装cur/telnet命令(Alpine Linux离线环境安装curl/telnet或其他工具)

背景 需求&#xff1a; 微服务的基础是镜像&#xff0c;通常在最小化的Linux镜像中安装jdk&#xff0c;然后运行编译好的java程序。将镜像运行到K8S上就得到了微服务Pod&#xff0c;Pod通常使用安装K8S时配置的私有网段&#xff0c;与宿主机不同。很多时候需要排查从Pod网段内…

Hadoop学习总结(使用Java API操作HDFS)

使用Java API操作HDFS&#xff0c;是在安装和配置Maven、IDEA中配置Maven成功情况下进行的&#xff0c;如果Maven安装和配置不完全将不能进行Java API操作HDFS。 由于Hadoop是使用Java语言编写的&#xff0c;因此可以使用Java API操作Hadoop文件系统。使用HDFS提供的Java API构…

Delphi 12 重返雅典 (RAD Studio 12)

RAD Studio 12 的新功能&#xff1a; 以最新的平台版本为目标&#xff01; RAD Studio 12 提供对 iOS 17&#xff08;仅适用于 Delphi&#xff09;、Android 14 和 macOS Sonoma 的官方支持。RAD Studio 12 还支持 Ubuntu 22 LTS 和 Windows Server 2022。 Delphi 源代码的多…

小黑子—springMVC:第一章 请求处理与响应数据

springMVC入门1.0 1、小黑子的springMVC基础1.1 SpringMVC概述1.2 SpringMVC快速入门1.3 Controller中直接注入spring中维护的Bean1.4 SpringMVC关键组件浅析 2、SpringMVC的请求处理2.1 请求映射路径配置2.2 请求数据的接收2.2.1 键值对方式接收数据2.2.1 - I RquestParam属性…

华为云Ascend310服务器使用

使用华为云服务器 cpu: 16vCPUs Kunpeng 920 内存&#xff1a;16GiB gpu&#xff1a;4* HUAWEI Ascend 310 cann: 20.1.rc1 操作系统&#xff1a;Ubuntu aarch64目的 使用该服务器进行docker镜像编译&#xff0c;测试模型。 已知生产环境&#xff1a;mindx版本为3.0.rc3&a…

有符号数是如何判断正负符号位的?

文章目录 有符号数是如何判断正负符号位的&#xff1f; 运行结果&#xff1a; 有符号数是如何判断正负符号位的&#xff1f; #include<stdio.h> int main() {int input_data 0;printf("Please input the data ! \n");scanf("%d",&input_data);…

【CASS精品教程】cass3d基于osgb根据点、线、面提取高程,生成等高线

本文讲解cass3d 11.0基于osgb三维模型,根据点、线、面提取高程点,并将高程点保存到文件。cass11.0下载与安装请点击。 一、加载osgb模型 打开cass11.0软件,打开3d窗口,加载osgb三维模型,如下图所示。 二、点提取 CASS3d中提取点高程的快捷键是G,输入G命令,回车。 提示…

5 Paimon数据湖之表数据查询详解

更多Paimon数据湖内容请关注&#xff1a;https://edu.51cto.com/course/35051.html 虽然前面我们已经讲过如何查询Paimon表中的数据了&#xff0c;但是有一些细节的东西还需要详细分析一下。 首先是针对Paimon中系统表的查询&#xff0c;例如snapshots\schemas\options等等这些…

C# 同步异步大白话

同步异步大白话 背景 任务异步编程模型&#xff08;TAP&#xff09;提供了对异步代码的抽象。您可以像往常一样&#xff0c;将代码编写为一系列语句。您可以阅读该代码&#xff0c;就好像每条语句都在下一条语句开始之前完成一样。编译器执行许多转换&#xff0c;因为其中一些…

log4j CVE-2021-44228 RCE漏洞复现

一、漏洞特征 Apache Log4j 是 Apache 的一个开源项目&#xff0c;Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架&#xff0c;并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等&#xff0c;通过定义每一条日志信息的…

双编码器构建机器人零力拖动/导纳控制思路

前言 这篇博客主要记录昨日与实验室大佬针对UR5机器人拖动示教功能实现的思路。由于本人并非主攻力控方面。直到昨天在做实验的时候&#xff0c;与力控组的大佬讨论过后才了解UR机器人实现导纳控制的思路。 关于导纳控制/零力拖动 导纳控制与阻抗控制单从字面去理解很容易记…