使用STM32设置GPIO中断

使用S™ 32设置GPIO中断

  • 中断示例
  • 按键中断实例设计:EXTI0和EXTI9
    • 硬件连接分析
    • STM32代码实现
    • 代码说明

中断示例

设计一个按键中断的实例。设置两个中断:EXTI0、EXTI9,
在EXTI9的中断服务之程序中实现LED灯的控制
在这里插入图片描述

按键中断实例设计:EXTI0和EXTI9

根据提供的电路图,我将设计一个基于STM32的按键中断系统,其中两个按键分别连接到EXTI0和EXTI9引脚,并通过EXTI9的中断服务程序控制LED灯组。
在这里插入图片描述

硬件连接分析

从电路图可以看出:

  • 两个按键Key ButtonWakeup Button通过上拉/下拉电阻连接到微控制器
  • EXTI0连接到第一个按键输入
  • EXTI9连接到第二个按键输入
  • 四个LED灯(带限流电阻)连接到微控制器的GPIO引脚

STM32代码实现

#include "stm32f10x.h"  // 假设使用STM32F10x系列,可根据实际芯片修改// LED相关定义
#define LED_PORT          GPIOB
#define LED_PIN_ALL       (GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11)
#define LED_ALL_ON()      GPIO_SetBits(LED_PORT, LED_PIN_ALL)
#define LED_ALL_OFF()     GPIO_ResetBits(LED_PORT, LED_PIN_ALL)// 按键相关定义
#define KEY0_PORT         GPIOA
#define KEY0_PIN          GPIO_Pin_0    // EXTI0对应PA0
#define KEY1_PORT         GPIOA
#define KEY1_PIN          GPIO_Pin_9    // EXTI9对应PA9// 中断标志位
volatile uint8_t Key0Pressed = 0;
volatile uint8_t Key1Pressed = 0;// LED状态变量
volatile uint8_t ledState = 0;  // 0:全灭, 1:交替闪烁, 2:全部点亮/** 函数名:EXTI0_IRQHandler* 描述:EXTI0中断服务程序* 输入:无* 输出:无*/外部中断函数EXTI0_IRQHandler
void EXTI0_IRQHandler(void)
{// 检查是否是KEY0触发的中断if(EXTI_GetITStatus(EXTI_Line0) != RESET){// 清除中断标志位EXTI_ClearITPendingBit(EXTI_Line0);// 设置按键0被按下的标志Key0Pressed = 1;}
}/** 函数名:EXTI9_5_IRQHandler* 描述:EXTI9-5中断服务程序* 输入:无* 输出:无*/EXTI9-5中断服务程序EXTI9中断服务程序中实现了三种LED控制模式
void EXTI9_5_IRQHandler(void)
{// 检查是否是KEY1触发的中断if(EXTI_GetITStatus(EXTI_Line9) != RESET){// 清除中断标志位EXTI_ClearITPendingBit(EXTI_Line9);// 设置按键1被按下的标志Key1Pressed = 1;// 控制LED灯switch(ledState){case 0:  // 全灭LED_ALL_ON();ledState = 1;break;case 1:  // 全部点亮LED_ALL_OFF();ledState = 2;break;case 2:  // 交替闪烁模式GPIO_Write(LED_PORT, (GPIO_ReadOutputData(LED_PORT) ^ LED_PIN_ALL));break;}}
}/** 函数名:KEY_Init* 描述:初始化按键GPIO和中断* 输入:无* 输出:无*/
void KEY_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置KEY0和KEY1为浮空输入GPIO_InitStructure.GPIO_Pin = KEY0_PIN | KEY1_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(KEY0_PORT, &GPIO_InitStructure);// 使能AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 配置KEY0为EXTI0中断线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);配置EXIT线EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  // 下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 配置KEY1为EXTI9中断线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource9);EXTI_InitStructure.EXTI_Line = EXTI_Line9;EXTI_Init(&EXTI_InitStructure);// 配置NVIC中断优先级NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_Init(&NVIC_InitStructure);
}/** 函数名:LED_Init* 描述:初始化LED GPIO* 输入:无* 输出:无*/
void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置LED端口为推挽输出GPIO_InitStructure.GPIO_Pin = LED_PIN_ALL;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED_PORT, &GPIO_InitStructure);// 初始状态:全灭LED_ALL_OFF();
}int main(void)
{// 初始化按键和LEDKEY_Init();LED_Init();while(1){// 检查KEY0是否被按下if(Key0Pressed){// 短暂延时,消除抖动for(volatile uint32_t i = 0; i < 10000; i++);// 处理按键事件// 这里可以添加其他功能// 清除标志位Key0Pressed = 0;}// 检查KEY1是否被按下if(Key1Pressed){// 短暂延时,消除抖动for(volatile uint32_t i = 0; i < 10000; i++);// 清除标志位Key1Pressed = 0;}// 可以在这里添加其他主循环逻辑}
}

