STM32——EXIT外部中断

news2025/1/10 20:22:17

一、中断系统

以上就是中断的概念,简单理解就是:

当程序运行过程中,如果有中断源向CPU打报告,CPU就会暂停手下的事情去处理中断源提交的事情,然后处理完了在返回到CPU原来的位置继续处理手上的事情。如果同时有多个中断源提交报告,这时候CPU就得根据优先级进行抉择,先去处理哪个中断而后再去处理哪个中断?这个过程也就包含了中断嵌套,一层套一层,最后直到所有的中断处理完了才返回到自己的位置。

那么没有中断系统行不行?答案肯定是不行的,如果没有中断,CPU就得一边执行程序一边检测其他地方有没有出现异常,中断系统就相当于一个医院,CPU是医院总裁,医院的各个部门也就是中断源,各个部门负责他们的职位,一有异常就打报告给CPU。

二、STM32中断

那么STM32有多少个中断源(中断通道)?


CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。

灰色的就是系统异常(中断),中断就是异常,表中的优先级是硬件编号,数字越小优先级越高这里复位中断的编号最小,也就是复位中断,所以一按板子上的复位键会立马执行复位程序。

三、嵌套向量中断控制器 (NVIC)

前面提到中断优先级,那么中断优先级是谁来指定的呢?——NVIC

NVIC是内核上的一个外设,是CUP的助手,如果很多中断源都向CPU打报告,这时候CPU很有可能会处理不过来,CPU只是负责运算的,NVIC的作用就是把64个中断源全部都接在它自己上,因为NVIC有很多个输入口,但是NVIC只有一个输出口连接到CPU上,通过这个输出口,NVIC将优先级分配好之后再之间告诉CPU你应该先去执行哪一个中断。

CPU只负责运算,中断优先级不是CPU去分配和管理的,而是NVIC

NVIC优先级分组

在NVIC中有一个寄存器:应用程序中断及复位控制寄存器(AIRCR),它里面有 一个位段名为“优先级组”,它将每个优先级可配置的异常中断都能进行分组配置,意思就是可以将一个中断进行设置,分为抢占优先级响应优先级。

这个寄存器是8Bit的长度,同样是使用高四位表示中断的优先级的。然后在这四位中再继续进行划分,分出了用多少个Bit表示抢占优先级和多少个Bit表示响应优先级,上图中的分组方式就是把这四位分别划分给这两种方式的一个不同组合,分组方式的选择是通过函数自行选择。而这高4位就可以用0~15进行排序,也就是我们前面说到的一个中断通道有16种优先级,数字越小,优先级越高,0就是最高优先级。

两者的区别:

抢占优先级就是允许插队并且如果有人在治疗他也可以打断治疗让医生优先看他;

响应优先级就是只能插队,不可以打断上一个的治疗,等上一个治疗结束后才能治疗;

也就是优先比较抢占优先级,谁高就先执行谁;如果抢占优先级一样,就比较响应优先级,谁高就先执行谁;如果没有设置抢占优先级,而响应优先级又是一样,那就按照系统默认的中断优先级,谁高先响应谁,也就是中断表里面的优先顺序。

四、EXTI外部中断

中断响应和事件响应的区别是:中断响应是正常响应,经过NVIC后直接报告给CPU;但事件响应就是相当于外设之间的一个联合,不直接报告给CPU,可能触发到另一个外设中断

五、开启EXTI外部中断的步骤

所以步骤均基于上图

1、配置RCC,把涉及的外设的时钟打开:

涉及的外设有GPIO、AFIO、EXTI、NVIC,其中EXTI不需要我们自己打开,NVIC是内核中的外设,内核的外设都不需要开启时钟,RCC管的都是内核外的外设。

#include "stm32f10x.h"                  // Device header

void CountSensor(void)
{
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB  ,ENABLE ); 
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE );

}

另外,如果不知道外设对应的总线是哪个,可以右键跳转到定义查看:

2、配置GPIO:

