ESP8266--系统软件定时器

系统软件定时器

1. 软件的事情注意事项

以下内容摘录于《ESP8266 Non-OS SDK API参考》。

  • 对于需要进行轮询的应用,建议使用系统定时器定期检查事件。
    –如果使用循环(while和for),不仅效率低下,而且阻塞CPU,不建议使用。
    –如果需要在定时器回调中执行os_delay_us或while或for,请勿占用CPU超过15ms。
  • 请勿频繁电源定时器,建议频率不高于每5ms一次(微秒计时器则为100us)。有关定时器使用的详细信息,请参阅os_timer_arm()和相关的API说明。
  • 微秒定时器不是很精确,请在回调中考虑500us的抖动。如需实现高精度的定时器,可以参考驱动程序(driver_lib)使用硬件定时器。请注意,PWM API不能与硬件定时器同时使用。
  • 请勿长时间关闭中断,ISR执行事件也应当尽可能短(即微秒级)。

2.软件定时器相关API函数

以下软件定时器接口位于**/ESP8266_NONOS_SDK/include/osapi.h**。请注意,以下接口使用的定时器由软件实现,定时器的函数在任务中被执行。因为任务可能被中断,或者被其他高优先级的任务延迟,因此以下os_timer系列的接口并不能保证定时器精确执行。
如果需要精确的定时,例如,周期性操作某GPIO,请使用硬件定时器,具体可参考hw_timer.c,硬件定时器的执行函数在中断里被执行。
注意:

  • 对于同一个timer,os_timer_srm或os_timer_arm_us不能重复调用,必须先os_timer_disarm。
  • os_timer_setfn必须在timer未使能的情况下调用,在os_timer_arm或os_timer_arm_us之前或os_timer_disarm之后

2.1 定时器数据类型

数据类型:os_timer_t
底层宏定义:#define os_timer_t  ETSTimer
底层结构体重命名:
typedef struct _ETSTIMER_ {
    struct _ETSTIMER_    *timer_next;
    uint32_t              timer_expire;
    uint32_t              timer_period;
    ETSTimerFunc         *timer_func;
    void                 *timer_arg;
} ETSTimer;
例子:os_timer_t os_timer_500ms; //定义一个定时器名称

2.2 os_timer_arm()函数

函数原型:void os_timer_arm (os_timer_t *ptimer, uint32_t milliseconds, bool repeat_flag)
函数功能:使能毫秒级定时器
函数形参:
          os_timer_t *ptimer:定时器结构—我们自己定义的定时器名称的地址
          uint32_t milliseconds:定时事件,单位:毫秒
                             如未调用system_timer_reinit,可支持范围5 ~ 7067555ms
                             如未调用system_timer_reinit,可支持范围 100 ~ 428496ms
          bool repeat_flag:定时器是否重复  1:重复  0:不重复
返回值:无
例子:
         os_timer_arm (&os_timer_500ms, 500, 1);//设置os_timer_500ms定时器为一个500ms可重复延时的定时器

2.3 os_timer_disarm()函数

函数原型:void os_timer_disarm (os_timer_t *ptimer)
函数功能:取消定时器定时
函数形参:
          os_timer_t *ptimer:定时器名称地址
返回值:无
例子:os_timer_disarm (&os_timer_500ms);//取消os_timer_500ms定时器

2.4 os_timer_setfn()函数

函数原型:void os_timer_setfn(os_timer_t *ptimer, os_timer_func_t *pfunction, void *parg);
#define os_timer_setfn ets_timer_setfn
void ets_timer_setfn(os_timer_t *ptimer, os_timer_func_t *pfunction, void *parg);
函数功能:设置定时器回调函数。使用定时器,必须设置回调函数。
函数形参:
          os_timer_t *ptimer:定时器名称地址
#define os_timer_t  ETSTimer
typedef struct _ETSTIMER_ {
    struct _ETSTIMER_    *timer_next;
    uint32_t              timer_expire;
    uint32_t              timer_period;
    ETSTimerFunc         *timer_func;
    void                 *timer_arg;
} ETSTimer;
os_timer_func_t *pfunction:定时器回调函数[需要进行类型转换]
          void *parg:回调函数的参数
