物联网领域Esp8266学习之旅③ 利用 " 软件定时器 " 定时0.5秒闪烁点亮一盏LED。(附带demo)

欢迎来到物联网智能家居顶量级别wifi模块Esp8266学习之旅。


  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

    • ①、 Esp8266之 搭建开发环境,开始一个“hellow world”串口打印。

    • ②、 Esp8266 之利用GPIO开始使用按钮点亮你的“第一盏灯”。

    • ③、 Esp8266之 利用 " 软件定时器 " 定时0.5秒闪烁点亮一盏LED。

    • ④ 、Esp8266之 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。

    • ⑤ 、Esp8266之 原生乐鑫SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。

    • ⑥ 、Esp8266之 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。

一、认识定时器。


  • 在我们的SDK编程手册可以清楚看到8266有软件定时器和硬件定时器。

物联网领域Esp8266学习之旅③ 利用
这里写图片描述

  • 个人见解。如果你可以使用更为精确的定时时间,那你就用硬件定时器来。至于在性能上,我觉得硬件定时器是比较耗性能的,在PWM里面,hw_timer.c 的接⼝口不不能跟 PWM 驱动接⼝口函数同时使⽤用,因为二者共⽤用了了同⼀一个硬 件定时器。

  • 而且硬件中断定时器器的回调函数定义,请勿添加 ICACHE_FLASH_ATTR。


二、使用软件定时器步骤:


  • ①、先宏定义一个定时器结构体:
// 定时器结构体 
static os_timer_t os_timer;
  • ②、对于同一个定时器不能同时使用,所以我在初始化前先关闭该定时器
// 关闭该定时器 
os_timer_disarm( &os_timer );
  • ③、初始化定时器的回调函数,即每次定时任务函数。下图是函数os_timer_setfn()有关说明。我这里的定时器回调函数是Led_Task_Run ()。
// 配置该定时器回调函数 
os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );
物联网领域Esp8266学习之旅③ 利用
这里写图片描述
  • ④、开始执行我们的定时器,也就是使能操作。下图是这个函数的说明:第二个参数是定时时间,单位us,注意: 1s =1000us ,第三个参数是boolean值,false是不重复,true是重复执行。
// 启动该定时器 
os_timer_arm( &os_timer, 500, true );
物联网领域Esp8266学习之旅③ 利用
这里写图片描述

三、看看我们的效果图(0.5秒LED灯闪一次):


这里写图片描述

  • 电路图:

物联网领域Esp8266学习之旅③ 利用
电路图

  • 我们的逻辑是:通过定时器每0.5秒执行一次开灯或关灯指令。使GPIO12为高电平输出或低电平输出。

  • 代码:


/** 定时器结构体 */
static os_timer_t os_timer;


/** LED操作命令 */
void Led_Cmd(bool status ){
    if (status == true ) {
        GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);
    } else {
        GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);
    }
}



void Led_Task_Run(void){

    static bool status = false;
      if ( status == true ) {
            status = false;
        } else  {
            status = true;
        }
     Led_Cmd( status );
}

void  user_init(void)//初始化
{

        // 设置串口0和串口1的波特率
        uart_init(57600, 57600);

        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
        Led_Cmd(false);

       /** 关闭该定时器 */
       os_timer_disarm( &os_timer );
       /** 配置该定时器回调函数 */
       os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );
       /** 启动该定时器 */
       os_timer_arm( &os_timer, 500, true );
}

void user_rf_pre_init()
{

}


源码下载 : https://github.com/xuhongv/StudyInEsp8266


你可能感兴趣的:(物联网领域Esp8266学习之旅③ 利用 " 软件定时器 " 定时0.5秒闪烁点亮一盏LED。(附带demo))