0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32学习笔记:GPIO数字输入与数字输出

CHANBAEK 来源:跳动的字节 作者:晓宇 2023-07-13 17:09 次阅读

今天我们来点灯。

多路复用器与GPIO矩阵

ESP32芯片有34个物理 GPIO Pad,每个Pad可以当作通用IO,也可以当作外设的引脚,GPIO 引脚通过非常复杂的 GPIO 矩阵互连,这基本上就是是一个多路复用器,我们可以非常灵活的选择哪些GPIO引脚在内部路由到哪个外设的信号,大家可以看下图:

图片

IO_MUX 中每个 GPIO pad 有一组寄存器。每个 pad 可以配置成 GPIO 功能(连接 GPIO 交换矩阵)或者 直连功能。

有一些高速信号如以太网SDIO、SPI、JTAG、UART 等会旁路 GPIO 交换矩阵以实现更好的高频数字特性。所以高速信号会直接通过 IO_MUX 输入和输出,这样比使用 GPIO 交换矩阵的灵活度要低。

不同于STM32的简单复用,ESP32的多路复用器,使设计人员可以灵活地更改芯片内部的 GPIO 引脚连接并将其路由到任何信号,这样硬件设计上,布线也方便的多。

图片

通过 IO_MUX、GPIO 交换矩阵的外设输入

图片

通过 GPIO 交换矩阵输出信号

ESP32还有18个 GPIO 管脚具有低功耗(低功耗 RTC)和模拟功能,这个我们后面设计到具体案例再细说。

完整管脚说明需要去参考的乐鑫官方《ESP32 技术规格书》

特别提醒

ESP32的IO12上电时的电平会决定外部flash的工作电压,上电时该脚为高则认为flash工作于1.8V,为低则认为flash工作于3.3V。常用的模块该脚内部已下拉,即flash是工作于3.3V的,若外部使用强上拉模块就可能工作异常了。

硬件连接

图片

数字输出功能

这里我们就以一个LED灯来演示,首先,我们需要在setup()中初始化对应的IO在输出模式,使用pinMode函数,第一个参数上对应的IO序号,第二个是IO的模式

pinMode(4, OUTPUT);

然后可以通过digitalWrite()函数改变数字引脚的电平状态,HIGH输出高平,LOW输出低电平

digitalWrite(4, HIGH); // 输出高电平
digitalWrite(4, LOW);  // 输出低电平

所有 ESP32 GPIO 引脚都可以在输入或输出模式下运行。引脚34-39只能用于输入。还有其他一些引脚也有其它特性,这个我们现在也没必要太纠结,用到的时候再去看就好了。

数字输入功能

在输入模式下,我们可以通过IO来读取外部数字信号,我们这里用按键来表示。

跟输出模式一样,我们在setup()中初始化对应的IO在输入模式,也使用pinMode函数

pinMode(2, INPUT);

然后通过digitalRead(GPIO_pin)就可以读取对应IO的电平了。

代码示例

下面的代码我们定义了2个GPIO引脚。GPIO2用于按键输入,GPIO4用于LED输出。

初始化之后,我们在loop()中不断的读取按键的电平状态,并赋值给LED,实现按键下去灯熄灭,松开灯点亮的效果。

#define LED_GPIO 4
#define BTN_GPIO 2
 
int BTN_State = 0; //按键状态
 
void setup()
{
  pinMode(LED_GPIO, OUTPUT);
  pinMode(BTN_GPIO, INPUT);
}
 
void loop()
{
  // 读取按键状态
  BTN_State = digitalRead(BTN_GPIO);
  // 把按键状态做为LED灯的输出
  digitalWrite(LED_GPIO, BTN_State);
}

我们按照前面的教程编译程序,刷入开发板,看下效果:

图片

接下来我们用中断的方式实现一下:

attachInterrupt(uint8_t pin, void ()(void), int mode)函数用来配置中断功能:

  • 参数一,GPIO引脚号
  • 参数二,中断回调函数
  • 参数三,中断触发模式(RISING、FALLING、CHANGE等)

参数三这个可以设置各种模式,例如上升沿触发,下降沿出发,任意沿触发,电平信号等等模式。

我们用上面的例子改一下:

#define LED_GPIO 4
#define BTN_GPIO 2
 
int BTN_State = 0; //按键状态

//中断回调函数
void bt_callBack(void)
{
  BTN_State = digitalRead(BTN_GPIO); // 读取按键状态
  digitalWrite(LED_GPIO, BTN_State); // 把按键状态做为LED灯的输出
}
 
void setup()
{
  pinMode(LED_GPIO, OUTPUT); //LED输出模式
  pinMode(BTN_GPIO, INPUT); //输入上拉模式
  attachInterrupt(BTN_GPIO, bt_callBack, CHANGE); //使能中断
}
 
void loop()
{  
}

主程序中不用做任何事情了,中断检测到有按键按下或松开(任意跳变沿),就会触发执行中断回调函数,然后把结果在LED上输出。

