GPIO中断
1.EXTI简介
EXTI是External Interrupt的缩写,指外部中断。在嵌入式系统中,外部中断是一种用于处理外部事件的机制。当外部事件发生时(比如按下按钮、传感器信号变化等),外部中断可以立即打断正在执行的程序,转而执行一个特定的中断服务程序(ISR),以响应和处理外部事件。
在大多数嵌入式系统中,外部中断可以配置为上升沿触发、下降沿触发、高电平触发、低电平触发等不同的触发方式,以适应不同的外部事件类型。外部中断通常用于实时性要求较高的应用,如实时控制系统、传感器数据采集等。
在使用外部中断时,需要了解具体的硬件平台和编程语言的相关知识,以确保正确地配置和处理外部中断。
2.EXTI功能框图讲解
首先,中断源从输入线进入,总共有20根中断/事件线,每一条线对应着PXx,例如EXTI0的输入源可以是PX0(X为A、B、C、D、E、F、G、H、I),因为GPIO端口有16个,所以x的取值在0-15,EXTI16的输入源是PVD输出,EXTI17的输入源是RTC闹钟事件,EXTI18的输入源是USB唤醒事件,EXTI19的输入源是以太网唤醒事件(只适用互联型)。
通过外部中断配置寄存器1(AFIO_EXTICR1)配置来选择输入线,每一个EXTIx有四个位,可以选择16个GPIO端口。
选择输入线和输入源后进入边缘检测电路 ,边缘检测电路通过寄存器上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)选择触发方式。
通过配置的触发方式,边缘检测电路输出“1”给到或门,然后另一个输入由软件中断事件寄存器输入,当软件中断事件寄存器相应位为’0’时,写’1’将设置EXTI_PR中相应的挂起位,是否相应中断请求由后面的总开关中断屏蔽寄存器(EXTI_IMR)决定,这样或门输入两个“1”,或门也输出“1”,将这个“1”输入给请求挂起寄存器就是中断,输入给与门就是事件,然后请求挂起寄存器输出“1”给与门,然后中断屏蔽寄存器(EXTI_IMR)对应位置“1”,开放来自线x的中断请求,与门输出“1”给到NVIC中断控制器,NVIC在内核中,由内核响应这个中断,内核就会去查找相应的中断服务函数ESR。
3.GPIO中断实例
3.1.初始化GPIO
通过原理图查看按键对应的GPIO端口
通过原理图可以知道按键SW2连接的是GPIO的PA0,那么我们需要初始化PA0,并且将PA0连接到EXTI0。
初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);
3.2.初始化EXTI用于产生中断/事件
初始化EXTI方法和初始化GPIO相似,首先打开系统时钟,然后选择输入线,通过函数GPIO_EXTILineConfig()配置,接着通过EXTI_InitTypeDef结构体定义一个变量,通过这个变量配置EXTI的输入线、模式、触发方式,然后将配置的结构体变量的地址传递给初始化EXTI函数EXTI_Init()。
EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
3.3.初始化NVIC
初始化NVIC和初始化GPIO和初始化EXTI相似,都需要通过定义结构体变量去配置相应参数。首先定义结构体变量NVIC_InitStructure。然后设置中断优先级级分组,通过函数NVIC_PriorityGroupConfig(),有5个组
没个组有主优先级和次优先级,我们配置中断优先级的时候stm32使用了四个位,当主优先级只是用0位时,取值就是0,次优先级就使用四个位,取值就是0-15。同理,当主优先级只是用1位时,取值就是0-1,次优先级就使用3个位,取值就是0-7,以此类推。然后通过定义的结构体变量配置中断源,抢占优先级,子优先级。注意这里的中断源配置,如果是GPIO0-4都是单独的EXTIx_IRQn,但是如果你说4以后的端口,就会使用到EXTI9_5_IRQn和EXTI15_10_IRQn。然后将配置的结构体变量的地址传递给初始化NVIC初始化函数NVIC_Init()。
NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
3.4.编写中断服务函数
通断服务函数都放在stm32f10x_it.c这个文件里面,中断服务函数的名字已经定义好了,放在startup_stm32f10x_hd.s文件的向量表中。通过if语句判断函数EXTI_GetITStatus()的返回值来判断是否产生中断,如果产生中断EXTI_GetITStatus()返回值位1。通过宏定义LED_G_TOGGLE
#define LED_G_TOGGLE {GPIOB->ODR ^= GPIO_Pin_0;}
通过控制端口输出数据寄存器ODR异或运算控制LED交替,异或运算符与1异或改变,与0异或不变。为了防止一直在中断里面,最后需要清除中断位,通过函数 EXTI_ClearITPendingBit()。
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){LED_G_TOGGLE;}EXTI_ClearITPendingBit(EXTI_Line0);
}
3.5.main函数
最后,通过main函数调用前面写的函数
int main(void)
{LED_GPIO_RCC();LED_GPIO_Config();EXIT_Key_Config();while(1){}
}
相关文章:

GPIO中断
1.EXTI简介 EXTI是External Interrupt的缩写,指外部中断。在嵌入式系统中,外部中断是一种用于处理外部事件的机制。当外部事件发生时(比如按下按钮、传感器信号变化等),外部中断可以立即打断正在执行的程序࿰…...

springboot完成一个线上图片存放地址+实现前后端上传图片+回显
1.路径 注意路径 2.代码:(那个imagePath没什么用,懒的删了),注意你的本地文件夹要有图片,才可以在线上地址中打开查看 package com.xxx.common.config;import org.springframework.beans.factory.annotat…...
编程思维与生活琐事的内在关联及其应用价值
随着科技的日益普及和信息化时代的到来,编程作为一种现代技能,其影响已不再局限于专业领域,而是逐步渗透到人们的日常生活之中。探讨编程与生活琐事之间的关系,有助于我们更好地理解如何将技术智慧应用于日常管理,提升…...

OSPF排错
目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …...

day07-CSS高级
01-定位 作用:灵活的改变盒子在网页中的位置 实现: 1.定位模式:position 2.边偏移:设置盒子的位置 left right top bottom 相对定位 position: relative 特点: 不脱标,占用自己原来位置 显示模…...

05 MP之ActiveRecord模式+SimpleQuery
1. ActiveRecord ActiveRecord(活动记录,简称AR),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。 其目标是通过围绕一个数据对象, 进行全部的CRUD操作。 1.1 让实体类…...
git diff查看比对两次不同时间点提交的异同
git diff查看比对两次不同时间点提交的异同 用 git diff命令: git diff commit-id-1 commit-id-2 不同commit-id在不同的时间点提交产生,因为也可以认为git diff是比对两个不同时间点的代码异同。 git diff比较不同commit版本的代码文件异同_git diff c…...

基于muduo网络库开发服务器程序和CMake构建项目 笔记
跟着施磊老师做C项目,施磊老师_腾讯课堂 (qq.com) 一、基于muduo网络库开发服务器程序 组合TcpServer对象创建EventLoop事件循环对象的指针明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数在当前服务器类的构造函数当中,注册处理连接的回调函数和处理…...
前端支持下载模板、导入数据、导出数据(excel格式)
前言 xlsx是由SheetJS开发的一个处理excel文件的npm库,适用于前端开发者实现下载模板、导入导出excel文件等需求,演示的项目的技术栈为vue3 elementPlus 一. 引入xlsx 安装xlsx npm install xlsx引入xlsx import * as XLSX from xlsx;二. 下载模板 const han…...
编译Faiss-gpu【InterMKL】C++ 按步骤操作 基本不会有问题的 python原理相同。
编译Faiss-gpu C++ 基本介绍 使用Faiss版本【1.7.4】 该项目依赖于BLAS 组件 OpenBLAS 和 IntelMKL BLAS 【官方支持】 IntelMKL 会比 OpenBLAS 快的多。 【来自官方结论】 本机环境 Cuda :11.1 Cuda-Driver: 515 InterMKL: 2021.2.0 Faiss :1.7.4 注意:faiss仅…...
conn.execute的用法详解
conn.execute的用法详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入研究数据库连接中conn.execute的用法,解析它的功能、…...
GetBuffer() 与 ReleaseBuffer() 使用详解
GetBuffer() 与 ReleaseBuffer() 使用详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入研究在编程中常用的GetBuffer()与ReleaseBuff…...

Flink CEP(基本概念)
Flink CEP 在Flink的学习过程中,我们已经掌握了从基本原理和核心层的DataStream API到底层的处理函数,再到应用层的Table API和SQL的各种手段,可以应对实际应用开发的各种需求。然而,在实际应用中,还有一类更为复…...
[AIGC] Spring Gateway与 nacos 简介
文章目录 Spring Gateway简介主要特性优点总结 Nacos简介主要特性优点总结 Spring Gateway 简介 Spring Gateway是一个基于Spring Framework的工具,用于构建和管理微服务架构中的网关。它提供了一种简单而灵活的方式来路由和过滤请求,以及在微服务之间…...

2024-2-3-复习作业
1> 要求: 效果图: 2> 要求: 效果图: 3> 要求: 效果图: 源代码: #include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct Node {datatype data…...
【如何快速上手Vue.js框架——详细介绍】
如何快速上手Vue.js框架——详细介绍 1. 介绍2. 理解Vue.js的核心概念3. 搭建开发环境4. 创建第一个项目5. 学习基础6. 进阶概念7. 最佳实践和模式8. 构建和部署9. 持续学习10. 实际操作 1. 介绍 要快速上手Vue.js框架,可以按照以下步骤进行学习和实践:…...

