【STM32】GPIO输入

news2024/11/26 14:47:10

1 GPIO输出

1.1 按键简介

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

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

1.2 传感器模块简介

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

分别是光敏电阻传感器(光线越强,光敏电阻的阻值就越小)

热敏电阻传感器(温度越强,热敏电阻的阻值就越小)

对射式红外传感器(红外越强,红外接收管的阻值就越小)

反射式红外传感器

滤波电容:保持电路稳定

硬件电路

一般是这种(下接模式)

第一张图,当K1按下,PA0被下拉到GND,此时读取PAO口的电压就是低电平;

当K1松开,PA0被悬空,引脚的电压不确定,此时必须要求PA0是上拉输入,否则会出现引脚电压不稳定的错误现象。

第二张图多了一个上拉电阻。当按键按下时,PA0被下拉到GND,此时读取PAO口的电压就是低电平;

当按键松开时,引脚由于上拉作用,自然保持高电平。

这种接法下,PA0需要配置成上拉输入或者浮空输入

所以上面这两种接法,按键按下是低电平,松手是高电平。

上接模式

第三张图,PA0通过按键接到3.3V,要求PA0必须配置成下拉输入的模式。

当按键按下时,引脚为高电平;松手时,引脚为低电平。(一般单片机可能没有下拉输入模式)

第四张图,PA0需要配置成下拉输入或者浮空输入

下面这两种接法,按键按下是高电平,松手是低电平。

传感器模块

DO是数字输出;AO是模拟输出(ADC模拟转换器)。

C语言数据类型

关键字

位数

表示范围

stdint关键字

ST关键字

char

8

-128 ~ 127

int8_t

s8

unsigned char

8

0 ~ 255

uint8_t

u8

short

16

-32768 ~ 32767

int16_t

s16

unsigned short

16

0 ~ 65535

uint16_t

u16

int

32

-2147483648 ~ 2147483647

int32_t

s32

unsigned int

32

0 ~ 4294967295

uint32_t

u32

long

32

-2147483648 ~ 2147483647

unsigned long

32

0 ~ 4294967295

long long

64

-(2^64)/2 ~ (2^64)/2-1

int64_t

unsigned long long

64

0 ~ (2^64)-1

uint64_t

float

32

-3.4e38 ~ 3.4e38

double

64

-1.7e308 ~ 1.7e308

2 GPIO输入之按键控制LED灯

2.1 接线图

低电平点亮

2.2 封装模块

新建文件夹HardWare,模块化代码

先封装GPIO。LED.c,记得加上LED.h

#include "stm32f10x.h"                  // Device header

// LED初始化函数
void LED_Init(void)
{
	// 1使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 2使用GPIO_Init函数初始化GPIO[推挽输出50MHz]
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;			
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	// 推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 3初始化熄灭
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}

// 点亮LED1函数
void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

// 熄灭LED1函数
void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}


// 点亮LED2函数
void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

// 熄灭LED2函数
void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

// LED1反转
void LED1_Turn(void)
{
	// 读取当前端口输出状态,如果输出是0,就置1;否则置0
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}

// LED2反转
void LED2_Turn(void)
{
	// 读取当前端口输出状态,如果输出是0,就置1;否则置0
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}

再封装按键。KEY.c,记得加上KEY.h

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

// 按键初始化函数
// 上拉输入模式
void KEY_Init(void)
{
	// 1使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	// 2使用GPIO_Init函数初始化GPIO[推挽输出50MHz]
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			// 上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;			
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		// 其实没有
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

// 读取按键的值
uint8_t KEY_GetNum(void)
{
	uint8_t KeyNum = 0;
	// 1号端口
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		// 刚按下,有抖动
		Delay_ms(20);
		// 检查按键松手
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
		{
			Delay_ms(20);
			KeyNum = 1;
		}
	}
	
	// 11号端口
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		// 刚按下,有抖动
		Delay_ms(20);
		// 检查按键松手
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
		{
			Delay_ms(20);
			KeyNum = 2;
		}
	}
	return KeyNum;
}

2.3 主函数

测试代码,主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"

uint8_t keyNum;

int main()
{
	LED_Init();
	KEY_Init();
	
	while (1)
	{
		keyNum = KEY_GetNum();
		// 按键1按下,点亮LED1
		if (keyNum == 1)
		{
			LED1_Turn();
		}
		// 按键2按下,熄灭LED1
		if (keyNum == 2)
		{
			LED2_Turn();
		}
	}
}

代码结构图

我的按键11不起作用,不能控制GPIOA_Pin_2的亮灭。

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

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

相关文章

大数据Doris(三十):删除数据(Delete)

文章目录 删除数据(Delete) 一、​​​​​​​DELETE FROM Statement(条件删除)

nodejs+vue+elementui学生竞赛管理系统65o97

高校人才培养计划的重要组成部分,是实现人才培养目标、培养学生体育 能力与创新思维、学生竟赛管理系统检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而我所在学院多采用半手工管理学生竟赛的方式,所以有必要开发学生竟赛管理系统来对学生…

livox 半固体激光雷达 gazebo 仿真 | 安装与验证

livox 半固体激光雷达 gazebo 仿真 | 安装与验证 livox 半固体激光雷达 gazebo 仿真 | 安装与验证livox 介绍安装验证 livox 半固体激光雷达 gazebo 仿真 | 安装与验证 livox 介绍 览沃科技有限公司(Livox)成立于2016年。为了革新激光雷达行业&#xf…

CANdelaStudio 中 Bese Variant 和 Variant区别