#include "stm32f10x.h"                  // Device header

void CountSensor(void)
{
	//开启外设时钟
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB  ,ENABLE ); 
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE );

	//配置GPIO
	GPIO_InitTypeDef GPIO_Instructure;
	GPIO_Instructure.GPIO_Mode =GPIO_Mode_IPU ;
	GPIO_Instructure.GPIO_Pin =GPIO_Pin_14;
	GPIO_Instructure.GPIO_Speed =GPIO_Speed_50MHz ;
	GPIO_Init (GPIOB,&GPIO_Instructure);
}

另外,如果不知道该配置什么输入模式,可以进入手册进行查看:

GPIO配置完成,按照下图我们就应该配置AFIO,进行中断引脚的选择:

3、配置AFIO:


	//配置AFIO,选择中断引脚(没有单独的AFIO文件,需要到GPIO.h文件寻找)
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

4、配置EXTI:

//在EXTI头文件中查看函数并配置EXTI
	EXTI_InitTypeDef EXTI_Initstructure;
	EXTI_Initstructure.EXTI_Line =EXTI_Line14;
	EXTI_Initstructure.EXTI_LineCmd =ENABLE;
	EXTI_Initstructure.EXTI_Mode =EXTI_Mode_Interrupt;
	EXTI_Initstructure.EXTI_Trigger =EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_Initstructure);

5、配置NVIC:

在misc文件里面查看函数并进行配置:

前面提到过:优先级分组方式是通过函数进行配置而自行选择的,这就需要用到上图中第一个函数,这里因为只有一个中断,所以选择哪个分组方式都可以,为了平均分配选择了第二种分组方式;第二个函数是NVIC的初始化,和GPIO、AFIO一样都需要定义一个结构体,然后再依次把子成员引出赋值;


	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_Initstructure;
	NVIC_Initstructure.NVIC_IRQChannel =EXTI15_10_IRQn;
	NVIC_Initstructure.NVIC_IRQChannelCmd =ENABLE ;
	NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority =1;
	NVIC_Initstructure.NVIC_IRQChannelSubPriority =1;
	NVIC_Init(&NVIC_Initstructure);

结构体的选中第一个子成员跳转定义之后:

得到如下图所示:因为是中等容量,所以选择展开MD系列,因为是B14引脚,所以选择EXTI15_10_IRQn

同理,第二个操作同理;第三个和第四个子成员进行选中搜索之后,也就是出现了下图:

这和我们前面的分组方式一样,因为我们选择的是第二种分组,可以看到第三和第四子成员的复制范围都在0~3,这里就随便选择,都选择1即可;

直到这里外部中断的程序就结束了,此时CPU已经能够从主程序跳转到中断程序中去了,但接下来我们还要写中断函数:

6、中断函数

在STM32中中断函数的名字都是固定的,每个中断通道对应一个中断函数,在启动文件中查看中断向量表,就确认中断程序名:

这些以IRQHandler结尾的都是中断函数名,其中EXTI15_10_IRQHandler就是通道15-10的中断函数名(因为我用的是B14引脚)

然后在函数里第一步一般是进行中断标志位的判断,这样才能确保是我们想要的中断源触发的中断,因为这个函数EXTI10-EXTI15都能触发中断,我们需要判断是不是EXTI14触发的中断,这时候就要到EXTI头文件进行查找相关的函数去进行判断:

void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14)==SET ) //判断标志位是不是1,函数返回值是SET就说明是14引脚 
                                                触发的中断,SET就是1,高电平,RESET是低电平
	{
		EXTI_ClearITPendingBit(EXTI_Line14); //最后需要清除标志位
	}

}

7、总代码:

#include "stm32f10x.h"                  // Device header