ESP32的GPIO外设相对其它单片机,功能还是略微复杂的,但是不管是SDK的开发还是Arduino方式,官方都帮我们写好相应的库了,复杂的配置都已经定义好了,我们直接调用即可,怎么样,是不是非常简单?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    40

    文章

    5419

    浏览量

    171608
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120235
  • 复用器
    +关注

    关注

    1

    文章

    707

    浏览量

    28308
  • GPIO
    +关注

    关注

    16

    文章

    1204

    浏览量

    52056
  • ESP32
    +关注

    关注

    18

    文章

    971

    浏览量

    17204
收藏 人收藏

    评论

    相关推荐

    ESP8266 NodeMCU怎样读取数字输入数字输出点亮一个led呢

    ESP8266 NodeMCU 怎样读取数字输入数字输出点亮一个led呢?ESP8266 No
    发表于 11-01 06:20

    5、ESP8266 NodeMCU 数字输入数字输出

    ESP8266 NodeMCU 怎样读取数字输入数字输出点亮一个led呢?ESP8266 No
    发表于 10-25 18:36 17次下载
    5、<b class='flag-5'>ESP</b>8266 NodeMCU <b class='flag-5'>数字</b><b class='flag-5'>输入</b>和<b class='flag-5'>数字</b><b class='flag-5'>输出</b>

    ESP32 开发笔记(四)LVGL控件学习 Window 窗口控件 X

    ESP32 开发笔记(四)LVGL控件学习 Window 窗口控件 X
    发表于 11-14 09:06 6次下载
    <b class='flag-5'>ESP32</b> 开发<b class='flag-5'>笔记</b>(四)LVGL控件<b class='flag-5'>学习</b> Window 窗口控件 X

    [ESP32]学习笔记02

    [ESP32学习笔记02]使用ViusalStudio2017开发ESP32、按键输入检测前言一、安装Visual Studio 2017二
    发表于 12-03 17:36 23次下载
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>02

    esp32学习之按键检测gpio中断

    esp32学习gpio中断前言流程选定gpiogpio配置设置回调函数注册中断处理程序前言最近在做一个按键检测,按键检测有两种方法,一种是轮询法,即在rtos中建立一个任务,然后在死循环中判断按键
    发表于 12-04 16:21 14次下载
    <b class='flag-5'>esp32</b><b class='flag-5'>学习</b>之按键检测<b class='flag-5'>gpio</b>中断

    ZYNQ学习笔记_GPIO输入输出

    ZYNQ学习笔记_GPIOGPIO介绍MIO介绍EMIO介绍控制GPIO接口的寄存器原理GPIO介绍GPIO的英文全称为General-pu
    发表于 12-04 19:36 10次下载
    ZYNQ<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>_<b class='flag-5'>GPIO</b>之<b class='flag-5'>输入输出</b>

    ESP32入门之GPIO:点亮一盏LED灯

    物理GPIO引脚,除了一些具有特殊用途的GPIO外,大部分GPIO都可以复用。本文就通过点亮一盏LED灯并通过一个按键控制其亮灭来简单学习如何控制E
    发表于 12-07 17:06 10次下载
    <b class='flag-5'>ESP32</b>入门之<b class='flag-5'>GPIO</b>:点亮一盏LED灯

    [ESP32]学习笔记04

    Analog-to-Digital Converter(模数转换器)的使用今天我们学习ESP32提供的ADC外设的使用,ESP32的每个ADC单元都支持两种模式,单次读取和连续读取(DMA),本次
    发表于 12-22 19:02 9次下载
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>04

    ESP32ESP-IDF 教学(八)—— 模数转换器(ADC)

    ESP32ESP-IDF 学习笔记(七)——模数转换器(ADC)文章目录ESP32ESP
    发表于 12-22 19:08 38次下载
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教学(八)—— 模数转换器(ADC)

    SPI主线协议——ESP32学习笔记

    目录SPI主线协议——ESP32学习笔记零、前言一、什么是SPI?二、通信过程​三、极性和相位四、总结SPI主线协议——ESP32学习
    发表于 12-22 19:23 18次下载
    SPI主线协议——<b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    STM32学习笔记---GPIO

    STM32的学习笔记GPIO我使用的是STM32F401ZGT6,有7组IO口,每组16个引脚,共112个引脚。因为太菜了,确实容易出错,还请赐教参考官方文档:八种IO口模式区别结构原理该单片机在
    发表于 01-13 16:31 6次下载
    STM32<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>---<b class='flag-5'>GPIO</b>

    ESP32 单片机学习笔记 - 04 - ADC和定时器

    ESP32 单片机学习笔记 - 04 - ADC和定时器一、模拟数字转换器 ADC编程指南:Analog to Digital Converter。数据手册:
    发表于 01-17 13:18 11次下载
    <b class='flag-5'>ESP32</b> 单片机<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 04 - ADC和定时器

    ESP32学习笔记:双核

    今天我们来说说ESP32 for Arduino 的双核。
    的头像 发表于 07-15 16:16 4966次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:双核

    ESP32学习笔记:WiFi

    今天我们来说说ESP32 的WiFi。
    的头像 发表于 07-15 16:20 3933次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:WiFi

    数字输入输出原理是什么

    是General-purpose input/output,大部分情况下,我们都会用简称GPIO GPIO的功能,主要是指这个管脚可以作为数字信号的输入或者
    的头像 发表于 11-27 11:45 974次阅读
    <b class='flag-5'>数字</b><b class='flag-5'>输入</b>与<b class='flag-5'>输出</b>原理是什么