关于 Bese Variant ,其在 CDDT 和 CDD 文件中都存在,有且只有一个 主要包含三部分,重点只关注 DIDs 和 Supported Diagnostic Classes 而在 CDD 文件中,除了 Bese Variant 外,还有一个 Variant “Variant” 这个概…

C# 使用PanGu分词

写在前面 这是官方介绍:盘古分词是一个中英文分词组件。作者eaglet 曾经开发过KTDictSeg 中文分词组件,拥有大量用户。作者基于之前分词组件的开发经验,结合最新的开发技术重新编写了盘古分词组件。 盘古分词组件需要配合其字典文件使用&am…

Cobalt Strike的各类反向上线操作

前言 Cobalt Strike 使用 GUI 框架 SWING(一种java GUI的库)开发,攻击者可通过CS木马在 beacon 元数据中注入恶意 HTML 标签,使得Cobalt Strike对其进行解析并且加载恶意代码(类似XSS攻击),从而…

Nginx Openresty通过Lua+Redis 实现动态封禁IP

需求 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单中的 IP ,我们将拒绝提供服务。并且可以设置封禁失效时间 环境准备 linux version: centos7 / ubuntu 等 redis version: 5.0.5 nginx version: nginx…

【C++】继承(下) 单继承 | 多继承 | 菱形继承 | 继承和组合

一、单/多/菱形继承 1.单继承 当一个子类只有一个直接父类时,称这个继承关系为单继承。 2.多继承 一个子类有两个或以上直接父类时称这个继承关系为多继承。 举个实例:新老师进学校工作时,一般会作为助教老师,一边代课教书&am…

【shell】正则表达式和文本三剑客之grep和awk

目录 一、正则表达式 1.1用法 1.2表示字符匹配 1.3表示次数 1.4表示位置锚定 1.5表示分组或其他 1.6扩展正则表达式 二、grep命令 三、awk命令 3.1awk与vim的区别 3.2awk的语法 3.3基础用法 test1.提取磁盘的分区利用率 test2.提取用户名和uid号 test3.提取ip地址…

数据结构与算法编程题27

计算二叉树深度 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, * rchild; }BiTNo…

前端入职环境安装

前端入职 后环境安装 &#xff0c;内函 nodenvmgit微信开发者工具vscode 的安装包 一.node安装-js运行环境 1.node下载&#xff0c;下载地址Node.js 2.配置淘宝镜像 npm config set registry https://registry.npmmirror.com/ 3.查看配置 npm config list 二.nvm安装-切…

必应的下一个十年:穿越创新的奇点时刻

2023年是微软搜索引擎必应进入中国市场十周年&#xff0c;2024年也将迎来必应上市十五周年。对于风起云涌的互联网公司来说&#xff0c;十年到十五年是一个相当长的创新周期。而在2023年初&#xff0c;以GPT为代表的大语言模型横扫全球科技产业&#xff0c;也对互联网和云计算带…

力扣刷题篇之递归

系列文章目录 目录 系列文章目录 前言 一、二叉树相关问题 二、回溯相关问题 三、动态规划相关问题 总结 前言 刷题按照&#xff1a;[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09;&#xff0c;如图&#xff0c;因为是讲…

pytorch实现遥感建筑物提取

如何自动地从高分辨率遥感影像中提取建筑物等人工目标是高分辨率遥感影像处理与理解领域的一个热点与难点问题。本篇文章我们将学习如何使用pytorch实现遥感建筑物的智能提取。 智能提取的流程 基于深度学习的遥感建筑物智能提取&#xff0c;首先需要制作数据集&#xff0c;然后…

抽象类的使用—模板设计模式 Java

模板设计模式 一、引入二、改进 一、引入 需求 ① 有多个类&#xff0c;完成不同的任务 job ② 要求统计得到各自完成任务的时间 ③ 请编程实现 >最容易想到的方法&#xff0c;写类&#xff0c;统计时间 AA BB中的 job 方法中是有重复的。 >改进1&#xff1a;每个类中&…

使用conan包 - 安装依赖项

使用conan包 - 安装依赖项 主目录 conan Using packages1 Requires2 Optional user/channel3 Overriding requirements4 Generators5 Options 本文是基于对conan官方文档Installing dependencies的翻译而来&#xff0c; 更详细的信息可以去查阅conan官方文档。 This section s…

Vue简易的车牌输入键盘,可以根据需要修改

效果图如下&#xff1a; 代码如下&#xff1a; <template><div><div class"carNoBoxInput"><div style"padding: 6px;border: 2px solid #fff;border-radius: 6px;margin: 6px 3px 6px 6px;"><input class"inputBox"…

避免手机无节制使用

手机使用情况分析 使用时间 我挑选了11月份某一周的统计数据&#xff0c;可以看到&#xff0c;我的日均手机手机时间达到了惊人的8个小时&#xff0c;每周总共余约57小时。 按照使用软件的类型来分类&#xff0c;其中约%50用于娱乐&#xff0c;主要使用软件为&#xff1a;哔哩…

[SpringCloud] SpringCloud配置中心的核心原理

SpringCloud是什么时候去拉取配置中心的配置中心客户端的配置信息为什么要写在bootstrap文件中对象中注入的属性是如何动态刷新的一些开源的配置中心是如何整合SpringCloud的 文章目录 1.从SpringBoot的启动过程说起1.1 大致过程 2.准备Environment的核心操作2.1 前置操作 3.pr…

每日一题:LeetCode-202.快乐数(一点都不快乐)

每日一题系列&#xff08;day 06&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…