STM标准库-GPIO输入

article/2025/7/30 3:09:14

文章目录

  • 一、GPIO输入
    • 按键简介
    • 传感器模块简介
    • 硬件电路
  • 二、C语言
      • C语言数据类型
      • C语言宏定义
      • C语言typedef
      • C语言结构体
      • C语言枚举
  • 三、练习
    • 3.1按键控制LED
      • 3.1.1接线图
      • 3.1.2代码
      • 效果:
    • 3.2光敏电阻控制蜂鸣器
      • 3.2.1接线图
      • 3.2.2代码
      • 效果:

一、GPIO输入

STM32 的 GPIO 支持 4 种输入模式:

  1. 浮空输入(GPIO_Mode_IN_FLOATING)
    • 无内部上拉 / 下拉电阻
    • 引脚电平由外部信号决定
    • 适用于信号源自带驱动能力(如按键接 VCC/GND)
  2. 上拉输入(GPIO_Mode_IPU)
    • 内部连接上拉电阻(默认高电平)
    • 适用于检测低电平信号(如按键接地)
  3. 下拉输入(GPIO_Mode_IPD)
    • 内部连接下拉电阻(默认低电平)
    • 适用于检测高电平信号(如按键接 VCC)
  4. 模拟输入(GPIO_Mode_AIN)
    • 用于 ADC 采样,禁用数字输入缓冲器
    • 不读取数字值,仅用于模拟信号采集
      在这里插入图片描述

在这里插入图片描述

按键简介

  • 按键:常见的输入设备,按下导通,松手断开

  • 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动

在这里插入图片描述

传感器模块简介

传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出。

硬件电路

在这里插入图片描述

在这里插入图片描述

二、C语言

C语言数据类型

关键字位数表示范围stdint****关键字ST****关键字
char8-128 ~ 127int8_ts8
unsigned char80 ~ 255uint8_tu8
short16-32768 ~ 32767int16_ts16
unsigned short160 ~ 65535uint16_tu16
int32-2147483648 ~ 2147483647int32_ts32
unsigned int320 ~ 4294967295uint32_tu32
long32-2147483648 ~ 2147483647
unsigned long320 ~ 4294967295
long long64-(2^64)/2 ~ (2^64)/2-1int64_t
unsigned long long640 ~ (2^64)-1uint64_t
float32-3.4e38 ~ 3.4e38
double64-1.7e308 ~ 1.7e308

C语言宏定义

  • 关键字:#define
  • 用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改
  • 定义宏定义: #define ABC 12345
  • 引用宏定义: int a = ABC; //等效于int a = 12345;

C语言typedef

  • 关键字:typedef

  • 用途:将一个比较长的变量类型名换个名字,便于使用

  • 定义typedef:

    typedef unsigned charuint8_t; unsigned char=uint8_t

  • 引用typedef: uint8_t a; //等效于unsigned char a;

C语言结构体

  • 关键字:struct

  • 用途:数据打包,不同类型变量的集合

  • 定义结构体变量:

​ struct{char x; int y; float z;} StructName;

​ 因为结构体变量类型较长,所以通常用typedef更改变量类型名

  • 引用结构体成员:

​ StructName.x = ‘A’;

​ StructName.y = 66;

​ StructName.z = 1.23;

​ 或 pStructName->x = ‘A’; //pStructName为结构体的地址 pStructName->y = 66;

​ pStructName->z = 1.23;

C语言枚举

关键字:enum

用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合定义

枚举变量:

enum{FALSE = 0, TRUE = 1} EnumName;

因为枚举变量类型较长,所以通常用typedef更改变量类型名

  • 引用枚举成员:

​ EnumName = FALSE;

​ EnumName = TRUE;

三、练习

3.1按键控制LED

3.1.1接线图

在这里插入图片描述

3.1.2代码

Key.c

