STM32:EXTI—外部中断的初始化

news2025/1/21 18:45:51

文章目录

  • 1、中断
    • 1.2 中断系统
    • 1.3 中断执行流程
  • 2、STM32中断
    • 2.2EXTI(外部中断)
    • 2.3 EXTI 的基本结构
    • 2.4 AFIO复用IO口
  • 3、NVIC基本结构
    • 3.2 NVIC优先级分组
  • 4、配置EXTI
    • 4.2 AFIO 库函数
    • 4.3 EXTI 库函数
    • 4.4 NVIC 库函数
    • 4.5 配置EXTI的步骤
    • 4.6 初始化EXTI

1、中断

1.2 中断系统

  • 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
  • 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
  • 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。

1.3 中断执行流程

在这里插入图片描述

在主程序中,当他执行到某个地方时,这时无论主程序在干什么事情,只要满足了外设的中断条件,主程序都立即暂停,程序由硬件电路自动跳转到中断程序中。当中断程序执行完后,程序在返回被暂停的地方继续运行。

右边就是中断嵌套的执行流程,当其中一个中断正在执行时,又有新的优先级更高的中断来,那么就会再次打断中断,然后执行新的中断;新的中断结束,再继续原来的中断,原来的中断结束,再继续主程序,这就是中断嵌套。

带有中断的C语言程序如下:
在这里插入图片描述

2、STM32中断

  • 68个可屏蔽中断通道,包含EXTI、TIM、ADC、 USART、SPI、I2C、 RTC等多个外设。
  • 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级响应优先级

2.2EXTI(外部中断)

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

  • 支持的触发方式:上升沿/下降沿/双边沿/软件触发
  • 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(意思是PA0和PB0不能同时使用,或者PA1、PB1、PC1等这样的)。
  • 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒。
  • 触发响应方式:中断响应/事件响应。

2.3 EXTI 的基本结构

外部中断的整体结构图如下所示:
在这里插入图片描述
最左边是GPIO口的外设,比如GPIOA、GPIOB、GPIOC等等,每个GPIO外设有16个引脚,所以进来16根线。

EXTI模块只有16个GPIO的通道,但每个GPIO外设都有16个引脚,如果每个引脚都占用一个通道,那么EXTI的通道就不够用了,因此在这里就会有一个AFIO中断引脚选择的电路模块。

这个AFIO就是一个数据选择器,他可以在前面的3个GPIO外设的16个引脚中选择其中一个连接到后面EXTI的通道里,所以印证了前面我们所说的相同的Pin不能同时出发中断。

然后通过AFIO选择之后的16个通道,就接到了EXTI边沿检测及控制电路上,同时下面还接入了4个外设;这些加起来就组成了EXTI的20个输入信号。

然后经过EXTI电路之后,分为了两种输出。上面部分接NVIC,用来触发中断;下面部分有20条输出线路接到了其他外设,用来触发其他外设中断,也就是事件响应。

2.4 AFIO复用IO口

  • AFIO主要用于引脚复用功能的选择和重定义。
  • 在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。

3、NVIC基本结构

在这里插入图片描述
在STM32系统中,NVIC是用来统一分配中断优先级和管理中断的。NVIC是一个内核外设,是CPU的助手;他有很多输入口,中断线路都可以接过去;线上画了斜杠,上面写了n,意思是一个外设可能同时占用多个通道,因此这里有n条线。

NVIC只有一个出口,NVIC根据每个中断的优先级分配中断的先后顺序,之后通过右边的输出口告诉CPU应该处理哪个中断。

3.2 NVIC优先级分组

为了处理不同形式的优先级,STM32的NVIC可以对优先级进行分组,分为抢占优先级和响应优先级。

  • NVIC的中断优先级由优先级寄存器的4位(0~15)决定(值越小,优先级越高),这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。
  • 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。

在这里插入图片描述

4、配置EXTI

4.2 AFIO 库函数

对于AFIO,ST公司并没有给他分配专门的库函数文件,他的库函数与GPIO在一个文件内。其中红色部分就是与AFIO有关的库函数。
在这里插入图片描述
1.GPIO_AFIODeInit,这个函数是用来复位AFIO外设的,调用一下这个函数,AFIO的配置就会全部清零。

2.GPIO_PinLockConfig,用来锁定GPIO配置,调用这个函数,参数指定某个引脚,那这个引脚就会被锁定,防止意外更改。

3.GPIO_EventOutputConfig,这个函数用来配置AFIO的事件输出功能的。

4.GPIO_EventOutputCmd,也是用来配置AFIO的事件输出功能。

5.GPIO_PinRemapConfig,用来进行引脚重映射,第一个参数选择要重映射的方式,第二个参数是新的状态。

6.GPIO_EXTILineConfig,调用这个函数,就可以配置AFIO的数据选择器,来选择想要的中断引脚。

