当前位置: 首页 > news >正文

(STM32笔记)十一、通过EXTI外部中断实现 按键控制LED

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。

十一、通过EXTI外部中断实现 按键控制LED

  • 十一、通过EXTI外部中断实现 按键控制LED
    • 1、按键模块
      • 按键原理图
      • 按键程序思路
    • 2、中断模块
      • 初始化EXTI用来产生中断
        • 配置中断优先级
        • 初始化EXTI 使PA0触发外部中断
      • 编写中断服务函数
    • 3、main()函数修改
    • 4、初始化总结
      • 按键初始化
      • NVIC嵌套向量中断初始化
      • EXTI外部中断初始化
      • LED初始化
      • interrupt(IT)中断初始化

十一、通过EXTI外部中断实现 按键控制LED

1、按键模块

按键原理图

可以看到在未按下时,引脚是低电平,按下之后变成高电平。
在这里插入图片描述

按键程序思路

在这里插入图片描述

  1. 初始化Key1 Key2所在GPIO的时钟

void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)

第一个参数为设置何处时钟,第二个参数为ENABLE或者DISABLE
在这里插入图片描述

  1. 新建Key1 Key2对应的GPIO结构体

GPIO_InitTypeDef GPIO_InitStructure;

成员分别包括 引脚、时钟速率、模式
在这里插入图片描述

  1. 初始化GPIO结构体

GPIO_InitStructure.GPIO_Pin = macKEY1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = macKEY1_GPIO_Mode;

因为在按下按键后会有一个电压上升沿,所以GPIO模式应该设置为 浮空输入(FLOATING)
在这里插入图片描述

  1. 使用GPIO引脚初始化函数

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

GPIOx: 指向要配置的 GPIO 端口(如 GPIOA, GPIOB 等)。
GPIO_InitStruct: 指向包含引脚配置的结构体的指针。

如:
GPIO_Init ( macKEY1_GPIO_PORT, & GPIO_InitStructure );

  1. 检测按键是否被按下

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 线路的中断。

  1. 配置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

配置 NVIC 的优先级分组。NVIC_PriorityGroup_1 表示中断优先级分组 1,该分组将优先级划分为两部分:抢占优先级和子优先级。

  • NVIC_PriorityGroup_1 通常将 4 位优先级分为 1 位抢占优先级和 3 位子优先级。抢占优先级用于打断其他中断,子优先级用于决定同级别抢占优先级中断的处理顺序。
    在这里插入图片描述
  1. 配置 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 中断通道。

  1. 初始化 NVIC
NVIC_Init(&NVIC_InitStruct);

调用 NVIC_Init 函数,使用配置好的 NVIC_InitStruct 结构体初始化 NVIC。

这样,当 EXTI0 中断发生时,NVIC 会根据配置的优先级正确处理中断。

初始化EXTI 使PA0触发外部中断

这段代码用于初始化外部中断/事件控制器(EXTI),使能 GPIOA 的第 0 引脚(PA0)触发的外部中断。下面是详细解释每一行代码的作用:

  1. 使能 AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  • 使能替代功能(Alternate Function I/O, AFIO)时钟。AFIO 控制 GPIO 引脚的重映射和外部中断配置。
  • RCC_APB2PeriphClockCmd 函数用来配置外设时钟,RCC_APB2Periph_AFIO 表示 AFIO 模块。
  1. 配置 GPIO 引脚与 EXTI 线的连接
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
  • 配置 GPIOA 的第 0 引脚(PA0)连接到 EXTI 线 0。
  • GPIO_EXTILineConfig 函数将指定的 GPIO 引脚连接到对应的 EXTI 线。
    • GPIO_PortSourceGPIOA: 指定 GPIOA 端口。
    • GPIO_PinSource0: 指定端口的第 0 引脚。
  1. 配置 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 线。

  1. 初始化 EXTI
EXTI_Init(&EXTI_InitStruct);
  • 调用 EXTI_Init 函数,使用配置好的 EXTI_InitStruct 结构体初始化 EXTI。
  • 该函数根据结构体配置,将 EXTI 线 0 设置为上升沿触发的中断模式,并使能该中断线。

这样,当 PA0 引脚的电平从低变高时,会触发 EXTI 线 0 的中断。

编写中断服务函数

  1. 在启动文件startup_stm32f10x_hd.s中找到中断函数名为EXTI0_IRQHandler
    在这里插入图片描述

  2. 在中断源文件stm32f10x_it.c 中添加中断函数
    在这里插入图片描述

  3. 当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、初始化总结

按键初始化

  1. 按键时钟初始化
  2. 按键GPIO初始化

NVIC嵌套向量中断初始化

  1. 配置NVIC的优先级分组
  2. 配置GPIO引脚与EXTI事件线的连接
  3. NVIC初始化

EXTI外部中断初始化

  1. EXTI时钟初始化
  2. EXTI事件线初始化

LED初始化

  1. LED时钟初始化
  2. LED的GPIO初始化

interrupt(IT)中断初始化

  1. 在启动文件中找到对应的函数名
  2. 编写中断函数并添加到头文件中

相关文章:

(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"请输入"/>// 设…...

(转)领导人必过的三道关

为什么企业领导人享受优厚的待遇&#xff0c;为什么董事会对企业领导人千挑万选?因为企业生命如此脆弱&#xff0c;据美国《财 富》杂志报道&#xff0c;世界500强企业平均寿命40年&#xff0c;世界1000强企业平均寿命30年&#xff0c;一般跨国公司平均寿命10年。而就是这脆弱…...

速盾:cdn可以定时刷新缓存吗?

CDN&#xff08;Content Delivery Network&#xff09;是一种通过在全球各地分布的服务器上缓存和传送网站内容的技术&#xff0c;以提高用户访问速度和降低服务器负载。CDN的缓存机制可以减少用户对源服务器的请求次数&#xff0c;从而提高网站的响应速度和性能。但是&#xf…...

代码随想录算法训练营第二十九天| 62.不同路径、63. 不同路径 II

写代码的第二十九天 继续动归&#xff01;&#xff01;&#xff01; 62.不同路径 思路 解决问题1&#xff1a;dp[i][j]的的含义是什么&#xff1f;本题给的是一个二维的表&#xff0c;判断从左上角走到右下角有多少种路径&#xff0c;所以dp应该是二维数组&#xff0c;dp[i]…...

Go+Redis零基础到用户管理系统API实战_20240730 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 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数据类型场景

文章目录 扁平化处理扁平化处理导致的检索问题 解决方案&#xff1a;使用 nested 结构 在es的数据类型中有一个nested类型&#xff0c;本讲将重点讨论这个类型。 扁平化处理 PUT my_index/doc/1 {"group" : "fans","user" : [{"first&quo…...

axios请求响应拦截器

目录 axios-拦截器 拦截器的作用 请求拦截器-基本写法: axios请求拦截器-统一设置token 需求: 核心步骤: 关键代码: 响应拦截器-基本写法: axios响应拦截器-统一处理token失效 需求: 核心步骤: 关键代码: axios响应拦截器-数据剥离 需求: 核心步骤: 关键代码: ax…...

Python 中单例模式实现的几种方式

在设计模式中&#xff0c;单例模式是经常被提及和使用的一种模式。它保证一个类只有一个实例&#xff0c;并提供全局访问点。在Python中&#xff0c;有多种实现单例模式的方法。那么&#xff0c;如何选择合适的方法来实现单例模式呢&#xff1f; 单例模式在Python中的几种实现方…...

mysql数据库触发器同步数据

首先检查数据源库是否支持触发器&#xff0c;show ENGINES&#xff0c;如果FEDERATED是NO&#xff0c;表示未开启&#xff0c;如需开启&#xff0c;再mysql配置文件中&#xff0c;添加federated配置到mysqld下面。 一、同服务器不同库触发器同步&#xff0c;这里只举例插入数据…...

Prometheus-v2.45.0+Grafana+邮件告警

目录 普罗米修斯监控架构介绍 Prometheus 监控架构 1. 数据抓取&#xff08;Scraping&#xff09; 2. 时序数据库&#xff08;TSDB&#xff09; 3. 数据模型 4. PromQL 查询语言 5. 告警&#xff08;Alerting&#xff09; 6. Alertmanager 7. 可视化&#xff08;Visu…...

LeetCode——572. 另一颗树的子树

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你两棵树&#xff0c;然后问subRoot是不是root的子树。也就是root某个节点的所有孩子节点在值和结构上完全与subRoot相同。思路&#xff1a;我的思路比较简单&#xff0c;就是遍历root&#xff0c;遇到root中…...

Spring Boot整合MyBatis-Flex

说明&#xff1a;MyBatis-Flex&#xff08;官网地址&#xff1a;https://mybatis-flex.com/&#xff09;&#xff0c;是一款数据访问层框架&#xff0c;可实现项目中对数据库的访问&#xff0c;类比MyBatis-Plus。本文介绍&#xff0c;在Spring Boot项目整合MyBatis-Flex。 创…...

重塑未来体验:边缘计算与云原生的完美邂逅

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、云原生的兴起 2、边缘计算的兴起 二、边缘计算基础 …...

浅谈基础数论(c++)

目录 一些常见的符号表示阶乘定理 快速幂模板题代码扩展&#xff1a;矩阵快速幂主要作用 欧拉函数扩展积性函数 欧拉函数求法筛选法求欧拉函数&#xff08;积性函数&#xff09; 扩展欧几里得裴蜀定理问题分析代码 问题分析 同余与逆元如何求解逆元扩展欧几里得 例题讲解X-Magi…...

jdk 17新特性 sealed 关键字

通俗理解 sealed 关键字就是给对象继承加了权限控制一样&#xff0c;你必须在我的规则范围内才可以继承我的类 使用 permits 关键字控制允许哪些子类继承 子类必须加以下三个关键字&#xff1a; final 最终继承类&#xff08;继承到这个类就不允许再往下继承了&#xff09;n…...

在仪器计量校准中,无尘车间洁净室检测有哪些方法和流程?

仪器计量校准行业内&#xff0c;无尘车间洁净室检测可以说是较为热门的业务&#xff0c;因为其预算高&#xff0c;且检测流程不是太繁琐&#xff0c;很多仪器计量校准机构也是设立相关实验室&#xff0c;专门处理相关仪器的检测。不过虽然许多机构想要涉足该领域&#xff0c;但…...

【跨时代】第四次工业革命彻底来袭!什么是AI+

你有没有一种很割裂的感觉&#xff0c;就是在短视频里&#xff0c;AI已经要改变全世界了 但自己一用&#xff0c;却发现只能和AI聊聊天 画几张图 难道是姿势不对&#xff1f;但具体是哪里不对呢。 作为一个老牌程序员&#xff0c;我前面分享了很多计算机相关内容&#xff0c;总…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...