void CountSensor(void)
{
	//开启外设时钟
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB  ,ENABLE ); 
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE );

	//配置GPIO
	GPIO_InitTypeDef GPIO_Instructure;
	GPIO_Instructure.GPIO_Mode =GPIO_Mode_IPU ;
	GPIO_Instructure.GPIO_Pin =GPIO_Pin_14;
	GPIO_Instructure.GPIO_Speed =GPIO_Speed_50MHz ;
	GPIO_Init (GPIOB,&GPIO_Instructure);
	
	//配置AFIO,选择中断引脚(没有单独的AFIO文件,需要到GPIO.h文件寻找)
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
	
	//在EXTI头文件中查看函数并配置EXTI
	EXTI_InitTypeDef EXTI_Initstructure;
	EXTI_Initstructure.EXTI_Line =EXTI_Line14;
	EXTI_Initstructure.EXTI_LineCmd =ENABLE;
	EXTI_Initstructure.EXTI_Mode =EXTI_Mode_Interrupt;
	EXTI_Initstructure.EXTI_Trigger =EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_Initstructure);
	
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_Initstructure;
	NVIC_Initstructure.NVIC_IRQChannel =EXTI15_10_IRQn;
	NVIC_Initstructure.NVIC_IRQChannelCmd =ENABLE ;
	NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority =1;
	NVIC_Initstructure.NVIC_IRQChannelSubPriority =1;
	NVIC_Init(&NVIC_Initstructure);
}

void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14)==SET )
	{
		EXTI_ClearITPendingBit(EXTI_Line14);
	}

}

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

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

相关文章

浏览器指纹技术:如何更改浏览器指纹?

“指纹信息”是一个人独有的身份象征,而“浏览器指纹”,就是网站和在线平台使用浏览器指纹来收集有关您的浏览器、设备和网络的详细信息,它可以说是你上网的身份象征,可让网站跟踪您的在线行为。 下面我们简单科普浏览器指纹的工…

tomato 靶场

1.主机发现 扫描ip及端口 2.端口扫描 nmap192.168.233.131 有三个开放的端口nmap -sC -sV -O 192.168.233.131 -sC常见漏洞脚本扫描 -sV开放端口服务/版本号 -O操作系统探测 3.目录扫描 DIRECTORY: http://192.168.233.131/antibot_image/ http://192.168.233.131/index.h…

单调队列与单调栈<1>——单调队列

单调队列,即队列里的元素单调递增或递减。一般用于求区间内的最值问题。 模板题:P1886 暴力的话很简单,搞定。但是对于来说肯定TLE。所以我们要用单调队列来解决这道题。因为单调队列中元素大小单调递增或递减,所以,队首必定是最…

TwinCAT3 新建项目教程

文章目录 打开TwinCAT 新建项目(通过TcXaeShell) 新建项目(通过VS 2019)

案例精选 | 聚铭网络助力石家庄市栾城区中医院防护体系焕新升级

石家庄市栾城区中医院,坐落于栾城这块历史悠久的热土上,占地广阔,达4200平方米,作为一家享有盛誉的二级甲等综合性中医医疗机构,它不仅是传统医学与现代科技融合的典范,更是区域医疗卫生服务的重要支柱。 …

【JavaScript】详解数组方法 fill()

文章目录 一、fill()方法简介二、fill()方法的基本用法三、fill()方法的进阶用法四、实际应用案例五、注意事项六、总结 在JavaScript中,fill()方法是数组操作中一个非常有用的方法。它可以快速地用特定值填充数组的全部或部分内容。理解fill()方法的工作机制和使用…

深度对话安天王小丰:我们应该从微软“蓝屏”事件学到什么?

ITValue 国内厂商和CrowdStrike的差距,相比于国外厂商和CrowdStrike的差距更大。 作者|张帅 编辑|盖虹达 首发|钛媒体APP ITValue 我们赖以生存的数字世界,可能比想象得还要脆弱。 近日,全球范围内的微软Wi…

基于Gitlab CI+Argo CD的Gitops实践

项目简介 项目说明 本项目构建了一个基于GitOps理念的完整CI/CD管道,旨在实现软件开发与运维的高度自动化和一致性。通过GitLab、GitLab Runner(部署于Kubernetes)、Maven、Java、SonarQube、Harbor以及Argo CD等工具的紧密协作&#xff0c…