7.GPIO_ETH_MediaInterfaceConfig,和以太网有关的函数。

4.3 EXTI 库函数

在这里插入图片描述
1.EXTI_DeInit,调用他,可以把EXTI的配置都清除,恢复成上电默认状态。

2.EXTI_Init,根据结构体里面的参数配置EXTI外设,初始化EXTI。

3.EXTI_StructInit,可以把参数的结构体变量赋一个默认值。

4.EXTI_GenerateSWInterrupt,软件出发外部中断,调用这个函数,参数给一个指定的中断线,就能软件出发一次外部中断。

5.FlagStatus EXTI_GetFlagStatus,可以获取指定的标志位是否被置1。

6.EXTI_ClearFlag,可以对置1的标志位进行清除。

7.ITStatus EXTI_GetITStatus,获取中断标志位是否被置1。

8.EXTI_ClearITPendingBit,清除中断挂起标志位。

其中第5、6个函数和第7、8个函数的区别是:第5、6个函数是用在主程序中查看和清除标志位的;而第7、8个函数是在中断函数里查看和清除标志位的。

4.4 NVIC 库函数

在这里插入图片描述
1.NVIC_PriorityGroupConfig,用来中断分组,参数是中断分组的方式。

2.NVIC_Init,根据结构体里面指定的参数初始化NVIC。

3.NVIC_SetVectorTable,设置中断向量表。

4.NVIC_SystemLPConfig,系统低功耗配置。

4.5 配置EXTI的步骤

在这里插入图片描述

上面是外部中断的整体结构图,我们把图中的每个模块都打通,就能实现中断了,分为如下5个步骤:

1、配置RCC,把要涉及的外设的时钟都打开(不打开时钟,外设是无法工作的);

2、配置GPIO,选择我们的端口为输入模式;

3、配置AFIO,选择我们的这一路GPIO,连接到后面的EXIT;

4、配置EXIT,选择边沿触发方式,比如上升沿,下降沿或者双边沿,以及选择触发响应方式,可以选择中断响应和事件响应(一般是中断响应);

5、配置NVIC,给我们这个中断选择一个合适的优先级。

6、通过NVIC,外部中断信号就能进入CPU了,这样CPU才能收到中断信号,才能跳转到中断函数里执行中断程序。

需要注意的是:注意,NVIC不需要手动开启时钟,因为NVIC属于内核中的外设,内核中的外设是不需要手动开启时钟的。

4.6 初始化EXTI

例如我们需要对一个对射式红外传感器进行计次,先将传感器的功能封装在一个模块里,对这个传感器的初始化配置如下:

#include "stm32f10x.h"  // Device header

void CountSensor_Init(void)
{
//1.配置RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //开启GPIOB的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO的时钟
	//RCC管的是内核外的外设
	//AFIO也是APB2外设总线上的
	//EXTI和NVIC两个外设时钟是一直都打开的,不需要我们再开启时钟
	//NVIC是内核的外设,内核的外设不需要开启时钟

//2.配置GPIO
	GPIO_InitTypeDef GPIO_Initstructure;
	GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPD;//选择模式
	GPIO_Initstructure.GPIO_Pin=GPIO_Pin_14;//选择引脚
	GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_Initstructure);//调用函数,初始化GPIOB外设

//3.配置AFIO	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);  //配置AFIO外部中断引脚
	//当执行完这个函数后,AFIO的第14个引脚数据选择器就拨好了
	//输入端被拨到了GPIO外设上,对应的就是PB14号引脚;输出端固定连接的是EXTI的第14个中断线路。
	//这样PB14号引脚的电平信号就可以顺利通过AFIO,进入后面的EXTI电路了

//4.配置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
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置优先级分组:先占优先级和从占优先级
	
//6.调用NVIC_Init函数
	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);
	
}

外部中断的信号从GPIO到AFIO,再到EXTI,再到NVIC,最终通向CPU,这样才能让CPU由主程序跳转到中断程序执行。

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

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

相关文章

工作中使用IDEA查看Stream变化

工作中使用IDEA查看stream变化 代码debug调试 代码 package com.demo;import java.util.stream.LongStream;public class LamdaDemo {public static void main(String[] args) {long[] dataResult LongStream.of(1,5,7,9).filter(data -> data > 10).map(data -> da…

答辩PPT设计太耗时?aippt工具,AI一站式服务

这些网站我愿称之为制作答辩PPT的神! 很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路,一窍不通。但这并不是你们的错,对于平时没接触过相关方面,第一次搞答辩PPT的人来说,这是很正常的一件事。一个好的答辩PPT…

无线领夹麦克风怎么挑选?无线麦克风怎么用?主流机型推荐必看

​在短视频与直播盛行的当下,一款优质的麦克风无疑是提升作品音质的得力助手,让你的创作更具质感。作为一名短视频博主,我在拍摄和直播的过程中也积累了不少使用麦克风的经验,深知哪些无线麦克风既好用又价格亲民。接下来&#xf…

【MinGW】MinGW-w64的安装及配置教程

目录 🌞1. MinGW简介 🌞2. MinGW安装详情 🌊2.1 资源包获取 🌊2.2 安装详情 🌞1. MinGW简介 MinGW (Minimalist GNU for Windows) 是一个在 Windows 平台上开发软件的开发工具集合。它提供一组用于编译 Windows 应…

Python自动化SQL注入和数据库取证工具库之sqlmap使用详解

概要 在网络安全领域,SQL注入仍然是最常见的攻击之一。sqlmap是一个开源的自动化SQL注入和数据库取证工具,它提供了广泛的功能来检测和利用SQL注入漏洞。本文将详细介绍sqlmap的安装、特性、基本与高级功能,并结合实际应用场景,展示其在网络安全测试中的应用。 安装 sqlm…

便签字号怎么改 便签字体大小调节方法

在日常工作和生活中,便签是我形影不离的助手。每当灵感闪现或是有待办事项时,我都会随手记录在便签上,它就像我生活中的记事本,帮助我安排生活和工作。 然而,每个人都有不同的视觉需求和阅读习惯,对于便签…

设计说明-行为型-状态模式-State

状态接口 public interface State {//状态接口void insertQuarter();//投币void ejectQuarter();//退币void turnCrank();//按下“出纸巾”按钮void dispense();//出纸巾 } 有纸巾类 public class HasQuarterState implements State {private TissueMachine tissueMachine;O…

【MySQL】sql表设计的注意事项

程序员的实用神器 文章目录 程序员的实用神器强烈推荐引言注意事项强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 推荐一个个人工作&#x…

文档加密软件大比拼:哪款更适合你

在数字时代的浪潮中,信息安全成为了每个人和企业都无法忽视的重要议题。文档加密软件作为保护数据安全的重要手段,其种类繁多,功能各异。本文将带您走进文档加密软件的世界,对比多款热门产品,助您找到最适合自己的加密…

代码随想录训练营Day 28|力扣216.组合总和III、17.电话号码的字母组合

1.组合总和3 题目链接/文章讲解: 代码随想录 视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili 代码:(这里剪枝的思路和昨天发的一样) class Solution { priv…

vue 运行项目node-scss报错

vue项目node版本与自己电脑node版本不一样运行node导致报错 node-sass模块对node版本有兼容性,版本不适配,就容易报错 解决方案: 在项目目录下打开cmd: 输入命令: npm rebuild node-sass 然后再更新一下:…

linux性能监控之free

free:linux系统自带命令,显示内存状态,命令查询来源于/proc/meminfo 文件 [rootk8s-master ~]# free --helpUsage:free [options]Options:-b, --bytes show output in bytes-k, --kilo show output in kilobytes-m, --mega…

macOS上使用qt creator编译调试ffmpeg.c

1 前言 上文macOS上将ffmpeg.c编译成Framework介绍了使用xocde将ffmpeg.c编译成Framework的方法,这里列举另外一种办法,就是用qt creator来完成这件事情。 编译环境如下: qt creator 9.0.2;ffmpeg release/6.1; 2 编译ffmpeg.c 大…

应用层(上篇)

应用层 应用层协议原理 网络应用程序体系解构 应用程序体系结构: 由应用程序研发者设计规定了如何在各种端系统上组织该应用程序。在选择应用程序体系结构时,应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一:客户-服务器体系结构或对等…

C语言例题41、八进制转换为十进制

#include<stdio.h>void main() {int x;printf("请输入一个8进制整数&#xff1a;");scanf("%o", &x);printf("转换成十进制后的整数为%d\n", x); }运行结果&#xff1a; 本章C语言经典例题合集&#xff1a;http://t.csdnimg.cn/FK0Qg…

网上办理无犯罪证明

在微信小程序 搜 比如 河南 就搜 河南无犯罪证明&#xff0c;这个时候会出现一个公众号&#xff0c;进去之后注册一个账号和密码&#xff1b;登录成功后并找到无犯罪证明&#xff0c;按照人家的操作步骤进行操作&#xff1b;最终预约成功后 几个工作日会给你发一个电子版的无犯…

【Python】一文详细介绍 pkl格式 文件

【Python】一文详细介绍 pkl格式 文件 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支持~ &#x…

(八)SQL基础知识练习题(选择题)(下)#CDA学习打卡

本文整理了SQL基础知识相关的练习题&#xff0c;共133道&#xff0c;可作为CDA一级的补充习题&#xff0c;也适用于刚入门初级SQL想巩固基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-SQL&#xff09;。暂时按照原题库顺序present&#xff0c;如有需要之…

【每日刷题】Day40

【每日刷题】Day40 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 2. 217. 存在重复元素 - 力扣&#xff08;Le…

优选算法——双指针1

双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼 近…