#include "stm32f10x.h"                  // 包含STM32F10x系列微控制器的标准外设库头文件
#include "key.h"                        // 按键模块自定义头文件
#include "Delay.h"                      // 延时函数头文件/*** @brief  初始化按键GPIO引脚* @param  无* @retval 无* @note   配置PB1和PB11为上拉输入模式*/
void Key_Init(void) 
{// 使能GPIOB外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 定义GPIO初始化结构体GPIO_InitTypeDef GPIO_InitStruct;// 配置按键引脚:PB1和PB11GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;// 设置为上拉输入模式(默认高电平,按下接地为低电平)GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;// 输入模式下速度设置无效,但需赋值GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;// 应用GPIO配置到GPIOB端口GPIO_Init(GPIOB, &GPIO_InitStruct);
}/*** @brief  检测按键并返回按键编号* @param  无* @retval uint8_t: 按键编号(1-按键1,2-按键2,0-无按键)* @note   使用轮询方式检测按键,包含消抖处理*/
uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;  // 初始化按键编号为0(无按键)// 检测按键1(PB1)是否按下if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Delay_ms(20);  // 消抖延时(硬件抖动通常小于20ms)// 确认按键确实按下(排除抖动)while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)Delay_ms(20);  // 等待按键释放KeyNum = 1;  // 设置按键编号为1}// 检测按键2(PB11)是否按下if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){Delay_ms(20);  // 消抖延时// 确认按键确实按下while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)Delay_ms(20);  // 等待按键释放KeyNum = 2;  // 设置按键编号为2}return KeyNum;  // 返回按键编号
}

LED.c

#include "stm32f10x.h"                  // Device header
#include "led.h"
#include "Delay.h"void LED_Init(void) 
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);}void LED1_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}void LED1_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);
}void LED2_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}void LED2_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
void LED1_Turn(void)
{if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}
void LED2_Turn(void)
{if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);}
}

main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "led.h"
#include "Key.h"uint8_t KeyNum;int main(void)
{// 外设初始化LED_Init();Key_Init();// 主循环while(1){// 读取按键值KeyNum = Key_GetNum();// 消抖处理(假设Key_GetNum已包含消抖)// 按键处理if(KeyNum == 1){LED1_Turn();  // 切换LED1状态Delay_ms(20); // 消抖延时}else if(KeyNum == 2){LED2_Turn();  // 切换LED2状态Delay_ms(20); // 消抖延时}}
}

效果:

  • 在主循环中持续检测按键状态
  • 当检测到按键 1(PB1)按下时,切换 LED1 的状态(亮→灭 或 灭→亮)
  • 当检测到按键 2(PB11)按下时,切换 LED2 的状态

3.2光敏电阻控制蜂鸣器

3.2.1接线图

在这里插入图片描述

3.2.2代码

main.c

#include "stm32f10x.h"                  // 包含STM32F10x系列设备的头文件
#include "Delay.h"
#include "led.h"
#include "Buzzer.h"
#include "LightSensor.h"uint8_t KeyNum;int main(void)
{		Buzzer_Init();LightSensor_Init();while(1) // 进入无限循环,保持程序运行{if(LightSensor_Get() == 1){Buzzer_ON();}else{Buzzer_OFF();}
}}

LightSensor.c

#include "stm32f10x.h"                  // Device header
#include "led.h"
#include "Delay.h"/*** @brief  初始化光敏传感器(数字输出型)* @param  无* @retval 无* @note   配置PB13为上拉输入模式*/
void LightSensor_Init(void) 
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入:默认高电平GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);
}/*** @brief  检测PB13引脚电平状态* @param  无* @retval uint8_t: 1-引脚为高电平,0-引脚为低电平*/
uint8_t LightSensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}

功能说明

  • 初始化函数:配置 PB13 为上拉输入模式,无信号时引脚默认保持高电平

  • 读取函数

    :直接返回 PB13 引脚的电平状态

    • 当引脚为高电平时返回 1
    • 当引脚为低电平时返回 0

