【STM32】GPIO输入

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;否则置0if (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;否则置0if (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按下,点亮LED1if (keyNum == 1){LED1_Turn();}// 按键2按下,熄灭LED1if (keyNum == 2){LED2_Turn();}}
}

代码结构图

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

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

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

相关文章

LearnTheArchitecture-MemoryManagement

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买【加群】ARM/TEE…

day02 hive 实操练习

一、某高校图书管理系统中有如下三个数据模型: create table book( book_id string, sort string, book_name string, writer string, output string, price decimal(10,2));INSERT INTO TABLE book VALUES (001,TP391,information_processing,author1,machinery_i…

redis优化秒杀和消息队列

redis优化秒杀 1. 异步秒杀思路1.1 在redis存入库存和订单信息1.2 具体流程图 2. 实现2.1 总结 3. Redis的消息队列3.1 基于list实现消息队列3.2 基于PubSub实现消息队列3.3 基于stream实现消息队列3.3.1 stream的单消费模式3.3.2 stream的消费者组模式 3.4 基于stream消息队列…

XmlElement注解用在Java的列表属性上产生的效果

例如,下面的代码,XmlElement注解用在了Conditions类的conditionList属性的getter方法上,其中conditionList是一个列表类型: package com.thb;import java.util.List;import jakarta.xml.bind.annotation.XmlAttribute; import ja…

Python面经【4】

Python面经【4】 一、什么是闭包二、[列表]和(元组)的区别三、__Init__和__new__的区别四、Python里match与search的区别五、创建百万级实例如何节省内存六、18. 4G内存如何读取一个5G的数据 一、什么是闭包 闭包指的是在函数内部定义了另一个函数,并返回了这个作为…

香港服务器显示美国 IP 地址是怎么回事

香港服务器显示美国 IP,在我们选择免备案服务器时会考虑很多影响因素,其中香港服务器有着省时省力,方便速度快等优 势受到大多用户喜爱,可有的时候在选择香港服务器时发现,有的香港服务器在 IP 地址一栏会显示其它国家…

leetcode每日一题34

89.格雷编码 观察一下n不同时的格雷编码有什么特点 n1 [0,1] n2 [0,1,3,2] n3 [0,1,3,2,6,7,5,4] …… 可以看到nk时,编码数量是nk-1的数量的一倍 同时nk编码的前半部分和nk-1一模一样 nk编码的最后一位是2k-1 后半部分的编码是其对应的前半部分的对称的位置的数字…

如何使用OpenCV转换图像并创建视频,实现Ken Burns特效

一、Ken Burns特效 当使用OpenCV时,最常使用的是图像,但是我们也可以多个图像创建动画,通过引入时间轴更容易可视化。 Ken Burns特效这是一种以电影制片人肯伯恩斯 (Ken Burns) 命名的平移和缩放技术,Ken Burns 效果不是在屏幕上显示大型静态照片,而是裁剪细节,然后平移图…

vue3(四)-基础入门之 fetch 与 axios

一、fetch 1、axios和fetch的区别 Axios 和 Fetch 都是 JavaScript 中用于发送 HTTP 请求的 API,它们的主要区别在以下方面: 1.Axios 支持更广泛的浏览器和 Node.js 版本,而 Fetch 只能在较新的浏览器中使用,或需要使用 polyfi…

[动态规划] 回文子串

回文子串 题目描述 给定一个字符串,输出所有回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串 比如: abba cccdeedccc都是回文字符串 我们要查找的子串长度应该大于等于2 关于输入 输入是一行,即可一个字符串。长度…

vr红色教育虚拟展馆全景制作提升单位品牌形象

720全景展馆编辑平台以其独特的优势,为展览行业带来了革命性的变革。这种创新的技术应用为参展商提供了更高效、更便捷、更全面的展示解决方案,进一步提升了展览行业的水平和影响力。 一、提升展示效果,增强品牌形象 720全景展馆编辑平台通过…

使用conan包 - 工作流程

使用conan包 - 工作流程 主目录 conan Using packages1 Single configuration2 Multi configuration 本文是基于对conan官方文档Workflows的翻译而来, 更详细的信息可以去查阅conan官方文档。 This section shows how to setup your project and manage dependenci…

32 - MySQL调优之事务:高并发场景下的数据库事务调优

数据库事务是数据库系统执行过程中的一个逻辑处理单元,保证一个数据库操作要么成功,要么失败。谈到他,就不得不提 ACID 属性了。数据库事务具有以下四个基本属性:原子性(Atomicity)、一致性(Con…

Windows全系列 本地密码暴力破解

首先 咱们要准备两个工具: 第一个是 pwdump-master 第二个是 saminside_softradar-com.exe这两个工具 我会一并上传 需要的同学 可以自取本文章操作思路是: 第一步 首先把我刚刚提到的两个软件 以某种手段放置于机器中 如果是真实机 就用U盘 拷贝到真实机…

基于Java SSM框架+Vue实现药品保健品购物网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现药品保健品购物网站演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 ssm药源购物网站,主要的模块包括两个用户,管理员权限:用…

OJ练习第186题——统计子串中的唯一字符

统计子串中的唯一字符 力扣链接:828. 统计子串中的唯一字符 题目描述 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数。 例如:s “LEETCODE” ,则其中 “L”, “T”,“C”,“O”…

【Github】git安装

我们经常需要对github上的项目进行复现或者使用,git指令可以方便我们更好地实现他们。 Part 0. 准备 配置代理IP 面对问题:关于登陆github网站网速慢、下载git项目网速慢。 解决:无论是windows还是linux系统,都可以找到/etc/ho…

RK3568平台开发系列讲解(Linux系统篇)pinctrl api介绍及实验

🚀返回专栏总目录 文章目录 一、pinctrl函数介绍二、设备树案例三、驱动案例 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍pinctrl api及其使用案例 。 一、pinctrl函数介绍 ①获取设备对应的 pinctrl…

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现)FPGA部分

一、 实验目的 1、掌握基于 Verilog 语言的 diamond 工具设计全流程。 2、熟悉、应用 Verilog HDL 描述数字电路。 3、掌握 Verilog HDL 的组合和时序逻辑电路的设计方法。 4、掌握“小脚丫”开发板的使用方法。 二、 实验原理 与门逻辑表达式:Y=AB 原理仿真图: 2 输入…

智慧工厂人员定位系统源码,融合位置物联网、GIS可视化等技术,实现对人员、物资精确定位管理

智慧工厂人员定位系统源码,UWB高精度定位系统源码 随着中国经济发展进入新常态,在资源和环境约束不断强化的背景下,创新驱动传统制造向智能制造转型升级,越发成为企业生存发展的关键。智能工厂作为实现智能制造的重要载体&#xf…