【ESP8266】学习笔记2-花式点灯(软定时器)

这部分内容参考NONOS_API参考手册第7、8页

 

初始化软定时器,其中,Led_Task_Run()为软件定时器的回调函数

	
user_init(void)
{

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

    os_printf("\n  ##  HELLO WORLD ##  \n\n");

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);//选择GPIO12
    GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//GPIO12为高   LED
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);//选择GPIO13
    GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);//GPIO13为高   LED

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//选择GPIO2
    GPIO_DIS_OUTPUT(GPIO_ID_PIN(14)) ; // 设置GPIO2为输入
    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 );// 启动该定时器


}

定义软定时器回调函数Led_Task_Run()

//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()
{
	static bool status = false;

	os_printf("timer\n");

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

软件定时器不能与while(1)共存,会无法跳转到回到函数中

如下操作,不可,程序只会留在while1中,只能实现按钮切换LED状态,无法使用定时器切换LED。

	
user_init(void)
{

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

    os_printf("\n  ##  HELLO WORLD ##  \n\n");

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);//选择GPIO12
    GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//GPIO12为高   LED
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);//选择GPIO13
    GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);//GPIO13为高   LED

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//选择GPIO2
    GPIO_DIS_OUTPUT(GPIO_ID_PIN(14)) ; // 设置GPIO2为输入
    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 );// 启动该定时器


    while(1)
    {
    	system_soft_wdt_feed();//这里我们喂下看门狗  ,不让看门狗复位

	    if(GPIO_INPUT_GET(GPIO_ID_PIN(14))==0x00)//读取GPIO2的值,按键按下为0
	    {
			delay_ms(20); //延时20MS,去抖
			if(GPIO_INPUT_GET(GPIO_ID_PIN(14))==0x00)
			{
				os_printf("Button_Down\n");
				bz++;
				if(bz==2)bz=0;
				if(bz==1)GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0);         //GPIO16为低
				if(bz==0)GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);	     //GPIO16为高

				while(GPIO_INPUT_GET(GPIO_ID_PIN(14))==0x00);           //等待按键释放
			}
		}
    }
}


后加1:

不能放while1的原因是因为:

8266的程序不像其他单片机一样跑在main函数中。

而user_init()函数只是开放给用户的一个用户程序的初始化接口,用来配置各项功能的参数。

实际程序只有运行到初始化的特定位置的时候,才会调用一次user_init()函数。然后再运行其他的程序。配合这个初始化接口函数的还有回调函数,当初始化完成之后,满足特定条件,程序会调用回调函数,运行回调函数中的代码。

8266中大部分代码都不展示给用户,为不可见代码!也就是大部分时间在跑的代码。

程序结构如下图。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值