当前位置: 首页 > 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;总…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...