【STM32入门】4.1中断基本知识

1.中断概览

在开展红外传感器遮挡计次的实验之前,有必要系统性的了解“中断”的基本知识.

中断是指:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。初看这里会感觉有些奇怪,我正在干一件事情,你是凭什么让我停下来去干另一件事,然后干完之后再返回来去完成我本来在干的事情呢?这里就涉及到一个概念,叫做“优先级”。

优先级:当有多个中断源同时申请中断的时候,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。假设场景在幼儿园,老师是CPU,本来正在上课,有个小朋友喊“老师我尿裤裆了”,这件事的优先级高于上课,于是老师中断了上课优先去处理尿裤裆的小朋友。但如果遇到了优先级更高的事情怎么办?例如,这个小朋友尿裤裆了,但是另一个小朋友拉裤裆了,而且拉的是稀的,已经流到地上了。

中断嵌套:前面这个恶心的例子中,小朋友尿裤子是一个中断事件,让老师停止了上课,但拉裤裆是一个中断优先级更高的事件,老师不得不先处理拉裤裆的小朋友。这种在执行中断过程中,又来了一个优先级更高的中断的过程,叫做中断嵌套。

2.STM32的中断 

STM32中包含了68个可屏蔽中断通道,•包含EXTITIMADCUSARTSPII2CRTC等多个外设。这些中断都通过NVIC统一管理,先看看内部逻辑结构,为什么要用到NVIC?

从上图可以看出,STM32涉及中断的外设都是先链接到NVIC,最后在NVIC中经过优先级排序,再决定传哪个中断信号给CPU。这是一种减少CPU运算量的设计方法,试想,如果一个学校里面,连进出门禁、学生请假等等一系列的所有事情都需要校长亲自去管,那这个校长就不用做其他事情了。在这里CPU也是同样的,让他专注于运算,NVIC做他的秘书。 

使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。

2.1抢占优先级和响应优先级

在上面的图里可以看到,NVIC的优先级一共有0-15个等级,这里需要注意的是很多教程和书里会有这么一句话“NVIC的中断优先级由优先级寄存器的4位(0~15)决定”,试一试2进制的4位最小和最大可以表示什么十进制数字,0000--0,1111--15。这样就可以理解了,总共有0-15共计16个优先级排序,在stm32的底层是用4位2进制数来表达这些优先级,暂且这么理解。

这4位二进制数可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。

上面这个表其实很好理解,反正总共只有4位二进制数可以用来表达优先级,还要在这4位里面分个组,一部分用来表达抢占优先级(小朋友拉裤裆,这事很上头是最优先的),一部分用来表达响应优先级(小朋友尿裤裆,忍一忍没准自己干了,不是太上头)。

假设我要用这4位二进制中的2位去表达抢占优先级,那就是000-111,即0-7总共可以容纳八个小朋友拉裤裆,用4位二进制中的其余2位去表达响应优先级,那也是000-111,即0-7,总共可以容纳八个小朋友尿裤裆。总之,老师一回就只能处理16个小朋友的“惊喜”至于是拉裤裆还是尿裤裆,你们自己选。 这样的分组总共有5中,就是表格第一列的分组0~分组4.

2.2EXTI

全称是Extern Interrupt外部中断,这是专门用于监测外部发起中断的模块。EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

支持的触发方式有:上升沿/下降沿/双边沿/软件触发。

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断通道数:16GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

上面硕了EXTI主要是监测引脚输入的外部中断信号,但是STM32引脚那么多,到底选择哪个去监测是需要先配置的,这里就需要用到AFIO,整体的EXTI结构如下图:

AFIO的功能是引脚的复用和重定义,在中断部分,AFIO的主要作用是中断引脚的选择,别的先不管。 EXTI的内部逻辑框图如下:

这个逻辑比较简单,用与门和或门来选择信号,配合中间的寄存器来选择中断信号的发送。具体内容可以先不深究,知道这东西在哪儿,要用回来翻看就是了。 

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

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

相关文章

2.electron之纯原生js/jquery的桌面应用程序(应用篇)

如果可以实现记得点赞分享,谢谢老铁~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、…

pytest + yaml 框架 -59.用例失败重跑机制pytest-rerunfailures

前言 有些接口可能不太稳定,第一次跑的时候由于网络原因或者其它原因失败,但是重新跑2次又成功了。 对于这种需要重新跑几次的场景,可以使用用例失败重跑机制,需安装pytest-rerunfailures 插件。 场景示例 失败重跑需要依赖 py…

直播美颜SDK开发实战:从入门到精通

直播美颜SDK的应用已经成为许多直播平台和开发者关注的焦点。本文将带领读者深入探讨直播美颜SDK的开发实战,从入门到精通的过程。 1.引言 直播美颜SDK是一种集成了图像处理、人脸识别、滤镜算法等技术的开发工具包。通过使用该SDK,开发者能够为直播应…

Tekton 基于 cronjob 触发流水线

Tekton 基于 cronjob 触发流水线 Tekton EventListener 在8080端口监听事件,kubernetes 原生 cronjob 定时通过curl 命令向 EventListener 发送事件请求,触发tekton流水线执行,实现定时运行tekton pipeline任务。 前置要求: kub…

如何在Kali Linux安装Xrdp+cpolar内网穿透实现远程访问Kali系统

文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于,它允许用户从远程位置访问Kali系统,而无需直接物理访…

luceda ipkiss教程 49:以pcell的方式定义线路

在ipkiss中,通常以i3.Circuit来设计线路(见教程2),以i3.Pcell的框架也可以来设计线路: 以SplitterTree为例: 线路仿真结果: 所有代码如下: from si_fab import all as pdk import…

[css] flex wrap 九宫格布局

<div class"box"><ul class"box-inner"><li>九宫格1</li><li>九宫格2</li><li>九宫格3</li><li>九宫格4</li><li>九宫格5</li><li>九宫格6</li><li>九宫格7&l…

Android BluetoothAdapter 使用(二)

Android BluetoothAdapter 使用(二) 本篇文章主要讲下蓝牙设备的配对. 1: 蓝牙设备列表展示 下 面是蓝牙设备adapter的代码: package com.test.bluetooth;import android.bluetooth.BluetoothDevice; import android.content.Context; import android.view.LayoutInflater;…

Leetcode—459.重复的子字符串【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—459.重复的子字符串 算法思想 巧解的算法思想 实现代码 从第一个位置开始到s.size()之前&#xff0c;看s字符串是否是ss的子串 class Solution { public:bool repeatedSubstringPattern(string s) {return (s s).fin…

DDoS原生防护和Web应用防火墙组合使用方案

本文介绍了为网站类业务同时部署DDoS原生防护和Web应用防火墙的配置方法。该方案适用于为网站业务同时防御四层DDoS攻击和七层Web攻击、CC攻击的场景。 前提条件 已创建ECS实例并部署了业务相关的应用&#xff0c;ECS实例拥有公网IP地址且网站有域名。 说明 如果网站用于在中国…

python初试二

连接数据库 Django为多种数据库后台提供了统一的调用API。根据需求不同&#xff0c;Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。 在Linux终端下启动mysql: $mysql -u root -p 在MySQL中创立Django项目的数据库&#xff1a; …

解决因找不到qt5core.dll文件而导致无法执行代码问题

Qt5core.dll是Qt5框架的核心模块&#xff0c;用于提供基本的Qt功能。如果在代码执行过程中找不到qt5core.dll&#xff0c;可能导致相关功能无法正常使用。以下是五种详细解决方法、qt5core.dll文件详细介绍以及丢失原因。 一、qt5core.dll文件详细介绍 文件名称&#xff1a;q…