(STM32笔记)十一、通过EXTI外部中断实现 按键控制LED
我用的是正点的
STM32F103来进行学习,板子和教程是野火的指南者。
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。
十一、通过EXTI外部中断实现 按键控制LED
- 十一、通过EXTI外部中断实现 按键控制LED
- 1、按键模块
- 按键原理图
- 按键程序思路
- 2、中断模块
- 初始化EXTI用来产生中断
- 配置中断优先级
- 初始化EXTI 使PA0触发外部中断
- 编写中断服务函数
- 3、main()函数修改
- 4、初始化总结
- 按键初始化
- NVIC嵌套向量中断初始化
- EXTI外部中断初始化
- LED初始化
- interrupt(IT)中断初始化
十一、通过EXTI外部中断实现 按键控制LED
1、按键模块
按键原理图
可以看到在未按下时,引脚是低电平,按下之后变成高电平。

按键程序思路

- 初始化Key1 Key2所在GPIO的时钟
void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)
第一个参数为设置何处时钟,第二个参数为ENABLE或者DISABLE

- 新建Key1 Key2对应的GPIO结构体
GPIO_InitTypeDef GPIO_InitStructure;
成员分别包括 引脚、时钟速率、模式

- 初始化GPIO结构体
GPIO_InitStructure.GPIO_Pin = macKEY1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = macKEY1_GPIO_Mode;
因为在按下按键后会有一个电压上升沿,所以GPIO模式应该设置为 浮空输入(FLOATING)

- 使用GPIO引脚初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
GPIOx: 指向要配置的 GPIO 端口(如 GPIOA, GPIOB 等)。
GPIO_InitStruct: 指向包含引脚配置的结构体的指针。
如:
GPIO_Init ( macKEY1_GPIO_PORT, & GPIO_InitStructure );
- 检测按键是否被按下
uint8_t Key_Scan ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, uint8_t ucPushState, uint8_t * pKeyPress )
- 读取按键的当前状态。
- 如果按键处于按下状态,延时一段时间(消抖)。
- 再次读取按键状态,确认按下后,标记按键被按下过。
- 如果按键释放并且之前标记过按下,则认为按键被单击,返回1。
- 否则返回0。

2、中断模块
初始化EXTI用来产生中断

配置中断优先级
static void EXTI_NVIC_Config(void)
这个 EXTI_NVIC_Config 函数用于配置嵌套向量中断控制器(NVIC),以便为外部中断(EXTI)设置适当的中断优先级和使能。具体来说,它配置了 EXTI0 线路的中断。
- 配置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
配置 NVIC 的优先级分组。NVIC_PriorityGroup_1 表示中断优先级分组 1,该分组将优先级划分为两部分:抢占优先级和子优先级。
NVIC_PriorityGroup_1通常将 4 位优先级分为 1 位抢占优先级和 3 位子优先级。抢占优先级用于打断其他中断,子优先级用于决定同级别抢占优先级中断的处理顺序。

- 配置 EXTI0 中断

-
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
配置中断通道为EXTI0_IRQn,即外部中断线 0 对应的中断通道。

-
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
设置抢占优先级为 1。抢占优先级越低,优先级越高。 -
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
设置子优先级为 1。在抢占优先级相同的情况下,子优先级越低,优先级越高。 -
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
使能 EXTI0 中断通道。
- 初始化 NVIC
NVIC_Init(&NVIC_InitStruct);
调用 NVIC_Init 函数,使用配置好的 NVIC_InitStruct 结构体初始化 NVIC。
这样,当 EXTI0 中断发生时,NVIC 会根据配置的优先级正确处理中断。
初始化EXTI 使PA0触发外部中断
这段代码用于初始化外部中断/事件控制器(EXTI),使能 GPIOA 的第 0 引脚(PA0)触发的外部中断。下面是详细解释每一行代码的作用:
- 使能 AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- 使能替代功能(Alternate Function I/O, AFIO)时钟。AFIO 控制 GPIO 引脚的重映射和外部中断配置。
RCC_APB2PeriphClockCmd函数用来配置外设时钟,RCC_APB2Periph_AFIO表示 AFIO 模块。
- 配置 GPIO 引脚与 EXTI 线的连接
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
- 配置 GPIOA 的第 0 引脚(PA0)连接到 EXTI 线 0。
GPIO_EXTILineConfig函数将指定的 GPIO 引脚连接到对应的 EXTI 线。GPIO_PortSourceGPIOA: 指定 GPIOA 端口。GPIO_PinSource0: 指定端口的第 0 引脚。
- 配置 EXTI 线
-
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
配置 EXTI 线 0(对应 PA0)。 -
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
配置 EXTI 模式为中断模式。

