• ESP8266_04管脚控制与软件定时器


    ESP8266_04管脚控制与软件定时器

    from :https://mp.weixin.qq.com/s/APawDx4io4gKJyOeuErTLA

             这一节主要有两部分内容:1、管脚的控制;2、软件定时器的使用。

             先说定时器,ESP8266内部的定时器分为软件定时器和硬件定时器。手册中指出硬件定时器其实就跟单片机里的timer一样,而软件定时器纯粹由软件实现,咱们可以理解为单片机里面类似for循环之类的循环延时函数。

             定时器理解了,管脚控制就简单了,先上一下我这里的模块原理图:

             原理很简单,板上有一个三色的LED,所以这里实现一个定时实现LED开关的程序。先说GPIO的用法,分俩步。使用之前包含“user_interface.h”文件:

            

    1、设置管脚为普通的GPIO模式

             PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);

             函数PIN_FUNC_SELECT的功能是选择管脚功能,第一个参数是管脚的名字,第二个参数看起来像管脚编号,但其实是管脚对应的功能。

             在编译器中选中FUNC_GPIO12,按F3,会打开eagle_soc.h文件,在这个文件里你会发现,无论是FUNC_GPIO12,FUNC_GPIO13,还是多少,对应的宏定义都是3:

             #define FUNC_GPIO12                     3

            

    2、设置管脚方向和电平

             gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0):

             该函数的功能是设置GPIO属性,共有四个参数,没有用到的填0即可。

             第一个参数,设置输出为高的位;

             第二个参数,设置输出为低的位;

             第三个参数,设置使能输出的管脚;

             第四个参数,设置使能输入的管脚。

             所以上面一行代码的意思是:设置GPIO12和GPIO13为输出,12输出高,13输出低。同理,下面一行代码的意思是:设置GPIO12为输入。

             gpio_output_set(0, 0, 0, BIT12):

             注:参考手册2c-esp8266_sdk_api_guide_cn_v1.5.4的152页。

             

           然后是软件定时器的使用,使用之前包含如下两个头文件:

             #include "ets_sys.h"       //内有timer结构体的定义

             #include "osapi.h"

            使用方法也很简单,共分四步:

           

    1、定义一个软件定时器的结构体

            os_timer_t LED_timer;             //定义一个软件定时器的结构体,用于实现周期操作

             

    2、关掉该定时器的定时功能

             os_timer_disarm(&LED_timer);      //配置之前,先关闭

           

    3、设置该定时器的回调函数。使用定时器,必须设置回调函数

             os_timer_setfn(&LED_timer, (os_timer_func_t *)LED_TURN, NULL);

             该函数共有三个参数:

             第一个,你要设置哪个定时器?LED_timer

             第二个,定时器定时时间到了之后,要执行哪个函数:LED_TURN

             第三个,回调函数的参数,没有的话写NULL即可。

             完了,也很简单。等等!定时的时长是多少?别急。

             

    4、使能定时器,并设置时长,是否循环执行

             os_timer_arm(&LED_timer, 3000, 1);

             该函数共有三个参数:

             第一个,你要使能哪个定时器?         LED_timer

             第二个,时长多长?                                 3000,单位是毫秒。另有微秒的函数,可自行研究。

             第三个,这三秒定时的功能只运行一次,还是循环执行?1,循环;0,一次。

             第三步里,提到了一个函数LED_TURN,这个函数就是开启或关闭LED的函数:

    void LED_TURN()

    {

             static state_flag = 0;

             if(state_flag == 0)

             {

                       //GPIO12拉高,GPIO13拉低

                       gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0);

                       state_flag = 1;

             }

             else

             {

                       gpio_output_set(BIT13, BIT12, BIT12|BIT13, 0);

                       state_flag = 0;

             }

    }

             到此,软件定时器的用法说完了。

             注:参考手册2c-esp8266_sdk_api_guide_cn_v1.5.4的23页。

             注意事项:手册建议,不要在程序中使用while(1)  实现死循环,非常危险。

             依次clean和build一下,生成bin文件,下载后可看到板上的LED,依次亮灭。

             程序下载链接:https://pan.baidu.com/s/1fDc4ap2TeazjP_nQL7ZtVg
             提取码:9onb

  • 相关阅读:
    4270. 【NOIP2015模拟10.27】魔道研究
    4269. 【NOIP2015模拟10.27】挑竹签
    NOIP2015模拟10.28B组
    JZOI5257. 小X的佛光
    4260. 最大子矩阵 (Standard IO)
    1010. 【CQOI2009】叶子的颜色
    【NOIP2015模拟10.22】最小代价
    JZOI 距离 (Standard IO) 题解
    统计和 luogu P2068 树状数组和线段树练手
    2020.7.15模拟赛
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/11260321.html
Copyright © 2020-2023  润新知