上次玩的是串口输出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
下一期还是继续玩GPIO吧,玩一玩输入模式!
更多回帖