定时器的函数在任务中被执行。因为任务可能被中断,或者被其他高优先级的任务延迟,因此以下 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 之后。
API
毫秒实验LED闪烁
定时500ms LED闪烁
// 注: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); // ③:关闭软件定时器
// 设置定时器
// 参数一:要设置的定时器;参数二:回调函数(需类型转换);参数三:回调函数的参数
//【注: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,可支持范围:[5ms ~ 6,870,947ms]】
// 【如果调用system_timer_reinit,可支持范围:[100ms ~ 428,496 ms]】
}
// LED初始化
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1
}
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
LED_Init_JX(); // LED初始化
// 初始化软件定时器
OS_Timer_1_Init_JX(500,1); // 500ms(重复)
// while(1) system_soft_wdt_feed(); // 死循环,测试用
os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}
毫秒实验 串口打印
定时500ms 串口打印重复模式测试
os_timer_t test_timer; //定义一个定时器结构
u8 *buff="重复模式测试\r\n"; //作为参数,传递给回调函数
void ICACHE_FLASH_ATTR timer_testTask(void *arg); //函数声明,定时器回调函数
void ICACHE_FLASH_ATTR user_init(void)
{
os_timer_setfn(&test_timer,timer_testTask,buff); //设置回调函数,buff作为参数传递给回调函数
os_timer_arm(&test_timer,500,1); //使能定时器,500ms的间隔时间,重复调用
}
/*-------------------------------------------*/
/*函数功能:定时器回调函数 */
/*参 数:arg:传进来的参数 */
/*返 回:无 */
/*-------------------------------------------*/
void ICACHE_FLASH_ATTR timer_testTask(void *arg)
{
os_printf("%s",arg); //把传递过来的参数,打印到串口
}
微秒实验 串口打印
添加宏定义
#define USE_US_TIMER //使用微秒级的定时器,需要该宏定义
os_timer_t test_timer; //定义一个定时器结构
u8 *buff="微秒级重复测试\r\n"; //作为参数,传递给回调函数
u16 time_counter=0; //一个计数器
void ICACHE_FLASH_ATTR timer_testTask(void *arg); //函数声明,定时器回调函数
void ICACHE_FLASH_ATTR user_init(void)
{
//#define USE_US_TIMER //注意:使用微秒级的定时器时需要该宏定义,在user_confg.h头文件中
system_timer_reinit(); //使用微秒级定时,需要重新初始化定时器,必须在第一句调用
os_timer_setfn(&test_timer,timer_testTask,buff); //设置回调函数,buff作为参数传递给回调函数
os_timer_arm_us(&test_timer,100,1); //使能微秒定时器,100us的间隔时间,1重复调用0不重复
}
/*-------------------------------------------*/
/*函数功能:定时器回调函数 */
/*参 数:arg;传递进来的参数 */
/*返 回:无 */
/*-------------------------------------------*/
void ICACHE_FLASH_ATTR timer_testTask(void *arg)
{
time_counter++; //每次100us定时到,time_counter+1
if(time_counter>=5000) //当time_counter>=5000的时候,也就是500ms
{
time_counter=0; //清除time_counter
os_printf("%s",arg); //把传递过来的参数,打印到串口
}
}