STM32F4x之中断一

一、中断简介

中断概念:程序在运行过程中发生了外部或内部事件时,导致中断了正在执行的程序,让CPU转到外部或内部事件中去执行。

中断的作用:大量节约CPU资源,提高程序的效率,即避免重要事件被错过。
中断入口:函数名----中断服务函数名,为中断服务的函数名。
思考:主函数和中断服务函数的关系?
主函数和中断服务函数之间是相同级别(并行)的而不是从属关系。即执行中断服务函数其实是抢占CPU的时间片,而不是主函数调用中断服务函数。所以中断服务函数不是写在主函数中。
中断优先级:中断是为了处理紧急情况的机制,为了描述多个中断同时发生哪一个中断优先执行的顺序。
(1)优先级表示:优先级别用数值来表示,数值越小,优先级越高。
(2)优先级分类:每个中断优先级可以分为硬件(自然)和软件两种。
(3)硬件优先级(自然优先级):中断自带的优先级编号。
(4)软件优先级:就是可以由程序员自行修改的优先级。
(5)中断优先级的意义和目的:为了区分当多个中断同时到来哪一个中断优先执行。
每一个中断都具有3种类型的优先级:软件优先级(抢占优先级,响应优先级),自然(硬件)优先级。
(1)    抢占优先级:当其中一个中断正在执行时,其他(多个中断都发生)的中断是否可以打断正在执行的中断;
概念补充:
中断嵌套:一个中断在执行的过程中又出现了一个优先级更高的新中断。

中断嵌套目的:处理更紧急的事情。中断嵌套中需要将嵌套的中断优先级设置的更高。因为高优先级的任务可以打断或抢占低优先级的任务。(该抢占只发生在抢占优先级不一样的模情况下)
(2)    响应优先级:决定多个抢占优先级都相同的中断同时到来的时候,CPU使用权归谁的问题。
(3)    自然优先级(硬件固定):按照自带的优先级编号(硬件固定)在抢占和响应优先级相同的情况下决定先执行哪个中断;
问题 1:事件A抢占优先级为2,响应为3,事件B抢占3响应3同时发生先执行?
答:A
问题 2:事件A抢占优先级为2,响应为3,事件B抢占2响应4同时发生先执行?
答:A
问题 3: 如果在处理中断 B (抢占1,响应4)的过程中, 发生了中断 A(抢占0,响应3), 发生了什么事情?
答:中断嵌套
问题4:事件A抢占优先级为2,响应为2,事件B抢占2响应2同时发生先执行?
答:比较自然优先级 
总结:
1.中断嵌套问题只有抢占优先级不同时才会出现。
2. 同时多个异常事件发生时, 先看抢占优先级, 如果一样再看响应优先级, 如果还一样, 再看自然优先级(硬件)。
优先级大小:抢占优先级>响应优先级>自然优先级
3. 每个中断源的抢占优先级和响应优先级由用户决定(软件设置),而自然优先级已经被硬件固定, 不可更改。

二、中断介绍

在STM32内核里有一个管理中断的模块---NVIC控制器(嵌套向量中断控制器) 是M4内核中专门负责处理中断相关事物的一个机构。
因为NVIC属于内核管理具体内核手册查看,其结构如下:

2、NVIC控制器中断来源

NVIC控制器内部结构如上图所示,由上图可以看出NVIC控制器所管理的的中断来源包括:GPIO口外部中断,片上外设,系统核心,SysTick,非掩蔽中断等。
NVIC控制器总共提供了255个中断入口。
来自系统的中断入口共15个(内核固定的)

注意:以上15个是内核级中断NVIC控制器必须响应且不能够被打断。

来自片上外设或IO口中断从16到255总共240个,如下图所示:

注意:该部分中断是属于内核之外的且由芯片的生产者决定。

STM32-NVIC控制器中断来源如下:

总共92个中断源10个系统中断,82个外设中断。

STM32 的 NVIC 是 Cortex-M4 的 NVIC 的一个子集,因为各个芯片厂商在设计芯片的时候会对 Cortex-M4 内核里面的 NVIC 进行裁剪,把不需要的部分去掉内核之外的中断也是芯片生产者更具使用要求来设置的。

