ESP8266-SDK开发入坑(三)-点亮第一个LED

本节例程下载:链接:https://pan.baidu.com/s/1o9GxA9W 密码:erg9
SDK v1.2.0 API的手册:链接:https://pan.baidu.com/s/1kWr1oZd 密码:ylgk


1、实验目的

初步了解GPIO控制、定时器的操作。

2、代码展示

#include "ets_sys.h"//定时器中断相关
#include "osapi.h"//定时器和字符串的API函数
#include "gpio.h"//GPIO相关函数
#include "user_interface.h" //包含 os_timer相关结构体
//#include "driver/uart.h"
//#include "spi_flash.h"
//#include "espconn.h"
//#include "user_config.h"
//#include "smartconfig.h"
LOCAL os_timer_t timer;//定义定时器结构体
char flag = 1; //

void timer_callback(){
    if(flag)
    {
        GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
        flag = 0;
    }
    else
    {
        GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
        flag = 1;
    }
}

void user_init(void)
{
     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO2);

     os_timer_disarm(&timer);
     os_timer_setfn(&timer,(os_timer_func_t *)timer_callback,NULL);
     os_timer_arm(&timer,1000,1);
}

void user_rf_pre_init(){}

3、代码解读

程序里面涉及到的函数有三个,

user_init()是入口函数,相当于main函数,
user_rf_pre_init()是SDK1.1.0及之后版本需要增加的函数,暂时我还不知道怎么用。
timer_callback()是一个定时器回调函数。

首先定义一个定时器函数和一个状态变量,用于判断LED灯的状态

LOCAL os_timer_t timer;  
char flag = 1;  

首先入口函数中选择GPIO2管脚

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO2);  

然后定义定时器,语法可参考编程手册,里面说的都很详细了

os_timer_disarm(&timer);  
os_timer_setfn(&timer,(os_timer_func_t *)timer_callback,NULL);  
os_timer_arm(&timer,1000,1); 

os_timer_setfn(&timer(os_timer_func_t*)timer_callback,NULL);
其中 timer_callback就是回调函数。
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);这句的意思就是GPIO2输出低电平,1为高电平,其它的口类似,具体的语法解释也可以参考编程手册,都有详细说明。

程序写好后Clean一下项目再编译一下生成0x00000.bin0x40000.bin,按照前面的教程将这两个文件刷进模块,记住这里只要刷两个文件就可以了,所以刷写的时候只要勾选这两个文件前面的复选框,固件刷进去后断电重新加电模块开始工作。

4、硬件操作

不需要,灯GPIO2是EPS-12E自带的!

5、总结

分享一个前辈总结的GPIO控制


设置其为读取状态功能则这样初始化: GPIO_DIS_OUTPUT(GPIO_ID_PIN(14)) ;


选中某个引脚,然后控制。
以下是输出控制

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(0), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(1), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(2), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(3), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(4), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(5), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(12), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(13), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(14), level);

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
      GPIO_OUTPUT_SET(GPIO_ID_PIN(15), level);

      gpio16_output_conf();
      gpio16_output_set(level);

以下是输入采集

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(0));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(1));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(2));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(3));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(4));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(5));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(12));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(13));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(14));

      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
      result = GPIO_INPUT_GET(GPIO_ID_PIN(15));

      gpio16_input_conf();
      result = gpio16_input_get();

定时器控制

1、先定义结构体

    LOCAL os_timer_t timer;

2、初始化定时器

    os_timer_disarm(&timer);//关闭定时器,相当于清零计时器计数
    os_timer_setfn(&timer, (os_timer_func_t *)timer_callback, NULL);//初始化定时器
    os_timer_arm(&timer, 1000, 0);//开始定时器计数,1000毫秒后,会调用前面的callback函数 (后面的0表示只运行一次 为1表示循环运行)

3、设置需要被调用的程序

    void timer_callback()
    {
        uart0_sendStr("\r\n《定时器测试》\r\n");
    }

你可能感兴趣的:(ESP8266之SDK开发)