Buzzer.c

#include "stm32f10x.h"                  // Device header
#include "led.h"
#include "Delay.h"void Buzzer_Init(void) 
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);}void Buzzer_ON(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_OFF(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_12);
}/*** @brief  切换蜂鸣器状态(开→关 或 关→开)* @param  无* @retval 无*/
void Buzzer_Turn(void)
{if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == 0){GPIO_SetBits(GPIOB, GPIO_Pin_12);// 当前为低电平(开启状态),切换为高电平}else{GPIO_ResetBits(GPIOB, GPIO_Pin_12);// 当前为高电平(关闭状态),切换为低电平}
}

效果:

无光照(PB13=1)→ LightSensor_Get() 返回 1蜂鸣器响

有光照(PB13=0)→ LightSensor_Get() 返回 0蜂鸣器停
在这里插入图片描述


http://www.hkcw.cn/article/AUDMxueDIJ.shtml

相关文章

HackMyVM-Jabita

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…

桑托斯0-1博塔弗戈 内马尔染红 阿图尔制胜球

北京时间6月2日,巴西足球甲级联赛第11轮,桑托斯主场对阵博塔弗戈。比赛中,桑托斯的内马尔因累计两张黄牌被罚出场。博塔弗戈凭借雅伊尔-库尼亚的助攻,由阿图尔打入制胜一球,最终以1-0战胜桑托斯。比赛开始前,双方队长进行了挑边仪式。第5分钟,内马尔在禁区内投诉被对手拉…

英国军事战略转向全面“备战”

△英国首相府(资料图)当地时间6月1日,总台记者从英国首相府获得信息,英国政府将在2日发布新一轮《战略国防评估报告》的同时,宣布大幅扩建其核动力攻击型潜艇舰队,并加速推进军工产业现代化。此举被外界普遍解读为英国在地缘安全压力加剧背景下,全面进入“备战状态”。新…

Java虚拟机内存区域划分

Java虚拟机内存区域划分 Java虚拟机(JVM)的内存区域划分主要分为五个部分: 程序计数器:程序计数寄存器,给CPU使用本地方法栈:为JVM使用到的Native方法服务方法区:存储的是编译后的.class文件堆…

cursor升级至0.505,运行统计视频中的人数

帮助--检查更新,升级。 升级后,新建文本,另存选python格式保存后,右下角提示选择编译器,选择python后,自动安装ms python 3.11.9 一.查看pthon安装在哪, winr,输入cmd后, ctrlshiftenter三个…

《Pytorch深度学习实践》ch2-梯度下降算法

------B站《刘二大人》 1.Gradient Decent 局部最优,全局最优,非凸函数: 梯度下降算法公式: 2.Implementation import matplotlib.pyplot as plt# 数据集 x_data [1.0, 2.0, 3.0] y_data [2.0, 4.0, 6.0]# 权重 w 1.0# 模型…

LabVIEW多按键自动化检测系统

LabVIEW开发一套高精度按键力与行程自动化检测系统,针对传统检测设备自动化程度低、定位误差大等痛点,实现多按键产品的全流程自动化测试。系统集成 6 轴工业机器人、高精度传感器及实时数据处理模块,满足汽车电子、消费电子等领域对按键手感…

Chorme如何对于youtube视频进行画中画背景播放?

画中画可以让你小窗播放,然后浏览器放后台还可以做点别的事情。 B站直接可以选择小窗播放,游览器最小化就可以,但是youtube的小窗播放游览器一切换就不显示了。 其实是因为youtube的小窗播放不是真的小窗播放。要想真的实现需要在youtube视…

JDBC连不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.

最近为一个spring-boot项目下了mysql-9.3.0,结果因为mysql版本太新一直报错连不上。 错误如下: 2025-06-01 16:19:43.516 ERROR 22088 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispat…

C/C++ 面试复习笔记(3)