三、NVIC中断管理方式

NVIC管理中断的机制
设置软件优先级的范围和大小  
在NVIC里面,系统会给每一个中断源都分配一个8位寄存器来存放它的优先级(抢占优先级和响应优先级)。在这8位寄存器里面,一部分用于存放抢占优先级,另一部分存放响应优先级。即响应+抢占=8位。

如下图所示ARM将内核中的NVIC的抢占和响应的优先级分组了:

Cortex-M4-NVIC 中得知抢占优先级+响应优先级最多占八位。
抢占优先级有128级别,响应优先级有256级别。
实际芯片在使用时用不了那么多,所以ARM公司规定:不是所有的芯片都要使用8位来设置优先级,可以根据实际需要选择3bit~ 8bit使用,而ST公司使用4位即如下图所示:

由上表得知STM32优先级使用4~7共4个位控制且分组范围:3~7,该值是实际写入分组寄存器的值。

写入寄存器的值

占优先级位数

响应优先级位数

抢占优先级允许的设置范围

响应优先级允许的设置范围

3

74

【无】

0 ~ 15

0

4

【7:5】

【7】

0 ~ 7

0 ~ 1

5

76

76

0 ~3

0 ~3

6

【7】

【7:5】

0 ~ 1

0 ~ 7

7

【无】

74

0

0 ~ 15

设置分组

优先级分组由NVIC控制器管理,设置优先级分组就是要找到NVIC相关寄存器。而NVIC是属于系统管理的,所以找到SCB(系统控制块),只要往SCB->AIRCR的PRIGROUP三个位中写入不同值即可决定分组如下表:

如何设置一个中断的抢占优先级和响应优先级呢??
答案: NVIC控制器是通过中断优先级分组,从而确定抢占优先级位数和响应优先级的位数,然后设置各个中断的优先级。
四、NVIC控制器相关函数及配置方法

见CORE.CM4.h文件1498行

设置分组

函数原型:void NVIC_SetPriorityGrouping (uint32_t PriorityGroup)

函数功能:设置优先级的分组

函数形参:分组值(3~7);

函数返回值:无

备注:组编号0~4

使用方法:NVIC_SetPriorityGrouping(5);

NVIC_SetPriorityGrouping(5);//抢占优先级:0~3;响应优先级:0~3

注意:整个项目中,分组形式只能是一种 (优先级分组由寄存器中的三个bit决定,重新设置分组,会改变这个寄存器的值,从而会影响到抢占和响应的范围),可以改变抢占和响应优先级。

注意:分组值在一个项目中只能是一种。一旦确定就不能够改变。

合成优先级

函数原型:uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t Sub priority)

函数功能:将分组&抢占优先级&响应优先级合成最终的优先级结果

函数形参:分组值(3~7);抢占优先级:(不确定,通过优先级分组+程序员自己定义);响应优先级:(不确定,通过优先级分组+程序员自己定义)

函数返回值:返回一个合成的结果

使用方法:Priority = NVIC_EncodePriority(7 – 2, 2, 1);

设置中断优先级

函数原型:void NVIC_SetPriority (IRQn_Type IRQn, uint32_t priority)

函数功能:设置某一个中断的优先级

函数形参:中断的编号;中断优先级(步骤2中合成的优先级)

函数返回值:无

使用方法:示例:USART1

NVIC_SetPriority (USART1_IRQn, Priority);

中断编号见下图:

使能中断

函数原型:void NVIC_EnableIRQ (IRQn_Type IRQn)

函数功能:开启某一个中断的NVIC控制器开关。(当前给某一个授权,可以产生中断)

函数形参:中断的编号;

函数返回值:无

使用方法:NVIC_EnableIRQ (USART1_IRQn);

NVIC中对于内核之外的中断默认中断是关闭的,想要使用必须手动打开。