代码说明

  1. 硬件配置

    • EXTI0连接到PA0引脚
    • EXTI9连接到PA9引脚
    • 四个LED灯连接到PB8-PB11引脚
  2. 中断配置

    • EXTI0和EXTI9均配置为下降沿触发
    • 为两个中断分配了相同的优先级
  3. LED控制

    • EXTI9中断服务程序中实现了三种LED控制模式:
      • 全灭 → 全部点亮 → 交替闪烁
    • 使用ledState变量跟踪当前LED状态
  4. 按键消抖

    • 在主循环中通过延时实现简单的按键消抖
  5. 中断标志位

    • 使用Key0Pressed和Key1Pressed变量作为中断标志位

这个设计实现了按键检测和LED控制的基本功能,可以根据实际需求进一步扩展和优化。

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

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

相关文章

解决在微信小程序中view组件下的text和images设置了样式display: flex; align-items: center;对不齐

原始代码的问题 <view style"display: flex; align-items: center;"><text style"line-height: 1;">全国</text><image src"/images/xia.png" style"height: 20rpx; width: 20rpx; display: block;"></im…

归并排序详解:优雅的分治艺术

什么&#xff1f;归并排序&#xff1f;这让博主想起了大学那会被《数据结构与算法》支配的恐惧… 哈哈言归正传&#xff0c;一直想对算法做一个专栏&#xff0c;因为其实工作中很少很少有机会用到算法&#xff0c;倒是很多工具方法底层会使用&#xff0c;工作被各种需求业务“折…

新零售视域下实体与虚拟店融合的技术逻辑与商业模式创新——基于开源AI智能名片与链动2+1模式的S2B2C生态构建

摘要&#xff1a;新零售的核心在于打破线上线下边界&#xff0c;构建“人、货、场”的全场景融合生态。本文提出&#xff0c;实体线下店与虚拟店的协同发展是新零售的重要演进方向&#xff0c;其底层逻辑在于满足消费者作为“现实人”的体验需求与“虚拟人”的效率需求。通过引…

可视化图解算法51:寻找第K大(数组中的第K个最大的元素)

牛客网 面试笔试 TOP101 | LeetCode 215. 数组中的第K个最大元素 1. 题目 描述 有一个整数数组&#xff0c;请你找出数组中第 k 大的数。 给定一个整数数组 a ,同时给定它的大小n和要找的 k &#xff0c;请返回第 k 大的数(包括重复的元素&#xff0c;不用去重)&…

DataWhale-零基础网络爬虫技术(一)

课程链接先给各位 ↓↓↓ &#xff08;点击即可食用.QAQ Datawhale-学用 AI,从此开始 一、引言 还是在笔记的开始&#xff0c;唠唠一些自己的故事 十年前第一次接触网络&#xff0c;也可以说是第一次接触计算机的时候&#xff0c;那时候还是在中学阶段&#xff0c;那时候大…

Linux02

目录 linux常用命令 用户和权限 压缩和解压缩 其他相关命令 Linux中安装常用软件 1.1. jdk的安装 1.1.1. 卸载linux中自带的open-jdk 1.1.2. 把安装包上传到 linux上 1.1.3. 解压安装包 1.1.4. 配置环境变量 1.1.5 验证环境变量 1.3 安装mysql 1.3.1. 检查依赖 1.…

JavaSE超详细笔记-网络编程篇-基于黑马

1. 什么是网络编程【理解】 1.1 概念 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景: 即时通信、网游对战、金融证券、国际贸易、邮件、等等。 不管是什么场景&#xff0c;都是计算机跟计算机之间通过网络进行数据传输Java中可以使…

时序数据库Influxdb3 core安装

本文介绍时序数据库Influxdb3 core(开源版本)的安装和简单使用以及调优参数的介绍。 预期&#xff1a; 安装时序数据库Influxdb3 core 创建数据库mydb 写入数据&#xff1b; 使用influxdb3-cli 和 grafana2种方式查询写入的数据 前期准备&#xff1a; linux服务器(本文服…

区间合并:区间合并问题

区间合并&#xff1a;区间合并问题 区间合并 www.acwing.com/problem/content/805/ 按区间的左端点排序 扫描整个区间&#xff0c;在这过程中把可能有交点的区间合并 全包含&#xff1a;不做改动相交&#xff1a;right 后移相离&#xff1a;更新至下一个维护区间 import j…

