学习记录
ESP8266 01S 设置软件定时器
api说明
软件定时基于任务,不能保证精度
定时时间
定义变量
// 注:OS_Timer_1必须定义为全局变量,因为ESP8266的内核还要使用
//--------------------------------------------------------------------
os_timer_t OS_Timer_1; // ①:定义软件定时器(os_timer_t型结构体)
定义回调函数
// 软件定时的回调函数
//======================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void) // ②:定义回调函数
{
F_LED = !F_LED;
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED); // LED状态翻转
os_printf("\r\n----OS_Timer_1_cb----\r\n"); // 进入回调函数标志
}
//======================================================================
软件定时器初始化
// 软件定时器初始化(ms毫秒)
//================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
// 关闭定时器
// 参数一:要关闭的定时器
//--------------------------------------------------------
os_timer_disarm(&OS_Timer_1); // ③:关闭软件定时器
//参数为变量的取地址
// 设置定时器
// 参数一:要设置的定时器;
//参数二:回调函数(需类型转换);
//参数三:回调函数的参数(没有参数,所以NULL)
//【注:os_timer_setfn必须在软件定时器未使能的情况下调用!!】
//------------------------------------------------------------------------------------------
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // ④:设置回调函数
// 使能(启动)ms定时器
// 参数一:要使能的定时器;参数二:定时时间(单位:ms);参数三:1=重复/0=只一次
//------------------------------------------------------------------------------------------
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // ⑤:设置定时器参数并使能定时器
//-------------------------------------------------------------------
// 【如未调用system_timer_reinit,可⽀支持范围 5 ~ 0x68D7A3,可支持范围:[5ms ~ 6,870,947ms]】
// 【如果调用system_timer_reinit,可⽀支持范围 100 ~ 0x689D0,可支持范围:[100ms ~ 428,496 ms]】
//-------------------------------------------------------------------
}
//================================================================================================
基于任务
若是在初始化函数中开启一个死循环,则软件定时器失效。因为软件定时器基于任务,任务只有系统空闲时才执行。