示例:
NVIC_SetPriorityGrouping (7-2);//抢占2响应4-2
U32 prioity = NVIC_EncodePriority (7-2, 2, 2);
NVIC_SetPriority(USART1_IRQn, prioity);
NVIC_EnableIRQ (USART1_IRQn);//核心级中断使能

打开外设的中断开关位

总结:真正的使用一个中断需要以下步骤:
1设置优先级分组---决定抢占优先级和响应优先级的可设置范围。
2设置该中断的抢占优先级和响应优先级。
3开启核心级中断使能;(NVIC中打开某个外设的开关)。
4开启模块级中断使能(将外设内部的中断打开)。
5.编写中断服务函数(发生中断时CPU会跑到中断中,在中断里面执行对应的操作)。
5.1如何查找中断源
在STM32中断源在stm32f4xx.h文件中

如何查找中断服务函数名
在STM32中,中断服务函数名在相应的汇编文件中有。STM32F40VGT6 startup_stm32f40_41xxx.s

上面的中断地址名字和下面的中断入口地址是一一对应的。

注意事项
(1)中断服务函数名尽量用复制,不要自己写,因为只要写错一个字母,这个函数就变成普通函数了。
(2)如果中断服务函数是公共入口即如果是全局中断,进入到中断服务函数后先要查询是哪种中断
(3)中断服务函数应该尽量简短,一般是做一些标识,不要在中断中做延时之类的占用CPU很长时间的工作。----快进快出
(4)中断服务函数不会被任何一个函数调用,当中断条件满足后,NVIC控制把CPU拉到中断服务函数中执行。
所以:正常的写法是:void  中断服务函数(void)

(5)中断服务函数中尽量不要使用printf打印函数(很消耗时间)
(6)中断设置错误会导致程序发生异常。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用TypeScript 和 jsdom 库实现自动化抓取数据

以下是一个使用 TypeScript 和 jsdom 库的下载器程序,用于下载zhihu的内容。此程序使用了 duoip.cn/get_proxy 这段代码。 import { JSDOM } from jsdom; import { getProxy } from https://www.duoip.cn/get_proxy;const zhihuUrl https://www.zhihu.com;(async (…

NFT Insider112:The Sandbox聘请Apple高管担任其首席内容官,YGG 将在菲律宾举办Web3游戏峰会

引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#…

Qt扫盲-QTextCodec理论总结

QTextCodec理论总结 一、概述二、编码支持三、使用四、创建自己的编解码器类 一、概述 QTextCodec 是Qt提供的一个管理字符串编码的功能,他可以在不同编码方式中来回转换,在文件读取的时候、格式编码转换的时候用处很大。Qt使用Unicode 编码来存储、绘制…

Aocoda-RC F405V2 FC(STM32F405RGT6 v.s. AT32F435RGT7) IO Definitions

[TOC](Aocoda-RC F405V2 FC(STM32F405RGT6 v.s. AT32F435RGT7) IO Definitions) 1. 源由 Aocoda-RC F405V2飞控支持betaflight/inav/Ardupilot固件,是一款固件兼容性非常不错的开源硬件。 之前我们对比过STM32F405RGT6 v.s. AT32F435RGT7 Comparison for Flight …

java中的容器(集合),HashMap底层原理,ArrayList、LinkedList、Vector区别,hashMap加载因子0.75原因

一、java中的容器 集合主要分为Collection和Map两大接口;Collection集合的子接口有List、Set;List集合的实现类有ArrayList底层是数组、LinkedList底层是双向非循环列表、Vector;Set集合的实现类有HashSet、TreeSet;Map集合的实现…

freeipa server副本同步中断,两主节点数据不一致

/var/log/messages 和/var/log/dirsrv/slapd-testhadoop-COM 日志都出现以下日志: If replication stops, the consumer may need to be reinitialized. [27/Jun/2023:05:15:09.469361922 0800] - ERR - NSMMReplicationPlugin - changelog program - repl_plugin_name_cl - a…

使用Axure RP和内网穿透技术制作静态站点并实现公网访问

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

某全球领先的芯片供应商:优化数据跨网交换流程,提高安全管控能力