二叉树的存储

二叉树的存储 满二叉树或者完全二叉树可以采用顺序存储,普通二叉树一般采用链式存储 节点的结构体原型 typedef int DataType typedef struct node { DataType data; struct node *L; struct node *R; }twotree&#xff…

【数值计算方法】数值积分微分-python实现-p3

原文链接:https://www.cnblogs.com/aksoam/p/18332123 更多精彩,关注博客园主页,不断学习!不断进步! 我的主页 csdn很少看私信,有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xf…

【阅读笔记】红外sensor的ITR、IWR读出模式分析

一、ITR、IWR读出模式分析 InGaAs短波红外探测器具有ITR和IWR两种工作模式。两种工作模式都包括三个相同的工作过程,即复位、积分和读出。每个工作过程的开始与结束都由配置指令码控制,配置指令码包括复位指令、开始积分指令、开始读出指令和读出结束指…

找到学习的引擎,更让你进入心流状态的高效学习

一、心流状态的启动秘籍 1. 简单开始:找到学习的入口 从简单的任务开始,比如整理学习空间或列出学习计划,让大脑逐渐适应学习的节奏。 2. 环境塑造:打造专注的学习空间 清理桌面,减少干扰,比如将手机置…

探索未来之境:揭秘元宇宙(Metaverse)

在科技与想象的交界,一个名为“元宇宙”(Metaverse)的概念正逐渐从科幻走入现实,预示着人类交互与体验的全新纪元。元宇宙不仅是技术的飞跃,更是未来生活方式的蓝图,它模糊了虚拟与现实的界限,开…

Ubuntu配置项目环境

目录 一、Xshell连接云服务器 二、切换到root用户 三、安装jdk 四、安装tomcat 五、安装mysql 1、安装mysql服务器 2、卸载mysql服务器 六、正式进行程序的部署 一、Xshell连接云服务器 要想使用xshell连接上云服务器就需要明确云服务器的几个信息: 1&…

Qt 的径向渐变的类QRadialGradient 学习笔记

QRadialGradient 是 PySide(即 Qt 的 Python 绑定)中用于创建径向渐变的类。径向渐变是一种从中心点向外扩展的渐变效果,与线性渐变不同,线性渐变是沿着一条直线变化的。基本概念 QRadialGradient 可以用来为图形项、形状或背景…

python调用IP摄像头

一、手机端下载软件 至于怎么下载?? 直接去浏览器搜索,并找到对应的下面的这个即可,也可以用我提供的这个链接去下载 IP Camera摄像头app下载-IP Camera无线摄像头app下载 v28.7.3手机客户端 - 多多软件站 二、勾选RTSP服务器&…

【Web 前端开发】vue3开发环境部署

1、安装 Node.js 和 npm 访问 Node.js 官网 下载并安装最新的 LTS 版本。 安装完成后,打开命令行工具, 输入 node -v 和 npm -v 检查安装是否成功。 node -vnpm -v 如下图: 2、安装 Vue CLI 在命令行工具中输入以下命令安装 Vue CLI&…

【刷题汇总 -- 游游的重组偶数、体操队形、二叉树中的最大路径和】

C日常刷题积累 今日刷题汇总 - day0281、游游的重组偶数1.1、题目1.2、思路1.3、程序实现 2、体操队形2.1、题目2.2、思路2.3、程序实现 -- 递归(dfs) 剪枝 3、二叉树中的最大路径和3.1、题目3.2、思路3.3、程序实现 -- 递归树形dp 4、题目链接 今日刷题汇总 - day028 1、游游…

快递进小区太难了!大量快递到底放在哪里?

如今,快递小哥是市民生活中不可或缺的角色,但他们在服务城市、满足市民需求的同时,也会遇到一些不被居民理解的情况。 “为什么不让进小区” “一些高档小区管得严,不让我们快递员进小区送货,但是这个标注是送货上楼的…