【物联网】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; 每个任务由起始时间片和结束时间片定义运行时间; 如果一个时间片只有一个任务需要执行,则服务器处于单任务状志; 如果一个时间片有多个任务需要执行,则服务器处于…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
【Redis】数据库与缓存一致性
目录 1、背景2、核心问题3、常见解决方案【1】缓存更新策略[1]旁路缓存模式(Cache-Aside)[2]写穿透模式(Write-Through)[3]写回模式 【2】删除与更新策略[1]先更新数据库再删除缓存[2]先删除缓存再更新数据库 【3】一致性保障机制…...
Cursor 工具项目构建指南: Uniapp Miniprogram 环境下的 Prompt Rules 约束
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南: Uniapp Miniprogram 环境下的 Prompt Rules 约束前言项目简…...