【物联网】STM32的中断机制不清楚?看这篇文章就足够了
在嵌入式系统中,中断是一种重要的机制,用于处理来自外部设备的异步事件。STM32系列微控制器提供了强大的中断控制器,可以方便地处理各种外部中断和内部中断。本文将详细介绍STM32中断的结构和使用方法。
文章目录
- 1. 什么叫中断
- 2. 中断优先级
- 2.1 有抢占优先级为什么还要子优先级?
- 3. 中断嵌套
- 4. 中断结构
- 5. 中断使用方法
- 总结
1. 什么叫中断
中断是计算机系统中的一种机制,用于处理突发事件或异步事件。在计算机运行过程中,CPU通常是按照指令的顺序依次执行的,但是当发生某些特殊事件时,如外部设备的输入、定时器的溢出等,CPU需要立即中断当前的任务,转而处理这些事件。这样可以提高系统的响应速度和效率。
中断可以看作是一种突然的打断,类似于我们在做一件事情的时候突然收到了一个电话,需要立即停下手头的工作去接听电话。中断可以分为硬件中断和软件中断两种类型。
硬件中断是由外部设备触发的,如键盘输入、鼠标点击等。当外部设备触发了中断信号时,CPU会立即停止当前的任务,转而执行与中断相关的处理程序。处理完中断后,CPU会返回到之前被中断的地方继续执行。
软件中断是由程序中的特殊指令触发的。程序可以通过软件中断指令,主动请求CPU中断当前任务,执行与中断相关的处理程序。软件中断可以用来实现特定的功能,如操作系统的系统调用。
2. 中断优先级
在STM32微控制器中,中断优先级是用来确定**中断服务程序(ISR)**执行的顺序的。STM32系列微控制器支持多个中断源,并且每个中断源都有一个对应的中断优先级。
中断优先级可以分为两个级别:抢占优先级和子优先级。
- 抢占优先级(Preemption Priority):抢占优先级决定了当多个中断同时发生时,哪个中断可以中断当前正在执行的中断。具有较高抢占优先级的中断可以打断正在执行的较低优先级中断,并立即执行自己的中断服务程序。
- 子优先级(Subpriority):子优先级用于决定在同一抢占优先级的多个中断中,哪个中断将首先得到执行。具有较高子优先级的中断将在同一抢占优先级的其他中断之前得到执行。
2.1 有抢占优先级为什么还要子优先级?
抢占优先级和子优先级的组合可以提供更灵活的中断控制和调度。抢占优先级主要用于处理多个中断同时发生时的中断抢占关系,而子优先级则用于处理同一抢占优先级的多个中断的执行顺序。
使用抢占优先级可以确保关键的中断能够及时中断正在执行的低优先级中断,并立即执行自己的中断服务程序。这对于实时性要求较高的应用非常重要。
然而,当多个中断具有相同的抢占优先级时,如果没有子优先级的支持,它们将按照先后顺序依次执行,无法进行更细粒度的调度。一般情况下,抢占优先级的位数比子优先级的位数多,因此抢占优先级的范围更广,可以提供更细粒度的中断控制。通过使用子优先级,可以在同一抢占优先级的多个中断中确定首先执行的中断。这对于需要优先处理某些特定中断的应用非常有用。
3. 中断嵌套
中断嵌套是指在一个中断服务程序(ISR)执行期间,另一个中断发生并触发了相应的中断服务程序的执行。当一个中断正在处理时,如果有更高优先级的中断发生,系统将暂停当前中断的处理,转而去处理更高优先级的中断,这就是中断嵌套。
中断嵌套在实时系统中非常常见,它允许系统在处理一个中断时能够及时响应更高优先级的中断请求。通过中断嵌套,可以实现对多个中断请求的优先级排序和处理,确保关键中断能够及时中断正在执行的较低优先级中断,并立即执行自己的中断服务程序。
在STM32微控制器中,中断嵌套是通过抢占优先级和子优先级来实现的。当一个中断正在执行时,如果有更高抢占优先级的中断请求发生,系统会立即中断当前中断的执行,并开始处理更高优先级的中断。如果多个中断具有相同的抢占优先级,那么子优先级将决定它们的执行顺序。
中断嵌套可能会引入一些问题,如中断嵌套深度过大可能导致系统性能下降,同时需要合理地处理中断优先级和中断服务程序的互斥和同步问题,以确保系统的正确性和可靠性。
4. 中断结构
4.1 中断向量表(Interrupt Vector Table):中断向量表是一个存储中断向量地址的数据结构,用于存储中断服务函数的入口地址。当一个中断发生时,微控制器会根据中断号从中断向量表中读取相应的ISR地址,并跳转到该地址执行中断服务程序。在STM32中,中断向量表存储在内部闪存的起始地址处。
中断向量表的大小取决于微控制器支持的中断数量。对于STM32系列微控制器,通常采用的是基于向量表的中断处理方式,其中中断向量表的大小是固定的,每个中断向量的大小是4个字节。因此,中断向量表的大小等于中断数量乘以4个字节。
在编程中,我们可以通过修改中断向量表中的中断向量来指定每个中断的ISR地址。通常,我们会使用编译器提供的特定语法来定义中断向量表和中断服务程序,并将它们放置在正确的地址位置。
需要注意的是,中断向量表是只读的,它存储了系统在编译时确定的中断服务程序的地址。因此,在运行时无法修改中断向量表。如果需要动态地改变中断服务程序的执行地址,可以使用中断向量重定向技术,即通过修改中断向量表中的中断向量,将中断重定向到其他地址。但这种技术需要小心使用,以避免引入不可预测的错误。
4.2 中断控制器(Nested Vectored Interrupt Controller,NVIC):NVIC是STM32中断控制器的核心组件,用于管理和控制中断。它支持多级中断优先级,可以配置中断优先级、使能或禁用中断,并提供中断向量表的地址。
NVIC有以下几个主要的功能:
-
中断优先级管理:NVIC允许为每个中断分配一个抢占优先级和一个子优先级。抢占优先级用于确定中断的抢占关系,而子优先级用于确定同一抢占优先级的多个中断的执行顺序。NVIC提供了寄存器来配置和管理中断的优先级。
-
中断使能/禁止控制:NVIC提供了寄存器来使能或禁止特定的中断。通过设置相应的位,可以选择性地使能或禁止中断。这对于灵活地控制中断的触发和执行非常有用。
-
中断状态管理:NVIC提供了寄存器来管理中断的状态。例如,可以通过读取和写入中断挂起寄存器来判断中断是否处于挂起状态,以及通过写入中断清除寄存器来清除中断标志。
-
中断向量表偏移:NVIC允许通过设置偏移量来修改中断向量表的起始地址。这对于实现中断向量重定向非常有用,可以将中断重定向到其他地址。
4.3 中断服务函数(Interrupt Service Routine,ISR):中断服务函数是中断发生时执行的代码块。在STM32中,中断服务函数需要使用特定的函数声明和命名规则,并通过中断向量表进行注册。
5. 中断使用方法
-
配置中断优先级:首先,需要使用
NVIC_SetPriority()
函数设置中断的抢占优先级和子优先级。该函数的参数包括中断通道号和优先级值。 -
初始化中断向量表:在启动代码中,需要初始化中断向量表的起始地址。可以使用
NVIC_SetVectorTable()
函数来设置中断向量表的偏移地址。 -
注册中断处理函数:使用
NVIC_Init()
函数注册中断处理函数。该函数的参数包括中断通道号、中断优先级和中断处理函数的地址。 -
使能中断:使用
NVIC_EnableIRQ()
函数使能中断。该函数的参数为中断通道号。 -
编写中断处理函数:编写中断处理函数,处理中断事件发生时的逻辑。中断处理函数的命名和参数取决于所使用的中断通道和编程语言。
以下是一个示例代码,演示了如何使用标准外设库函数实现中断:
#include "stm32f10x.h"// 中断处理函数
void EXTI0_IRQHandler(void)
{// 处理中断事件逻辑// ...// 清除中断标志EXTI_ClearITPendingBit(EXTI_Line0);
}int main(void)
{// 初始化中断向量表NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);// 配置中断优先级NVIC_SetPriority(EXTI0_IRQn, 0);// 注册中断处理函数NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能中断NVIC_EnableIRQ(EXTI0_IRQn);while (1){// 主循环逻辑// ...}
}
总结
STM32中断提供了强大的功能,可以方便地处理各种外部中断和内部中断。通过合理配置中断优先级和中断服务函数,可以实现对异步事件的及时响应。在实际应用中,需要根据具体需求和硬件设备,合理使用中断功能,提高系统的可靠性和性能。
相关文章:
【物联网】STM32的中断机制不清楚?看这篇文章就足够了
在嵌入式系统中,中断是一种重要的机制,用于处理来自外部设备的异步事件。STM32系列微控制器提供了强大的中断控制器,可以方便地处理各种外部中断和内部中断。本文将详细介绍STM32中断的结构和使用方法。 文章目录 1. 什么叫中断2. 中断优先级…...
深入剖析红黑树:优雅地平衡二叉搜索树
目录 一.红黑树的概念二.插入操作三.与AVL树的比较 一.红黑树的概念 在之前的学习中,我们了解了二叉搜索平衡树,AVL树通过控制每个结点中的平衡因子的绝对值不超过1,实现了一个高性能的树。而相较于AVL的高度平衡,红黑树觉得AVL为…...
C10K问题:高并发模型设计
一、循环服务器模型 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> //*******// #include &l…...
哈希/散列--哈希表[思想到结构][==修订版==]
文章目录 1.何为哈希?1.1百度搜索1.2自身理解1.3哈希方法/散列方法1.4哈希冲突/哈希碰撞1.5如何解决?哈希函数的设计 2.闭散列和开散列2.1闭散列/开放定址法2.2开散列/链地址法/开链法1.概念2.容量问题3.字符串问题4.开散列性能测试5.开散列与闭散列比较 3.代码实现[配备详细…...
成都建筑模板批发市场在哪?
成都作为中国西南地区的重要城市,建筑业蓬勃发展,建筑模板作为建筑施工的重要材料之一,在成都也有着广泛的需求。如果您正在寻找成都的建筑模板批发市场,广西贵港市能强优品木业有限公司是一家值得关注的供应商。广西贵港市能强优…...
亨元模式 结构型模式之六
1.定义 享元模式是一种结构型设计模式, 它允许你在消耗少量内存的情况下支持大量对象。 2.滑滑梯问题 在说明亨元模式之前,我们先看看关于滑滑梯的程序设计。小区的楼下只有三个滑滑梯,但是想玩的小朋友却非常多。怎么设计计滑滑梯资源的管理…...
面试题: Spring中Bean的实例化和Bean的初始化有什么区别?
Spring中Bean的实例化和Bean的初始化有什么区别? 背景答案扩展知识什么是实例化什么是初始化 个人评价我的回答 背景 想换工作, 看了图灵周瑜老师的视频想记录一下, 算是学习结果的一个输出. 答案 Spring 在创建一个Bean对象时, 会先创建出一个Java对象, 会通过反射来执行…...
阻塞队列,生产者消费者模型
目标: 1. 认识与使用阻塞队列 2. 认识与实现消费者模型 目录 阻塞队列的特点 生产者消费者模型 生产者消费者模型的优点 阻塞队列实现该模型 阻塞队列的特点 1. 线程安全 2. 带有阻塞特性 (1)如果队列为空,继续出队列&a…...
【RCRL充放电时间相关计算】
一. 基础知识 L、C元件称为“惯性元件”,即电感中的电流、电容器两端的电压,都有一定的“电惯性”,不能突然变化。充放电时间,不光与L、C的容量有关,还与充/放电电路中的电阻R有关。RC电路的时间常数:τRC…...
C++ primer plus--输入、输出和文件
17 输入、输出和文件 17.1 C 输入和输出概述 C 把输入和输出看做字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插到输出流中。 缓冲区是内存中的临时存储区域,是程序与文件或其他 I/O 设备之间的桥梁。 17.2 使用…...
案例题--Web应用考点
案例题--Web应用考点 负载均衡技术微服务XML和JSON无状态和有状态真题 在选择题中没有考察过web的相关知识,主要就是在案例分析题中考察 负载均衡技术 应用层负载均衡技术 传输层负载均衡技术 就近的找到距离最近的服务器,并进行分发 使用户就近获取…...
MySQL的SQL 优化:提升数据库性能
1. 插入操作优化 1.1 使用多值插入 通常情况下,插入大量数据时,使用多值插入语句比逐行插入更高效。例如,将多个数据行打包成一个 INSERT 语句: INSERT INTO users (name, email) VALUES (Alice, aliceexample.com), (Bob, bob…...
【匠心打造】从0打造uniapp 可视化拖拽设计 c_o 第十篇
一、click one for uniapp置顶: 全部免费开源 (你商业用途也没关系,不过可以告诉我公司名或者项目名,放在官网上好看点。哈哈-_-) 二、写在之前 距离上一篇更新已经大约4个月了,公司的事情,自己的一些琐事一直没时间…...
BIT-5-操作符详解(C语言初阶学习)
1. 各种操作符的介绍。 2. 表达式求值 1. 操作符分类: 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 除了 % 操作符…...
【重拾C语言】三、分支程序设计(双分支和单分支程序设计、逻辑判断、多分支程序设计、枚举类型表示;典型例题:判断闰年和求一元二次方程根)
目录 前言 三、分支程序设计 3.1 判断成绩是否及格——双分支程序设计 3.2 成绩加上获奖信息—单分支程序设计 3.3 逻辑判断——布尔类型 3.4 获奖分等级——多分支程序设计 3.5 表示汽车种类——枚举类型 3.6 例题 3.6.1 例题——判断某个年份是否闰年 3.6.2 例题—…...
Shiro应用到Web Application
一、权限基础 a) 认证(你是谁?) 判断你(被认证者)是谁的过程。通常被认证者提供用户名和密码。 常见的认证包含如下几种: 匿名认证:允许访问资源,不做任何类型的安全检查。表单认证:访问资源之前,需要提…...
【POST请求-腾讯翻译君-爬虫案例】
原因:尝试多个在线翻译平台,由于返回数据存在加密原因(暂时不会解密),最总找到 ”腾讯翻译君“ 完成爬虫案例POST请求测试 案例测试网址 腾讯翻译 :https://fanyi.qq.com/ import requests import jsoncla…...
多卡片效果悬停效果
效果展示 页面结构 从页面的结构上看,在默认状态下毛玻璃卡片是有层次感的效果叠加在一起,并且鼠标悬停在卡片区域后,卡片整齐排列。 CSS3 知识点 transform 属性的 rotate 值运用content 属性的 attr 值运用 实现页面整体布局 <div …...
首饰饰品经营商城小程序的作用是什么
首饰如耳钉、戒指、手镯等除了高价值产品外,还有很多低价产品,市场需求客户众多,在实际经营中,商家们也会面临一些痛点。 私域话题越来越多加之线上线下同行竞争、流量匮乏等,更对商家选择自建商城经营平台。 通过【…...
华为OD机试真题【服务器能耗统计】
1、题目描述 【服务器能耗统计】 服务器有三种运行状态:空载、单任务、多任务,每个时间片的能耗的分别为1、3、4; 每个任务由起始时间片和结束时间片定义运行时间; 如果一个时间片只有一个任务需要执行,则服务器处于单任务状志; 如果一个时间片有多个任务需要执行,则服务器处于…...
ubuntu按下del却出现空格(命令行下键盘错乱)
问题: 有一天远程我的ubuntu 20.04,发现为何按 del 会产生空格后移的效果,up键也会重叠显示,首先感觉是这个远程软件有问题,于是又换了xshell,发现还是不行,只能打开积灰已久的笔记本࿰…...
Go开始:Go基本元素介绍
目录 标识符与关键字Go中的标识符Go关键字关键字示例 具名的函数常规函数代码示例 方法代码示例 高阶函数代码示例 匿名函数与Lambda表达式代码示例 闭包代码示例 具名的值变量基本数据类型复合数据类型指针类型 常量基本常量类型枚举常量常量表达式 定义类型和类型别名类型定义…...
十二、【漏洞复现】Rails任意文件读取(CVE-2019-5418)
十二、【漏洞复现】Rails任意文件读取(CVE-2019-5418) 12.1、漏洞原理 Ruby on Rails是一个使用 Ruby 语言写的开源 Web 应用框架,它是严格按照 MVC 结构开发的。它努力使自身保持简单,来使实际的应用开发时的代码更少,使用最少…...
【计算机视觉|人脸建模】学习从4D扫描中获取的面部形状和表情的模型
本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Learning a model of facial shape and expression from 4D scans 链接:Learning a model of facial shape and expression from 4D scans | ACM Transactions on Graphics Pe…...
【ADB】蓝牙总结
ADB 打开蓝牙关闭蓝牙打开Setting查看蓝牙地址查看蓝牙名称查看蓝牙是否开启车机蓝牙Setting配置路径wifi 打开蓝牙 adb root adb shell svc bluetooth enable 关闭蓝牙 adb root adb shell bluetooth disable 打开Setting adb shell am start -n com.android.settings/.S…...
嵌入式系统设计与应用---ARM处理器体系结构(学习笔记)
ARM处理器概述 Cortex-A8处理器工作模式 ps:除用户模式以外的其他模式被称为非用户模式或特权模式;除用户模式及系统模式以外的其他模式可称为异常模式 Cortex-A8存储器管理 ARM的基本数据类型 字节(Byte)&#…...
计算机竞赛 身份证识别系统 - 图像识别 深度学习
文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 图像识别 深度学习 身份证识别…...
StarRocks数据导入
1、相关环境 Flink作为当前流行的流式计算框架,在对接StarRocks时,若直接使用JDBC的方式"流式"写入数据,对StarRocks是不友好的,StarRocks作为一款MVCC的数据库,其导入的核心思想还是"攒微批降频率&qu…...
JavaSE | 初识Java(一) | JDK \ JRE \ JVM
Java初识 Java 是一门半编译型、半解释型语言。先通过 javac 编译程序把源文件进行编译,编译后生成的 .class 文件是由字节 码组成的平台无关、面向 JVM 的文件。最后启动 java 虚拟机 来运行 .class 文件,此时 JVM 会将字节码转换成平台能够理…...
6轮面试阿里Android开发offer,薪资却从21k降到17k,在逗我?
一小伙工作快3年了,拿到了阿里云Android开发岗位P6的offer,算HR面一起,加起来有6轮面试了,将近3个月的时间,1轮同级 1轮Android用人部门leader 1轮Android 组leader 1轮项目CTO 1轮HR 1轮HRBP。 一路上各种事件分…...
个人适合做什么网站/微信管理工具
一、使用TableLogic来进行逻辑删除 Data NoArgsConstructor AllArgsConstructor //TableName("t_user") public class User {TableId(value "ids",type IdType.AUTO)private Long id;//指定属性与表字段名对应TableField(value "t_name")pri…...
网站后台psd/平台seo
iView 已经从最初的高质量 UI 组件库,逐步过渡到了从工程构建、主题定制、多语言、设计规范的一整套的前端解决方案。主要服务于中后台业务,目的就是让网站快速成型上线。 1.0 都有哪些新特性 先看一下目前支持的组件情况: 常用的组件包括了&…...
安徽省房地产开发项目管理系统/seo推广方式是什么呢
现象:16gu盘。分了两个区,一个exfat放数据。另外一个做成了u盘linux。结果以后想格式化成16g盘,win7找不到linux的分区。 解决:1.打开cmd2.命令行:diskpart3.查看所有硬盘:list disk4.假设你的优盘为disk1&…...
包头网站建设公司/交友平台
在这篇文章中,将介绍一些提高 ASP.NET Web 应用性能的方法和技巧。众所周知,解决性能问题是一项繁琐的工作,当出现性能问题,每个人都会归咎于编写代码的开发人员。 以下为译文 那性能问题到底该如何解决?以下是应用系统…...
网站谷歌优化怎么做/网站关键词seo费用
如果您不介意使用JavaScript和jQuery,则可以使用jQuery client plugin检测操作系统,然后设置字体。它似乎是旧东西,但它适用于jQuery 1.3.2,如果它适用于jQuery 1.6.1,我不会感到惊讶。if($.client.os Mac)$(body).cs…...
html5企业网站建设/如何推广普通话的建议6条
Stephen Mcmennamy是instagram上的一位博主 他不发自拍、不发美食 靠的是一流的PS技能和无与伦比的脑洞 吸引了近27万粉丝的关注 象君前年就给大家推荐过他的拼贴作品 一年多过去了,Stephen又创作了哪些神作呢? 一起来看看吧~ 不说是拼接…...