ESP8266笔记-04.ESP8266 GPIO的输出 - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

ESP8266笔记-04.ESP8266 GPIO的输出

上次玩的是串口输出Hello world,这次再来一个星星点灯,我们先把波特率改成74880,这样看起来就没有乱码了,既然没办法去掉乱码,那就和乱码保持一致,顺带一提上次写错bootloader的波特率了,少写了80,所以影响也不大,后来突然想起来,好像不对,但是也懒得改了,这次纠正一下。

接下来就是进行正式点灯吧,还是得打开官方文档看看GPIO的操作,可以看到需要首先增加的一个头文件。

#include "driver/gpio.h"

然后,我们打开原理图,我的板子是我自己画的,三色灯分别对应的时IO2/IO4/IO5,我们先进行一下预定义:

#define GPIO_OUTPUT_IO_0    2
#define GPIO_OUTPUT_IO_1    4
#define GPIO_OUTPUT_IO_2    5
#define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1) | (1ULL<<GPIO_OUTPUT_IO_2))

然后接下来要按照文档对GPIO进行初始化:

//首先定义GPIO设置的结构体:
gpio_config_t io_conf;
//然后关闭中断
io_conf.intr_type = GPIO_INTR_DISABLE;
//设置GPIO模式为输出模式
io_conf.mode = GPIO_MODE_OUTPUT;
//选择GPIO PIN
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
//关闭下拉模式
io_conf.pull_down_en = 0;
//也关闭上拉模式
io_conf.pull_up_en = 0;
//最后写入设置
gpio_config(&io_conf);

接下来是完整的代码:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "driver/uart.h"
#include "driver/gpio.h"

#define GPIO_OUTPUT_IO_0    2
#define GPIO_OUTPUT_IO_1    4
#define GPIO_OUTPUT_IO_2    5
#define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1) | (1ULL<<GPIO_OUTPUT_IO_2))

void app_main()
{
    uart_set_baudrate(0, 74880);
    printf("Esp8266 Hello world!\\n");


    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is ESP8266 chip with %d CPU cores, WiFi, ",
    chip_info.cores);

    printf("silicon revision %d, ", chip_info.revision);

    printf("%dMB %s flash\\n", spi_flash_get_chip_size() / (1024 * 1024),
        (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    gpio_config_t io_conf;
    io_conf.intr_type = GPIO_INTR_DISABLE;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
    io_conf.pull_down_en = 0;
    io_conf.pull_up_en = 0;
    gpio_config(&io_conf);

    int seconds = 0;
    while(true) {
        printf("System has start %d seconds.\\n", seconds);
        gpio_set_level(GPIO_OUTPUT_IO_0, 1);
        vTaskDelay(500 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_OUTPUT_IO_0, 0);
        gpio_set_level(GPIO_OUTPUT_IO_1, 1);
        vTaskDelay(500 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_OUTPUT_IO_1, 0);
        gpio_set_level(GPIO_OUTPUT_IO_2, 1);
        vTaskDelay(500 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_OUTPUT_IO_2, 0);
        vTaskDelay(500 / portTICK_PERIOD_MS);
        seconds += 2;
    }
    fflush(stdout);
    esp_restart();
}

然后就可以看到板子的灯灯一闪一闪亮晶晶咯,同时输出没有乱码的UART
png

下一期还是继续玩GPIO吧,玩一玩输入模式!

更多回帖

×
发帖