一.valgrind工具 参考: 内存检查工具valgrind介绍、安装与使用-CSDN博客https://blog.csdn.net/mijichui2153/article/details/85240349 二.C语言中如何实现一个线程池? 答案: 线程池是通过预先创建固定数量的线程来处理多个任务&#xf…

Spring框架核心知识深度解析

Spring框架核心知识深度解析 最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆 今天将对spring常见问题做出解析 一、IOC与AOP核心原理 1. IOC(控制反转)详解 核心思想:将对象…

【第四十七周】HippoRAG 2 复现与分析(一):环境部署与代码分析

目录 摘要Abstract安装依赖试运行HippoRAG 初始化文档索引QA运行脚本 总结 摘要 本周对HippoRAG 2系统进行核心功能测试,通过构建小型结构化文档库(如人物职业、童话事件、地理关系),验证其索引构建、动态增删、多轮检索问答及评…

【js逆向_AES】全国二手房指数数据爬取

目标:请求参数signcode,请求结果data。 网址:aHR0cDovL3d3dy5jY2hpbmRleC5jb20vSG9tZS9pbmRleA 查看载荷 查看响应数据 点击xhr,发现所有请求参数都是一个signCode,还是加密后的结果,对应结果中数据data也…

郑钦文社媒:人都应该有梦 刷新赛会最佳战绩

北京时间6月1日晚,在法网女单1/8决赛中,郑钦文战胜俄罗斯选手萨姆索诺娃,职业生涯首次跻身法网女单八强,刷新个人赛会最佳战绩。这也是中国选手时隔14年再次闯进法网八强。赛后,郑钦文在社交媒体上写道:“人都应该有梦,有梦就别怕痛,是一颗宝石就该闪烁。”她还祝所有的…

【第16届蓝桥杯 | 软件赛】CB组省赛第二场

个人主页:Guiat 归属专栏:算法竞赛 文章目录 A. 密密摆放(5分填空题)B. 脉冲强度之和(5分填空题)C. 25 之和D. 旗帜E. 数列差分F. 树上寻宝G. 翻转硬币H. 破解信息 正文 总共8道题。 A. 密密摆放&#xff0…

在线音乐服务器测试报告

1.项目背景 此项目主要用于模拟市面上主流的音乐软件的主要功能,提高自己的开发和测试能力。此项目采用的技术栈是SpringBoot MyBatis SpringMVC Mysql实现的,为了实现简单,方便测试,此项目没有注册功能,数据提前存…

球展世界,筑梦中原,2025郑州台球展会,年中招商即将开启

-壹肆柒2025中国(郑州)国际台球产业博览会暨全国台球产业链发展大会,将于2025年08月15-17日,在郑州中原国际会展中心盛大举办。本届博览会主题:同聚中原共赢未来,四个展馆,42000㎡的展览面积&am…

58、辣椒种植学习

辣椒(学名:Capsicum annuum)属于茄科辣椒属,是一种重要的蔬菜兼调味作物,具有较高的经济价值和营养价值。其果实富含维生素C、辣椒素等成分,既可鲜食,也可加工成干辣椒、辣椒粉、辣椒酱等产品&a…

SCSAI平台面向对象建模技术的设计与实现

一、核心设计思想 SCSAI平台的核心目标是通过元建模(Meta-Modeling)技术实现面向对象建模的零编码化。其核心思想为: 自反性设计:定义ObjectClassInfo (OCI)为元类(Meta-Class),所有对象类均为…

三个细节 带你看懂中方在这届香会上的行动

这两天,谭主在第22届香格里拉对话会现场,参加了多场全体会议和平行会议。谭主在现场留意到三个细节,带你看懂中方在这届香会上的行动。细节一:中方提问美菲防长获东盟共鸣在昨天上午的第一场全体会议上,来自国防大学的张弛教授提问美国国防部长将如何处理美国联盟与东盟国…