1、客户介绍 某全球领先的芯片供应商,成立于2005年,总部设于北京,在国内上海、深圳、合肥等地及国外多个国家和地区均设有分支机构和办事处,致力于为客户提供更优质、便捷的服务。 2、建设背景 该公司基于网络安全管理的需求&am…

PCA降维可视化

二维 import pandas as pd import warnings warnings.filterwarnings("ignore")df pd.read_csv(data/data.csv).dropna() features df.columns[:-1] X, y df[features], df[label]from sklearn.preprocessing import MinMaxScaler # 创建MinMaxScaler对象 scaler…

接口测试 Jmeter 接口测试 —— 请求 Headers 与传参方式

一、 背景: 在使用 Jmeter 进行接口测试时,有些小伙伴不知道 Headers 和请求参数 (Parameters,Body Data) 的联系,本文主要讲 Content-Type 为 application/x-www-form-urlencoded 和 application/json 的场景。 1、使用 Parame…

【ROS 2 基础-常用工具】-7 Rviz仿真机器人

所有内容请查看:博客学习目录_Howe_xixi的博客-CSDN博客

OpenLDAP LDIF详解

手把手一步步搭建LDAP服务器并加域 有必要理解的概念LDAPWindows Active Directory 服务器配置安装 OpenLDAP自定义安装修改对象(用户和分组等)修改olcSuffix 和 olcRootDN 属性增加olcRootPW 属性修改olcAccess属性验证新属性值 添加对象(用…

线性代数-Python-01:向量的基本运算 - 手写Vector及numpy的基本用法

文章目录 一、代码仓库二、向量的基本运算2.1 加法2.2 数量乘法2.3 向量运算的基本性质2.4 零向量2.5 向量的长度2.6 单位向量2.7 点乘/内积:两个向量的乘法 --答案是一个标量 三、手写Vector代码3.1 在控制台测试__repr__和__str__方法3.2 创建实例测试代码3.3 完整…

sql中的group by 举例子数据库日期带汉字转换2023年10月18天

sql中的group by 举例子 sql中 group by多个字段,对所有字段做group by_group by 多个字段_Foools的博客-CSDN博客 【精选】玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!_sql多个分组查询-CSDN博客 select to_char…

【PACS系统源码】与医院HIS系统双向数据交换,实现医学影像集成与影像后处理功能

​医院医学影像PACS系统源码,集成三维影像后处理功能,包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大,代码完整。 PACS系统与医院HIS实现双向数据交换&#xff0c…

语音芯片KT142C两种音频输出方式PWM和DAC的区别

目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片,输出方式,无外乎两种,即dac输出,或者PWM输出 其中dac的输出,一般应用场景都是外挂功放芯片,实现声音的放大,比如常用的音箱…

【常用图像增强技术,Python-opencv】

文章目录 常用图像增强技术调整大小灰度变换标准化随机旋转中心剪切随机裁剪高斯模糊亮度、对比度和饱和度调节水平翻转垂直翻转高斯噪声随机块中心区域 常用图像增强技术 图像增强技术是常用于数据增强的方法,可以帮助增加数据集中图像的多样性,提高深…

ICMPv6与NDP

1. ICMPv6简介 ICMP概述 Internet控制消息协议ICMP (Internet Control Message Protocol)是IP协议的辅助协议。 ICMP协议用来在网络设备间传递各种差错和控制信息,对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。 ICMP差错检查 ICMP …

【Ant Design Table + React】表格列伸缩实现

需求背景:需要实现Antd Table 组件的列伸缩,宽度可以拖拽 在Antd 3.x 的版本中是保留的列伸缩的Demo例子的: 借助 react-resizable 可以实现伸缩列。 # npm 安装 npm install react-resizable --save# yarn 安装 yarn add react-resizable参…

使用Simple JWT提供认证服务(详细介绍access_token和refresh_token的使用)

文章目录 基本概念JSON Web Token(JWT)Simple JWT 主要用途Cookie、Session、Token的区别CookieSessionToken Token续签access_token 和 refresh_token时效设置 基本概念 JSON Web Token(JWT) JSON Web Token(JWT&am…