中断系统的原理

一、介绍

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。中断是指‌CPU在正常运行程序时,由于内部或外部事件的发生,导致CPU中断当前运行的程序,转而去执行其他程序的过程。‌ 中断可以是硬件产生的,也可以是软件产生的。硬件中断通常由外围设备触发,而软件中断则是通过CPU指令集中的一个指令来实现。

二、原理

(1)中断请求

中断源以硬件信号形式通过中断控制线路向CPU提出中断请求。 中断源:引起中断事件的原因。 中断源可以是外部的硬件设备,如键盘、打印机等输入/输出设备和各种控制设备;也可以是软件指令,如中断指令(软中断,访管指令);还可能是由各种故障和出错引起的中断(自陷),如计算溢出等。

⑵ 中断判优及响应,中断控制器根据中断优先权进行判断,择优予以响应。

⑶ 保护现场 ,CPU保护主程序的运行现状,如PC值、PSW、寄存器和内存中的重要数据。

⑷ 中断服务, 按中断源的工作要求,查询中断向量表,执行相应的中断服务程序。

⑸ 恢复现场, 为了正确返回原程序,需要进行恢复现场的工作,即将前面保存的寄存器的内容送回原寄存器。

⑹ 中断返回 返回被中断的程序 ,继续执行。

 外部中断/事件控制器

 

中断控制器NVIC 

  1. 中断请求:称为中断源或中断事件、是指外部设备或内部模块发出的信号,通知微控制器发生了一个特定的事件。
  2. 中断控制器:中断控制器负责对中断请求进行管理和分配优先级,如NVIC。
  3. 中断优先级:每个中断都具有一个优先级,用于确定中断处理程序的执行顺序。较高优先级的中断会打断正在执行的较低优先级中断或主程序。
  4. 中断处理程序:中断服务函数,是一段用于处理特定中断的代码。当中断发生时,微控制器会跳转到相应的中断处理程序执行相关操作,处理完毕后返回主程序。
  5. 中断使能:通过设置相应的中断使能位,可以启用或禁用特定的中断。禁用中断后,即使中断请求发生,微控制器也不会响应。
  6. 中断标志:中断标志用于指示特定中断是否已经发生。在处理完中断后,需要清除相应的中断标志,以便再次触发相同中断。
  7. 中断向量:是指中断服务程序入口地址的偏移量与段基值,一个中断向量占据4字节空间。
  8. 中断向量表:中断向量表是存储中断处理程序地址的表格,当中断发生时微控制器会根据中断向量表中相应中断的地址跳转到对应的中断处理函数。

 

三、实例

 STM32处理中断的步骤

            外设发出中断请求
            处理器暂停当前执行的任务,保护现场,将当前位置的程序计数器(PC)地址压栈。
            程序跳转到中断服务程序, 执行中断服务程序
             恢复现场, 将栈顶的值会送到PC
            跳转到被中断的位置执行下一个指令。

 

 

配置定时器的定时中断

#include "stm32f10x.h"                  // Device header

/**
  * 函    数:定时中断初始化
  * 参    数:无
  * 返 回 值:无
  */
void Timer_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;				//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;				//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);				//将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元	
	
	/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位
																//TIM_TimeBaseInit函数末尾,手动产生了更新事件
																//若不清除此标志位,则开启中断后,会立刻进入一次中断
																//如果不介意此问题,则不清除此标志位也可
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//开启TIM2的更新中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2
																//即抢占优先级范围:0~3,响应优先级范围:0~3
																//此分组配置在整个工程中仅需调用一次
																//若有多个中断,可以把此代码放在main函数内,while循环之前
																//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
}

/* 定时器中断函数,可以复制到使用它的地方
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
*/
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;			//定义在定时器中断里自增的变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	Timer_Init();		//定时中断初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Num:");			//1行1列显示字符串Num:
	
	while (1)
	{
		OLED_ShowNum(1, 5, Num, 5);			//不断刷新显示Num变量
	}
}

/**
  * 函    数:TIM2中断函数
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  *           函数名为预留的指定名称,可以从启动文件复制
  *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  */
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断
	{
		Num ++;												//Num变量自增,用于测试定时中断
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);			//清除TIM2更新事件的中断标志位
															//中断标志位必须清除
															//否则中断将连续不断地触发,导致主程序卡死
	}
}

四、中断和DMA有什么区别

中断传输方式是在数据缓冲区满后发生中断请求,CPU进行中断处理将数据传输到内存,而DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理。DMA运输的大部分时间,CPU和输入输出都处于并行操作,因此,整个计算机系统的效率大大提高,但DMA也是要利用中断的,否则CPU无法获知数据已经传输结束。
              

参考:

(七)STM32 NVIC 中断、优先级管理及 AFIO 时钟的开启_afio时钟-CSDN博客

一文搞懂中断-CSDN博客 

单片机基础:什么是中断系统、中断系统如何用(附中断系统应用实例)_中断系统 同时控制-CSDN博客 

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

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

相关文章

【重学 MySQL】四十八、DCL 中的 commit 和 rollback

【重学 MySQL】四十八、DCL 中的 commit 和 rollback commit的定义与作用rollback的定义与作用使用场景相关示例注意事项DDL 和 DML 的说明 在MySQL中,DCL(Data Control Language,数据控制语言)用于管理数据库用户和控制数据的访问…

