当前位置: 首页 > news >正文

STM32F4X-GPIO输入功能使用

STM32F4 GPIO输入模式配置

上一节讲GPIO的时候说到了将GPIO设置成输出模式,并通过将GPIO的电平拉高拉低控制LED灯的例程。GPIO除了用作输出功能之外,还可以用作输入功能。最常用的就是检测按键的输入电平。

硬件设计

本章的硬件是基于正点原子的探索者ST32F407开发板进行开发。
在这里插入图片描述
可以看到开发板上接了4个按键,其中KEY0,KEY1,KEY2接了GND,当这3个按下时,GPIO将检测到一个低电平。WK_UP接了VCC,当按键按下时,GPIO将检测到一个高电平。

软件设计

GPIO配置成输入模式步骤

1、第一步要先把GPIO的时钟打开
2、将GPIO引脚设置成输入模式
3、读取GPIO电平状态

GPIO 操作函数

/**
函数作用:初始化一个GPIO
GPIOx:GPIO引脚所在的GPIO组
GPIO_InitStruct:GPIO对象的结构体 
**/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);/**
函数作用:读取GPIO电平
GPIOx:GPIO引脚所在的GPIO组
GPIO_Pin:GPIO引脚
返回值:GPIO电平状态
**/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

GPIO 对象结构体

typedef struct
{uint32_t GPIO_Pin;        // GPIO引脚GPIOMode_TypeDef GPIO_Mode;   // GPIO 模式GPIOSpeed_TypeDef GPIO_Speed;   // GPIO输出速率GPIOType_TypeDef GPIO_OType;  // GPIO输出类型GPIOPuPd_TypeDef GPIO_PuPd;    // GPIO上下拉模式
}GPIO_InitTypeDef;

GPIO 输入例程

首先要先将GPIO初始化成输入模式

#define KEY0_GPIO_CLK       RCC_AHB1Periph_GPIOE
#define KEY0_GPIO       GPIOE
#define KEY0_GPIO_PIN   GPIO_Pin_4
void bsp_key_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_AHB1PeriphClockCmd(KEY0_GPIO_CLK,ENABLE); // 打开GPIOE时钟GPIO_InitStruct.GPIO_Pin = KEY0_GPIO_PIN; // GPIO引脚编号GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;   // GPIO模式配置成输入模式GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; // GPIO输出速度 2MHZGPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // GPIO设置上拉GPIO_Init(KEY0_GPIO,&GPIO_InitStruct); // 初始化GPIO
}

设置好GPIO为输入模式后,就可以在main函数中轮询GPIO的状态

int main(void)
{u8 key_flag = 0;system_tick_init();bsp_led_init();	 // 初始化ledbsp_key_init();  // 初始化按键while(1){// 轮询GPIO状态if(GPIO_ReadInputDataBit(KEY0_GPIO,KEY0_GPIO_PIN) == RESET) // 判断GPIO是否为低电平{delay_ms(50); // 延时if(GPIO_ReadInputDataBit(KEY0_GPIO,KEY0_GPIO_PIN) == RESET){GPIO_ToggleBits(LED_RED_GPIO,LED_RED_GPIO_PIN);}while(GPIO_ReadInputDataBit(KEY0_GPIO,KEY0_GPIO_PIN) != SET);}}}
http://www.lryc.cn/news/130161.html

相关文章:

  • Jenkins-CICD-python/Java包升级与回退
  • 模糊测试面面观 | 模糊测试工具知多少
  • esp8266+电压检测模块检测电池电压
  • MongoDB增删改查操作
  • Python | Package | Python的三种包安装方式(pip/whl/tar.gz)
  • 1. 微信小程序开发环境搭建
  • Redis五大基本数据类型及其使用场景
  • 优于立方复杂度的 Rust 中矩阵乘法
  • CentOS gcc介绍及快速升级
  • IO多路复用中select的TCP服务器模型和poll服务模型
  • AI工程师招募;60+开发者AI工具清单;如何用AI工具读懂插件源码;开发者出海解读;斯坦福LLM课程 | ShowMeAI日报
  • Mysql 使用JSON_SEARCH函数 判断多表查询时,某个拼接字段是否包含另外一个字段
  • C++头文件
  • 无脑入门pytorch系列(四)—— scatter_
  • 【Spring源码】Spring扩展点及顺序
  • 广州华锐互动:3D数字孪生开发编辑器助力企业高效开发数字孪生应用
  • 【脚踢数据结构】图(纯享版)
  • [leetcode] 707 设计链表
  • JIRA:项目管理的秘密武器
  • ARM 作业1
  • 【解析postman工具的使用---基础篇】
  • Elasticsearch:如何在 Ubuntu 上安装多个节点的 Elasticsearch 集群 - 8.x
  • 记录win 7旗舰版 “VMware Alias Manager and Ticket Service‘(VGAuhService)启动失败。
  • git 开发环境配置
  • Tableau画图
  • nginx上web服务的基本安全优化、服务性能优化、访问日志优化、目录资源优化和防盗链配置简介
  • himall3.0商城源码
  • 【LeetCode75】第二十九题 删除链表的中间节点
  • Floyd(多源汇最短路)
  • Pycharm找不到Conda可执行文件路径(Pycharm无法导入Anaconda已有环境)