1Panel应用推荐:青龙定时任务管理平台
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...

BUUCTF-Real-[struts2]s2-013
struts2的标签中 <s:a> 和 <s:url> 都有一个 includeParams 属性,可以设置成如下值none - URL中不包含任何参数(默认) get - 仅包含URL中的GET参数 all - 在URL中包含GET和POST参数 当includeParamsall的时候,会将本次…...

【实战知识】使用Github Action + Nginx实现自动化部署
大家好啊,我是独立开发豆小匠。 先说一下背景~ 我的小程序:豆流便签,目前使用云托管部署后端服务,使用轻量级服务器部署数据库和一些中间件。 因此服务器成本:云托管 + 云服务器 云托管每周花费5元,一个月就是50,一年就是500啊,所以这期准备把云托管优化掉! 1. 需…...

web前端--------渐变和过渡
线性渐变,是指颜色沿一条直线进行渐变,例如从上到下、从左到右。 当然,CSS中也支持使用角度来设置渐变的方向,角度单位为deg。 0deg,为12点钟方向,表示从下到上渐变。 90deg,为3点钟方向&…...
Global Security Market知识点总结:主经纪商业务
在全球证券市场的复杂体系中,主经纪商业务(Prime Brokerage)占据着独特且关键的位置。这一业务为大型机构投资者提供了一系列至关重要的服务,极大地影响着金融市场的运作与发展。 一、主经纪商业务的定义 主经纪商业务是投资银行…...

如何用AI高效运营1000+Tiktok矩阵账号
在当今数字化的时代,Tiktok 矩阵账号运营成为了众多企业和个人追求流量与变现的重要手段。然而,面对众多的账号管理,如何高效运营成为了关键。此时,AI 工具的出现为我们提供了强有力的支持。 一、Tiktok 矩阵账号的重要性 Tiktok…...
LangChainGo入门指南:Go语言实现与OpenAI/Qwen模型集成实战
目录 1、什么是langchainGo2、langchainGo的官方地址3、LangChainGo with OpenAI3-1、前置准备3-2、安装依赖库3-3、新建模型客户端3-4、使用模型进行对话 4、总结 1、什么是langchainGo langchaingo是langchain的go语言实现版本 2、langchainGo的官方地址 官网:…...
SpringBoot3项目架构设计与模块解析
一、项目概述 这是一个基于SpringBoot3构建的企业级后台管理系统,从项目结构来看,系统采用了经典的分层架构设计,包含完整的控制器层、服务层、数据访问层和实体层。项目整合了Web开发、数据库访问、权限控制等核心功能模块。 二、项目整体…...

[Spring]-AOP
AOP场景 AOP: Aspect Oriented Programming (面向切面编程) OOP: Object Oriented Programming (面向对象编程) 场景设计 设计: 编写一个计算器接口和实现类,提供加减乘除四则运算 需求: 在加减乘除运算的时候需要记录操作日志(运算前参数、运算后结果)实现方案:…...
CSS中text-align: justify文本两端对齐
text-align: justify; 是 CSS 中用于控制文本对齐方式的属性值,它的核心作用是让文本两端对齐(分散对齐),使段落左右边缘整齐排列。以下是详细解析: 作用效果 均匀分布间距 浏览器会自动调整单词/字符之间的间距&#…...
【 java 集合知识 第一篇 】
目录 1.概念 1.1.集合与数组的区别 1.2.集合分类 1.3.Collection和Collections的区别 1.4.集合遍历的方法 2.List 2.1.List的实现 2.2.可以一边遍历一边修改List的方法 2.3.List快速删除元素的原理 2.4.ArrayList与LinkedList的区别 2.5.线程安全 2.6.ArrayList的扩…...

小白如何在cursor中使用mcp服务——以使用notion的api为例
1. 首先安装node.js,在这一步的时候不要勾选不要勾选 2. 安装完之后,前往notion页面 我的创作者个人资料 | Notion 前往集成页面,添加新集成,自己输入名字,选择内部 新建完之后,进入选择只读 复制密匙 然后前往cursor页面 新建…...
SpringBoot 系列之集成 RabbitMQ 实现高效流量控制
系列博客专栏: JVM系列博客专栏SpringBoot系列博客 Spring Boot 2.2.1 集成 RabbitMQ 实现高效流量控制 在分布式系统中,消息队列是实现异步通信、解耦服务的重要组件。RabbitMQ 作为一款成熟的开源消息队列,广泛应用于各类项目中。本文将…...

Deepseek/cherry studio中的Latex公式复制到word中
需要将Deepseek/cherry studio中公式复制到word中,但是deepseek输出Latex公式,比如以下Latex代码段,需要通过Mathtype翻译才能在word中编辑。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…...