中国古代数学符号的演进 | 算筹 / 符号 / 算法

注&#xff1a;本文为“中国古代数学符号”相关合辑。 图片清晰度受引文原图所限。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 这个中国古代的数学瑰宝&#xff0c;到底厉害在哪&#xff1f; 原创 朱一文 科普中国 2024 年 07 月 31 日 15:30 北…

XMLDecoder、LDAP 注入与修复

问题&#xff1a;XMLDecoder注入 针对 xml 解码器的注入攻击 反序列化用户控制的 XML &#xff0c;程序没有进行验证&#xff0c; 会让攻击者有机会在服务器上执行恶意代 码。 例&#xff1a;下面代码片段中&#xff0c; XMLDecoder 处理不可信的输入。 ... XMLDecode…

Unity 对象层级处理小结

一.第一优先级Camera Culling Mask属性指定Camera显示的Layer,可以多选 Depth:Depth大的Camera显示的Layer显示在前面 二.避免使用PositionZ调整遮挡关系 在 2D 游戏中,虽然可以通过 Z 轴来调整显示顺序,但这与 2D 游戏的设计理念不符。在可以控制显示层级的多个要素或方…

python基础举例

最近又重新开始学python&#xff0c;浅浅记录下学习到的东西&#xff08;也方便自己回顾看&#xff09; 缩进、空格对于python很重要&#xff0c;一定要注意&#xff01; 以下代码是基于pycharm编写的。 01 输出 #注释 # 单行注释用# &#xff0c;ctrl/是单行注释的快捷键 # …

开疆智能ModbusTCP转Canopen网关连接汇川PLC配置案例

本案例是通过开疆智能研发的ModbusTCP转Canopen网关将汇川PLC与陀螺仪连接进行组网通讯。 准备阶段 软件&#xff1a;InoProShop(V1.7.3)&#xff0c;CANopen Configuration Studio PLC&#xff1a;汇川AC801-0221-R0R0 网关&#xff1a;开疆智能ModbusTCP转Canopen网关 陀…

Tess4J:基于 Java 的 OCR 解决方案

在现代软件开发中&#xff0c;图像识别与文本提取已成为许多应用场景中的关键环节。OCR&#xff08;Optical Character Recognition&#xff09; 技术使得从图像中提取文字成为可能。Tess4J 是一个基于 Java 的 OCR 开发库&#xff0c;它封装了 Google Tesseract OCR 引擎的本地…

Vue3 + JavaScript 父组件点击按钮触发子组件事件方法

在 Vue 3 中&#xff0c;父组件点击按钮触发子组件事件有以下三种常用方式&#xff1a; 方法 1&#xff1a;使用 ref 直接调用子组件方法&#xff08;推荐&#xff09; vue 复制 下载 <!-- 父组件 --> <template><button click"callChildMethod"…

超强人工智能解决方案套件InfiniSynapse:精准的业务理解、对各种数据源进行全模态联合智能分析--部署安装@Ubuntu22.04 @Docker

InfiniSynapse 通过自研的第二代LLM-Native RAG实现了企业业务的理解&#xff0c;精准的Schema召回保证数据的准确性。提供专门为大模型优化的InfiniSQL语言&#xff0c;从而可以更加准确的生成查询语句&#xff0c;通过 InfiniSQL 引擎让人类第一次对存储在各种数据源的全模态…

解决国内无法加载谷歌验证码(reCAPTCHA):URL 重定向配置指南

解决国内无法加载谷歌验证码&#xff08;reCAPTCHA&#xff09;&#xff1a;URL 重定向配置指南 在搭建网站或使用某些应用时&#xff0c;经常会遇到需要调用谷歌验证&#xff08;reCAPTCHA&#xff09;API 的情况。然而&#xff0c;由于网络环境的特殊性&#xff0c;国内多数…

【Qt】如何使用QtInstallerFramework打包Qt程序

使用 Qt Installer Framework 可以将你的 Qt 程序打包成一个带有安装向导的安装包&#xff0c;适用于 Windows、Linux 和 macOS 平台。以下是完整的打包流程&#xff0c;以你当前开发的 ecgexport 应用为例。 &#x1f9f0; 一、准备工作 1. 安装 Qt Installer Framework 下载…

如何编写高效的Prompt:从入门到精通

在人工智能时代&#xff0c;特别是随着大型语言模型(LLM)如ChatGPT、Claude等的普及&#xff0c;编写高质量的Prompt(提示词)已成为一项关键技能。一个好的Prompt可以显著提高AI输出的质量和相关性&#xff0c;而一个糟糕的Prompt可能导致无用甚至误导性的结果。本文将带你深入…