集师专属知识付费小程序搭建 心理咨询小程序搭建

一、产品简介 集师SaaS知识付费软件,为知识创业者或商家提供一站式内容交付解决方案,助力商家搭建集品牌传播、商业变现和用户运营于一体的线上知识服务系统,覆盖全渠道经营场景,占据每个流量入口,使流量变现快速高效…

集智书童 | 用于时态动作检测的预测反馈 DETR !

本文来源公众号“集智书童”,仅用于学术分享,侵权删,干货满满。 原文链接:用于时态动作检测的预测反馈 DETR ! 视频中的时间动作检测(TAD)是现实世界中的一个基本且具有挑战性的任务。得益于 Transformer …

什么是 HTTP Get + Preflight 请求

当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时,意味着该请求涉及跨域资源共享 (CORS),并且该请求被预检了。理解这种请求的背景,主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …

Linux: network: 典型网络延迟图,CPU导致;

接上回说,https://mzhan017.blog.csdn.net/article/details/142689870; 其中在debug的过程中,看到下面这个IO图,这个图比较经典,是一个典型的网络延迟图,可用作为分析问题的一个参考。 如下图:黑…

2024年10月HarmonyOS应用开发者高级认证全新题库

注意事项:切记在考试之外的设备上打开题库进行搜索,防止切屏三次考试自动结束,题目是乱序,每次考试,选项的顺序都不同 新版题库:单选题40题 多选题20题 注意选项答案顺序不一样,大家记得看选项…

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录 一、缓存介绍 二、经典三缓存问题 1. 缓存穿透 1.1. 简介 1.2. 解决方案 1.3. 总结 2. 缓存雪崩 2.1. 简介 2.2. 解决方案 2.3. 总结 3. 缓存击穿 3.1. 简介 3.2. 解决方案 3.3. 总结 4. 经典三缓存问题出现的根本原因 三、常见双缓存方案 1. 缓存预热 1…

第Y2周:训练自己的数据集

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 在上一次体验yolov5s的为基础上,这次将训练自己的数据集。 在YOLO目标检测算法中常用的三种标签格式:voc(xml)、coco(json)和yolo(txt…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术,支持高清视频的接入和传输,能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…

LabVIEW提高开发效率技巧----严格类型化定义

在LabVIEW开发过程中,严格类型化定义(Strict Typedefs) 是一种工具,用于保证程序中控件和常量的一致性,减少错误,提高维护效率。通过使用严格类型化定义,开发者可以确保在程序的多个地方引用相同…

个人项目简单https服务配置

1.SSL简介 SSL证书是一种数字证书,由受信任的证书颁发机构(CA)颁发,用于在互联网通信中建立加密链接。SSL代表“安全套接层”,是用于在互联网上创建加密链接的协议。SSL证书的主要目的是确保数据传输的安全性和隐私性…

Windows:win11旗舰版连接无线显示器,连接失败

摘要:win11系统通过 miracast 无线连接到长虹电视的时候,一直连接不上。查看电脑又是支持 miracast 协议,后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视,打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…

python-pptx 中 placeholder 和 shape 有什么区别?

在 python-pptx 库中,placeholder 和 shape 是两个核心概念。虽然它们看起来相似,但在功能和作用上存在显著的区别。为了更好地理解这两个概念,我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…

深入理解Linux内核网络(二):内核与用户进程的协作

内核在协议栈接收处理完输入包以后,要能通知到用户进程,让用户进程能够收到并处理这些数据。进程和内核配合有很多种方案,第一种是同步阻塞的方案,第二种是多路复用方案。本文以epoll为例 部分内容来源于 《深入理解Linux网络》、…

101. 对称二叉树【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 递归3.2 迭代 四、参考代码4.1 递归4.2 迭代 零、原题链接 101. 对称二叉树 一、题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 进阶:你可以运用递归和迭代两种方法解决…

【MySQL】使用 JDBC 连接数据库

文章目录 前言1. 认识 JDBC1.1 概念1.2 好处 2. 使用 JDBC2.1 安装数据驱动包2.2 把 jar 包导入到项目中2.3 代码编写2.4 测试结果 3. 代码优化4. 源码展示结语 前言 在 MySQL 系列中,我们介绍了很多内容,包括但不限于建库建表,增删查改等等…

微信步数C++

题目: 样例解释: 【样例 #1 解释】 从 (1,1) 出发将走 2 步,从 (1,2) 出发将走 4 步,从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步,从 (2,2) 出发将走 3 步,从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…

基于基于微信小程序的社区订餐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

ElasticSearch备考 -- Async search

一、题目 通过异步方式查询earthquakes索引下Magnitude大于5的数据 二、思考 正常的查询大家可能会用的多一点,这种异步查询为数据量比较大的查询在后台执行,不用同步等待结果,待执行完成在获取结果。 三、解题 Step 1、准备基础数据 # D…

Sping源码:三级缓存

目录 一、概念1、三级缓存的作用2、循环依赖的含义 二、代码1、代码下载2、文件功能介绍3、源码分析3.1、找到获取A对象的位置,打断点进行debug操作3.2、一步步找到在A对象中注入B对象的位置3.3、一步步找到B对象注入A对象的位置3.4、往下找到通过三级缓存解决循环依…