6、Esp8266 软件定时器

定时器的函数在任务中被执行。因为任务可能被中断,或者被其他高优先级的任务延迟,因此以下 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);   //把传递过来的参数,打印到串口
	}
}

发布了274 篇原创文章 · 获赞 97 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/imxlw00/article/details/104733927