Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED


Ubuntu18.04 ESP32-S2 二次开发(1) - 开发环境搭建
Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED
Ubuntu18.04 ESP32-S2 二次开发(3)- 按键输入
Ubuntu18.04 ESP32-S2 二次开发(4)- 建立WIFI AP模式
Ubuntu18.04 ESP32-S2 二次开发(5)- 建立WIFI STA模式
Ubuntu18.04 ESP32-S2 二次开发(6)- 创建TCP客户端

···

操作原理

对于任何一款芯片,GPIO接口是其最基本的组成部分,也是一款芯片入门的最基本操作。
如何搭建环境,之前的文章已详细讲解,此处不再赘述。参考:Ubuntu18.04 ESP32-S2 二次开发(1) - 开发环境搭建
我用的是安信可ESP12K开发板,开发板自带了一个LED,查看原理图,LED连接在了GPIO2上。

ESP12K原理图
LED 灯的阳极都是通过电阻连接到ESP32的 GPIO引脚, 只要我们控制 GPIO
引脚的电平输出状态, 即可控制 LED 灯的亮灭。 接下来我们就需要操作GPIO2了。

ESP32 的 GPIO 接口介绍

官方API手册中介绍说ESP32-S2芯片有43个物理GPIO,每个IO可以用作通用I/O或可以连接到内部外设信号。截取一部分图如下所示:
在这里插入图片描述

ESP32 的 GPIO API介绍

设置 IO 模式函数: gpio_set_pull_mode();

函数原型gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull)
函数功能设置 IO 模式
参数[in] gpio_num:引脚编号,0~34(存在部分)
[in] pull:IO 模式,可以设置:
GPIO_MODE_DISABLE:不输入不输出
GPIO_MODE_INPUT:输入模式
GPIO_MODE_OUTPUT:输出模式
GPIO_MODE_OUTPUT_OD:开漏输出模式
GPIO_MODE_INPUT_OUTPUT_OD:开漏输入输出模式
GPIO_MODE_INPUT_OUTPUT:输入输出模式
返回值ESP_OK:成功
ESP_ERR_INVALID_ARG : 参数错误

设置 IO 输出值函数: gpio_set_level();

函数原型esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level)
函数功能设置 IO 输出值
参数[in]gpio_num:引脚编号,0~34(存在部分)
[in]pull:IO 模式,可以设置:
0:输出低
1:输出高
返回值ESP_OK:成功
ESP_ERR_INVALID_ARG : 参数错误

其他的API可参考官方API手册

ESP32 的 BLINK 例程

在官方给的例程中,也给出了LED闪烁的例子,位置在/ESP-IDF/examples/get-started/blink , 我已截了一张全部的代码图
在这里插入图片描述

宏定义 #define BLINK_GPIO CONFIG_BLINK_GPIO 中的 CONFIG_BLINK_GPIOmenuconfig来映射到对应的IO。

下面来编译此工程,和之前搭建开发环境一样,注意的是要在menuconfig步骤修改IO的引脚,输入

idf.py menuconfig

在其中选择 Example Configuration(通过上下键选择)在这里插入图片描述
然后回车键进入,将GPIO number改为对应连接到LED的IO,我对应开发板的IO是2,然后保存退出,再下载即可。
在这里插入图片描述

ESP32-S2 LED代码解析

官方给的ESP32-S2代码已经集成了Freertos实时操作系统,所以我们的代码都是在这基础上修改的。若是不了解Freertos,建议学习一下。

整个代码如下:

// An highlighted block
void app_main(void)
{
	/* Configure the IOMUX register for pad BLINK_GPIO (some pads are
	   muxed to GPIO on reset already, but some default to other
	   functions and need to be switched to GPIO. Consult the
	   Technical Reference for a list of pads and their default
	   functions.)
	*/
    gpio_reset_pin(BLINK_GPIO);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
    while(1) {
        /* Blink off (output low) */
        printf("Turning off the LED\n");
        gpio_set_level(BLINK_GPIO, 0);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        /* Blink on (output high) */
        printf("Turning on the LED\n");
        gpio_set_level(BLINK_GPIO, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

所有的代码入口都是 void app_main(void) ,这一点和我们写C程序int main入口不太一样,原因是在Freertos系统上运行,这一点不需要太多的解释。

接下来就是 gpio_reset_pin(BLINK_GPIO); ,先复位GPIO,然后设置GPIO输入输出功能:

gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);

BLINK_GPIO 是一个宏定义,取值由硬件的IO连接决定。
GPIO_MODE_OUTPUT 是输出模式

GPIO的设置就是这两句就完成了,然后就是while(1) 死循环,其中的延时函数是:

vTaskDelay(1000 / portTICK_PERIOD_MS);

建议用上面的写法,vTaskDelay是延时多少个时钟节拍。如果直接写1000,必然不是延时1000ms,因为ESP32-S2的freertos时钟节拍不是1ms。

gpio_set_level(BLINK_GPIO, 1);

gpio_set_level 函数用于设置IO的电平,这个也非常好理解。

总结一下,ESP32-S2的GPIO输出操作还是非常的简单。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值