例子:os_timer_setfn(&os_timer_500ms,(os_timer_func_t*)TimerBackFunction,NULL);//设置os_timer_500ms_back()为回调函数
/****回调函数的作用类似于中断服务函数,但是没有固定的回调函数的名称,需要自己定义。****/

2.5 system_timer_reinit()函数

函数原型:void system_timer_reinit (void)
函数功能:
          重新初始化定时器,当需要使用微秒级定时器时调用
函数形参:无
返回值:无
注:
	1.同时定义 
	2. system_timer_reinit在程序最开始调用,user_init的第一句。

2.6 os_timer_arm_us()函数

函数原型:void os_timer_arm_us (os_timer_t *ptimer, uint32_t microseconds, bool repeat_flag);
函数功能:使能微秒级定时器
函数形参:
          os_timer_t *ptimer:定时器地址
          uint32_t microseconds:定时时间,单位:微秒,最小定时0x64,最大可输入0Xfffffff(‭100‬ - ‭268435455‬)
          bool repeat_flag:定时器是否重复
返回值:无
例子:os_timer_arm_us(&os_timer_500ms,500000);//定时器500ms延时

参考代码

//timer.c源代码
/*
* timer.c
*
*  Created on: 2018年8月14日
*      Author: 小良哥
*/

#include "driver/delay.h"
#include "driver/led.h"
#include "driver/key.h"
#include "driver/uart.h"
#include "driver/timer.h"

/*
* 函数名称:void TimerInitConfig(uint32_t DelayMs,bool repeat_flag)
* 函数功能:定时器初始化函数
* 函数形参:
*       uint32_t DelayMs   延时时间
*       bool repeat_flag   是否重复
*       		1:重复   0:不重复
* 返回值:
* */
os_timer_t os_timer_500ms;//定义一个定时器名称
void TimerInitConfig(uint32_t DelayMs, bool repeat_flag)
{
	os_timer_disarm(&os_timer_500ms);//关闭定时器
	os_timer_setfn(&os_timer_500ms, (os_timer_func_t *)TimerBackFunction, NULL);//设置定时器回调函数
	os_timer_arm(&os_timer_500ms, DelayMs, repeat_flag);
}

/*
* 函数名称:void TimerBackFunction(void)
* 函数功能:定时器回调函数
* 函数形参:无
* 返回值:   无
* */
int i = 1;
void TimerBackFunction(void)
{
	//	static int i = 1;//为什么静态变量不起作用???
	i = !i;
	LED(i);
	os_printf("\r\n定时器测试代码---LED灯翻转\r\n");
}
//timer.h源代码
/*
* timer.h
*
*  Created on: 2018年8月14日
*      Author: 小良哥
*/

#ifndef APP_INCLUDE_DRIVER_TIMER_H_
#define APP_INCLUDE_DRIVER_TIMER_H_

#include "ets_sys.h"
#include "osapi.h"

#include "user_interface.h"
#include "gpio.h"
#include "eagle_soc.h"
#include "osapi.h"

extern os_timer_t os_timer_500ms;

void TimerInitConfig(uint32_t DelayMs, bool repeat_flag);
void TimerBackFunction(void);

#endif /* APP_INCLUDE_DRIVER_TIMER_H_ */
//user_main.c源代码
//添加头文件
#include "ets_sys.h"
#include "osapi.h"

#include "user_interface.h"
#include "driver/uart.h"
#include "gpio.h"
#include "eagle_soc.h"
#include "driver/delay.h"
#include "driver/led.h"
#include "driver/key.h"

/******************************************************************************
* FunctionName : user_init
* Description  : entry of user application, init user function here
* Parameters   : none
* Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR user_init(void)
{
	system_soft_wdt_feed();//喂软件看门狗,防止程序跑偏
	uart_init(9600, 9600);//设置串口波特率
	LedInitConfig();//LED灯初始化函数
	KeyInitConfig();//按键初始化函数
	KeyExtiInitConfig();//配置按键外部中断
	TimerInitConfig(500, 1);
	os_printf("=============================================\r\n");
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n嵌入式陈工个人编辑资料\r\n未经本人同意请勿私自传播\r\n");
	os_printf("\r\n定时器控制代码\r\n");
	os_printf("\r\n带看门狗\r\n");
	os_printf("=============================================\r\n");
}

源代码参考:https://github.com/ChenJiliang00/ESP8266

你可能感兴趣的:(ESP8266_12F)