以下内容摘录于《ESP8266 Non-OS SDK API参考》。
以下软件定时器接口位于**/ESP8266_NONOS_SDK/include/osapi.h**。请注意,以下接口使用的定时器由软件实现,定时器的函数在任务中被执行。因为任务可能被中断,或者被其他高优先级的任务延迟,因此以下os_timer系列的接口并不能保证定时器精确执行。
如果需要精确的定时,例如,周期性操作某GPIO,请使用硬件定时器,具体可参考hw_timer.c,硬件定时器的执行函数在中断里被执行。
注意:
数据类型: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; //定义一个定时器名称
函数原型: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可重复延时的定时器
函数原型:void os_timer_disarm (os_timer_t *ptimer)
函数功能:取消定时器定时
函数形参:
os_timer_t *ptimer:定时器名称地址
返回值:无
例子:os_timer_disarm (&os_timer_500ms);//取消os_timer_500ms定时器
函数原型: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()为回调函数
/****回调函数的作用类似于中断服务函数,但是没有固定的回调函数的名称,需要自己定义。****/
函数原型:void system_timer_reinit (void)
函数功能:
重新初始化定时器,当需要使用微秒级定时器时调用
函数形参:无
返回值:无
注:
1.同时定义
2. system_timer_reinit在程序最开始调用,user_init的第一句。
函数原型: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