1、软件定时
以下接口使用的定时器由软件实现,定时器的函数在任务中被执行。因为任务可能被中断,或者被其他高优先级的任务延迟,因此以下os_timer系列的接口并不能保证定时器精确执行。
注意:
①对于同一个 timer,os_timer_arm或os_timer_arm_us不能重复调用,必须先os_timer_disarm。②os_timer_setfn必须在 timer 未使能的情况下调用,在os_timer_arm或os_timer_arm_us之前或者os_timer_disarm之后。
1、主函数user_init中加入下列代码:
static os_timer_t os_timer_user;
//主函数之 用户自定义定时器函数
os_timer_disarm (&os_timer_user);//取消定时器定时
os_timer_setfn(&os_timer_user, (ETSTimerFunc *)(time_user), NULL);//设置定时器回调函数。使⽤用定时器,必须设置回调函数。
os_timer_arm (&os_timer_user, 300, true);//使能毫秒级定时器
2、软件定时执行的函数
//软件定时器回调函数
void ICACHE_FLASH_ATTR
time_user(void){
static x = 0;
os_printf(" Number_X: %d !!!\r\n",x++);
system_soft_wdt_feed();//这里我们喂下看门狗 ,不让看门狗复位
}
2、硬件定时
相比软件定时来说硬件定时器则能精确执行。
注意:
①如果使用 NMI 中断源,且为自动填装的定时器,调用hw_timer_arm时参数val必须大于 100。
②如果使用 NMI 中断源,那么该定时器将为最高优先级,可打断其他 ISR。
③如果使用 FRC1 中断源,那么该定时器无法打断其他 ISR。
④hw_timer.c的接口不能跟 PWM 驱动接口函数同时使用,因为二者共用了同一个硬件定时器。
⑤硬件中断定时器的回调函数定义,请勿添加ICACHE_FLASH_ATTR宏。
⑥使用hw_timer.c的接口,请勿调用wifi_set_sleep_type(LIGHT_SLEEP);将⾃自动睡眠模式设置为 Light-sleep。因为 Light-sleep 在睡眠期间会停 CPU,停 CPU 期间不能响应 NMI 中断。
1、主函数user_init中加入下列代码:
hw_timer_init (FRC1_SOURCE, 1);//初始化硬件ISR定时器
hw_timer_set_func(hw_timer_sec);//设置定时器回调函数。使用定时器,必须设置回调函数。
hw_timer_arm(1000000);//使能硬件中断定时器 1 秒
2、硬件定时执行的函数
void hw_timer_sec(void){
static y = 0;
os_printf(" Number_Y: %d !!!\r\n",y++);
system_soft_wdt_feed();//这里我们喂下看门狗 ,不让看门狗复位
}