-
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
配置 EXTI 触发方式为上升沿触发(即信号从低电平变为高电平时触发中断)。

-
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
使能 EXTI 线。
- 初始化 EXTI
EXTI_Init(&EXTI_InitStruct);
- 调用
EXTI_Init函数,使用配置好的EXTI_InitStruct结构体初始化 EXTI。 - 该函数根据结构体配置,将 EXTI 线 0 设置为上升沿触发的中断模式,并使能该中断线。
这样,当 PA0 引脚的电平从低变高时,会触发 EXTI 线 0 的中断。
编写中断服务函数
-
在启动文件
startup_stm32f10x_hd.s中找到中断函数名为EXTI0_IRQHandler

-
在中断源文件
stm32f10x_it.c中添加中断函数

-
当EXTI0被触发时,开关绿灯

-
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
使用此函数检测到中断时,返回1或0。

-
macLED1_TOGGLE();
利用bsp_led.h里的函数翻转绿灯

-
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
利用此函数来清除中断位,防止一直在中断内。
3、main()函数修改

添加按键、中断 和 LED 的初始化函数
4、初始化总结
按键初始化
- 按键时钟初始化
- 按键GPIO初始化
NVIC嵌套向量中断初始化
- 配置NVIC的优先级分组
- 配置GPIO引脚与EXTI事件线的连接
- NVIC初始化
EXTI外部中断初始化
- EXTI时钟初始化
- EXTI事件线初始化
LED初始化
- LED时钟初始化
- LED的GPIO初始化
interrupt(IT)中断初始化
- 在启动文件中找到对应的函数名
- 编写中断函数并添加到头文件中
相关文章:
(STM32笔记)十一、通过EXTI外部中断实现 按键控制LED
我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 十一、通过EXTI外部中断实现 按键控制LED 十一、通过EXTI外部中断实现 按键控制LED1、按键模块按键原理图按键程序思路 2、中…...
假如家里太大了,wifi连不上了怎么办
最近有个土豪朋友抱怨,他家里太大了,一个路由器的Wi-Fi信号根本无法覆盖他们家的每个房间,都没办法上网看奥运会比赛了。(还好我是穷人,就没有这种烦恼T_T)。 然后我问他为何不用一个路由器作主路由器&…...
elementPlus 设置el-input文本域固定高度和禁止下拉
elementPlus 设置el-input文本域固定高度和禁止下拉 话不多说直接上代码 // resize"none" 禁止下拉<el-inputv-model"textarea"style"width: 240px"type"textarea"resize"none"placeholder"请输入"/>// 设…...
(转)领导人必过的三道关
为什么企业领导人享受优厚的待遇,为什么董事会对企业领导人千挑万选?因为企业生命如此脆弱,据美国《财 富》杂志报道,世界500强企业平均寿命40年,世界1000强企业平均寿命30年,一般跨国公司平均寿命10年。而就是这脆弱…...
速盾:cdn可以定时刷新缓存吗?
CDN(Content Delivery Network)是一种通过在全球各地分布的服务器上缓存和传送网站内容的技术,以提高用户访问速度和降低服务器负载。CDN的缓存机制可以减少用户对源服务器的请求次数,从而提高网站的响应速度和性能。但是…...
代码随想录算法训练营第二十九天| 62.不同路径、63. 不同路径 II
写代码的第二十九天 继续动归!!! 62.不同路径 思路 解决问题1:dp[i][j]的的含义是什么?本题给的是一个二维的表,判断从左上角走到右下角有多少种路径,所以dp应该是二维数组,dp[i]…...
Go+Redis零基础到用户管理系统API实战_20240730 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227 基础不好的同学每节课的代码最好配合视频进…...
ScreenAgent:基于LVLM的计算机控制智能体
ScreenAgent : A Vision Language Model-driven Computer Control Agent 论文链接: https://arxiv.org/abs/2402.07945https://arxiv.org/abs/2402.07945IJCAI 2024 1.概述 大型语言模型(LLM),诸如ChatGPT与GPT-4,在自然语言处理领域(涵盖生成、理解及对话等任务)展现出…...
谷粒商城实战笔记-129-商城业务-商品上架-nested数据类型场景
文章目录 扁平化处理扁平化处理导致的检索问题 解决方案:使用 nested 结构 在es的数据类型中有一个nested类型,本讲将重点讨论这个类型。 扁平化处理 PUT my_index/doc/1 {"group" : "fans","user" : [{"first&quo…...
axios请求响应拦截器
目录 axios-拦截器 拦截器的作用 请求拦截器-基本写法: axios请求拦截器-统一设置token 需求: 核心步骤: 关键代码: 响应拦截器-基本写法: axios响应拦截器-统一处理token失效 需求: 核心步骤: 关键代码: axios响应拦截器-数据剥离 需求: 核心步骤: 关键代码: ax…...
Python 中单例模式实现的几种方式
在设计模式中,单例模式是经常被提及和使用的一种模式。它保证一个类只有一个实例,并提供全局访问点。在Python中,有多种实现单例模式的方法。那么,如何选择合适的方法来实现单例模式呢? 单例模式在Python中的几种实现方…...
mysql数据库触发器同步数据
首先检查数据源库是否支持触发器,show ENGINES,如果FEDERATED是NO,表示未开启,如需开启,再mysql配置文件中,添加federated配置到mysqld下面。 一、同服务器不同库触发器同步,这里只举例插入数据…...
Prometheus-v2.45.0+Grafana+邮件告警
目录 普罗米修斯监控架构介绍 Prometheus 监控架构 1. 数据抓取(Scraping) 2. 时序数据库(TSDB) 3. 数据模型 4. PromQL 查询语言 5. 告警(Alerting) 6. Alertmanager 7. 可视化(Visu…...
LeetCode——572. 另一颗树的子树
通过万岁!!! 题目:给你两棵树,然后问subRoot是不是root的子树。也就是root某个节点的所有孩子节点在值和结构上完全与subRoot相同。思路:我的思路比较简单,就是遍历root,遇到root中…...
Spring Boot整合MyBatis-Flex
说明:MyBatis-Flex(官网地址:https://mybatis-flex.com/),是一款数据访问层框架,可实现项目中对数据库的访问,类比MyBatis-Plus。本文介绍,在Spring Boot项目整合MyBatis-Flex。 创…...
重塑未来体验:边缘计算与云原生的完美邂逅
🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、云原生的兴起 2、边缘计算的兴起 二、边缘计算基础 …...
浅谈基础数论(c++)
目录 一些常见的符号表示阶乘定理 快速幂模板题代码扩展:矩阵快速幂主要作用 欧拉函数扩展积性函数 欧拉函数求法筛选法求欧拉函数(积性函数) 扩展欧几里得裴蜀定理问题分析代码 问题分析 同余与逆元如何求解逆元扩展欧几里得 例题讲解X-Magi…...
jdk 17新特性 sealed 关键字
通俗理解 sealed 关键字就是给对象继承加了权限控制一样,你必须在我的规则范围内才可以继承我的类 使用 permits 关键字控制允许哪些子类继承 子类必须加以下三个关键字: final 最终继承类(继承到这个类就不允许再往下继承了)n…...
在仪器计量校准中,无尘车间洁净室检测有哪些方法和流程?
仪器计量校准行业内,无尘车间洁净室检测可以说是较为热门的业务,因为其预算高,且检测流程不是太繁琐,很多仪器计量校准机构也是设立相关实验室,专门处理相关仪器的检测。不过虽然许多机构想要涉足该领域,但…...
【跨时代】第四次工业革命彻底来袭!什么是AI+
你有没有一种很割裂的感觉,就是在短视频里,AI已经要改变全世界了 但自己一用,却发现只能和AI聊聊天 画几张图 难道是姿势不对?但具体是哪里不对呢。 作为一个老牌程序员,我前面分享了很多计算机相关内容,总…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
