一、GPIO口:
? ? ? ? 在嵌入式系统中,通常需要控制许多结构简单的外部设备或电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。对设备的控制,使用传统的串口或并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O口”,也就是GPIO。
二、GPIO输入(key按键):
? ? ? ? 本文以按键输入为例,学习ESP32的GPIO口作为输入时候的配置。通过官方提供的库函数,读取GPIO状态,实现按键检测程序。
1. 硬件连接图:
? ? ? ? ?按键连接的原理图如下,按键没有被按下的时候,GPIO引脚的输入状态为高电平(按键所在的电路不通,引脚通过电阻接3.3V),当按键按下时,GPIO引脚的输入状态为低电平(按键所在的电路导通,引脚接GND。因此,只要检测到引脚的输入电平为低电平,证明按键被按下。
2. KEY驱动程序编写:
?获取GPIO口输出电平函数:int gpio_get_level(gpio_num_t gpio_num);
函数原型 | int gpio_get_level(gpio_num_t gpio_num) | 函数功能 | 读取IO输出电平 | 返回值 | 按键输出值 ? ? ? ? 0:输出低电平 ? ? ? ? 1:输出高电平 |
?key.h
/*
* key.h
*
* Created on: 2021年12月6日
* Author: wangy
*/
#ifndef COMPONENTS_KEY_INCLUDE_KEY_H_
#define COMPONENTS_KEY_INCLUDE_KEY_H_
#include "led.h"
#define KEY 0
void key_init(void);
void key_read(void);
#endif /* COMPONENTS_KEY_INCLUDE_KEY_H_ */
key.c
/*
* key.c
*
* Created on: 2021年12月6日
* Author: wangy
*/
#include "key.h"
unsigned char led_status = 0;
void key_init()
{
led_init(); //初始化LED
//1.选则GPIO
gpio_pad_select_gpio(KEY);
//2.设置GPIO为输入模式
gpio_set_direction(KEY,GPIO_MODE_INPUT);
}
void key_read(void)
{
if(gpio_get_level(KEY)==0) //按键按下
{
while(gpio_get_level(KEY)==0); //等待手松开(阻塞进程)
if(led_status==0)
{
led_on();
led_status =1;
}
else
{
led_off();
led_status = 0;
}
}
}
main.c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "led.h"
#include "key.h"
void app_main(void)
{
/**
* KEY实例,GPIO输入
*/
key_init();
while(1){
key_read(); //按键识别
}
}
3.现象:
? ? ? ? 通过按键,控制LED电平的翻转,继而实现LED灯的亮灭。
|