STM32F4x之中断一

news2024/12/28 19:41:28

一、中断简介

中断概念:程序在运行过程中发生了外部或内部事件时,导致中断了正在执行的程序,让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.coloradmin.cn/o/1117735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度强化学习 第 5 章 SARSA 算法

上一章介绍了 Q 学习的表格形式和神经网络形式(即 DQN)。 TD 算法是一大类算法的总称。上一章用的 Q 学习是一种 TD 算法, Q 学习的目的是学习最优动作价值函数 Q ⋆ Q_⋆ Q⋆​ 本章介绍 SARSA,它也是一种 TD 算法, S…

vue3 + fastapi 实现选择目录所有文件自定义上传到服务器

文章目录 ⭐前言💖 技术栈选择 ⭐前端页面搭建💖 调整请求content-type传递formData ⭐后端接口实现💖 swagger文档测试接口 ⭐前后端实现效果💖 上传单个文件💖 上传目录文件 ⭐总结⭐结束 ⭐前言 大家好&#xff0c…

UE5场景逐渐变亮问题

1、显示 -- 关闭眼部适应 2、项目设置 -- 关闭自动曝光 参考: 虚幻5/UE5 场景亮度逐渐变亮完美解决方法 - 哔哩哔哩

2024免费的苹果电脑杀毒软件cleanmymac X

苹果电脑怎么杀毒?这个问题自从苹果电脑变得越来越普及,苹果电脑的安全性问题也逐渐成为我们关注的焦点。虽然苹果电脑的安全性相对较高,但仍然存在着一些潜在的威胁,比如流氓软件窥探隐私和恶意软件等。那么,苹果电脑…

mac苹果电脑使用耳机听不到声音

大家在使用耳机收听音乐时候?是否经常遇到声音和音频播放问题的情况。这里小编为大家带来了三种不同的方法,帮助大家解决耳机在macOS系统电脑上怎么听不到任何声音的教程。如果大家对这篇文章感兴趣,那就来看下面的具体步骤吧。 方法一、检查…

平行进口美规,加版奔驰S500 S580更换主机,汉化导航,语音交互等功能

平行进口美规,加版奔驰S500 S580更换中规主机后,有中国地图导航,AR实景画面,中文你好奔驰,汉化摄氏度,激活自动变道,增强型抬头显示还可以实现箭头指示功能,原车带流星雨大灯还可以实…

人均瑞数系列,瑞数 6 代 JS 逆向分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未…

“时尚设计 时尚原创”首届广州(三元里)时尚设计大赛正式起航

10月18日上午,由广州市商务局、广州市工业和信息化局、白云区人民政府指导,白云区科技工业商务和信息化局、白云区三元里街道办事处主办,广东省皮具商会、三元里街工商业联合会承办,白云世界皮具贸易中心作为执行单位的首届广州(三…

免费高清壁纸下载(静态和动态壁纸)

一、网址下载(静态壁纸) 高清图片直接另存为就可以了。然后在电脑空白处右键——个性化设置即可替换壁纸。 ①网址:https://www.hippopx.com ②极简壁纸:https://bz.zzzmh.cn/index ③彼岸图网:http://pic.netbian…

大模型基础——大模型范式

大模型背后的范式 整个预训练语言模型的使用范式: 对于预训练模型,最核心的要素是从无标注的数据中去学习,通过自监督的一些任务去做预训练,得到丰富的知识。在具体的应用中,会引入一些任务相关的数据,去调…

Leetcode—2525.根据规则将箱子分类【简单】

2023每日刷题(五) Leetcode—2525.根据规则将箱子分类 实现代码 char * categorizeBox(int length, int width, int height, int mass){long long volume;long long len (long long)length;long long wid (long long)width;long long heig (long lo…

十八、字符串(2)

本章概要 格式化输出 printf()Systen.out.format()Formatter 类格式化修饰符Formatter 转换String.format() 一个十六进制转储(dump)工具 格式化输出 在长久的等待之后,Java SE5 终于推出了 C 语言中 printf() 风格的格式化输出这一功能…

VFP GRID每行BLOB显示图片,简单几行代码就完成啦

不止一位狐友问我,想在表格里面显示图片,于是我想了想,满足狐友们的期望,升级了一个框架控件,再来个超容易的教程。 一、拖入一个表单 二、删除自动生成的TEXTBOX1 选中表格,右键->编辑 ,点击…

Kibana Discover数据查询

步骤1:打开管理页面(Management) 步骤2: 因为前面的章节导入航班数据的时候,自动创建了一个名字叫kibana_sample_data_flights的航班数据索引,如果我们只想搜索kibana_sample_data_flights索引的数据,则不需要通配符&…

Mysql数据库表操作--存储

建表: 插入上面的数据: 1、创建一个可以统计表格内记录条数的存储函数 ,函数名为count_sch() 2、创建一个存储过程avg_sal,有3个参数,分别是deptno,job,接收平均工资(out);功能查询employees表的…

哈希表超详解

目录 哈希表 概念 冲突-概念 冲突-避免 冲突-避免-哈希函数设计 冲突-避免-负载因子的调节 冲突-解决-闭散列 冲突-解决-开散列 哈希桶的实现 性能分析 java和类集的关系 哈希表 概念 顺序结构及平衡树中,元素关键码与其存储位置之间没有对应关系&#xf…

不做技术不会管理,测试人还有这个职位可以进阶

之前我们讲过,测试工程师的4层技术发展路线都需要掌握哪些技能。学而优则仕,今天我们来说说如果想做某个行业的专家应该掌握哪些技能。 如果你对测试技术不感兴趣,但对某领域的业务兴趣浓厚,可以考虑行业专家路线。 由于测试工程…

python单元测试框架(继承、unittest参数化、断言、测试报告)

一、继承 继承能解决什么问题? unittest每个模块都要用到前提条件以及清理,如果有上百个模块,我们要改域名和浏览器,就会工作量很大特别麻烦,这时我们可以用继承的思想只用改一次 我们可以将前提和清理提出来单独放…

日志分析系统——ELK

目录 一、ELK概述 ELK的组成 1、ElasticSearch 2、Logstash 3、Kiabana 完整日志采集系统基本特征 ELK的工作原理 二、ELK的部署 1、环境准备 2、部署ElasticSearch软件 3、安装Elasticsearch-head插件 4、Logstash部署 5、Kibana部署 三、FilebeatELK部署 1、安…

python基础教程:递归函数教程

嗨喽,大家好呀~这里是爱看美女的茜茜呐 1.递归的定义: 在函数内部直接或者间接调用函数本身 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资…