【STM32】GPIO输入

2023-11-28 10:30
文章标签 输入 stm32 gpio

本文主要是介绍【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的亮灭。

这篇关于【STM32】GPIO输入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429539

相关文章

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu