一、软件定时器的使用
ESP8266的软件定时器不是特别的精准,想要精准的定时器,那么最好是使用硬件定时器,这一点在SDK手册上面有说到
软定时有5个函数和一个结构体
结构体:os_timer_t
typedef struct _ETSTIMER_ {
struct _ETSTIMER_ *timer_next;
uint32_t timer_expire;
uint32_t timer_period;
ETSTimerFunc *timer_func;
void *timer_arg;
} ETSTimer;
结构体是不用用户去配置的,但是需要声明一个结构体
函数一:os_timer_setfn()
定时器设置回调函数的函数,这个函数有三个参数,分别是:
void os_timer_setfn(
os_timer_t *ptimer, // 定时器结构体
os_timer_func_t *pfunction, // 定时器回调函数
void *parg // 回调函数的参数
)
回调函数的类型是os_timer_func_t
,回调函数的设置需要在定时器使能之前设置
函数二:os_timer_arm()
定时器使能函数
void os_timer_arm (
os_timer_t *ptimer, // 定时器结构体
uint32_t milliseconds, // 定时时间ms(定时器时间是有限制的具体看SDK)
bool repeat_flag // 是否重复定时器标志 1-重复,0-不重复
)
函数三:os_timer_disarm()
定时器失能函数,该函数只有一个参数,定时器结构体
函数四:system_timer_reinit()
定时器重新初始化函数,改函数仅仅在使用微秒级定时器
的时候调用,调用在程序最初user_init
的第一句,函数没有参数
函数五:os_timer_arm_us()
• 需要先定义 USE_US_TIMER
,并在 user_init 起始第一句,先调用 system_timer_reinit
• 最高精度为 500μs
void os_timer_arm_us (
os_timer_t *ptimer, // 定时器结构体
uint32_t microseconds, // 定时时间500us起步
bool repeat_flag // 是否重复标志
)
user_mian
代码:
/*定时器结构体*/
os_timer_t ledtimer;
uint8 led_value;
/*回调函数定义*/
void Led_Overturn(void)
{
os_printf("OLG");
led_value = ~led_value;
GPIO_OUTPUT_SET(GPIO_ID_PIN(5),led_value);
}
/*定时器设置*/
os_timer_disarm(&ledtimer); // 关闭定时器
os_timer_setfn(&ledtimer, (os_timer_func_t *)Led_Overturn, (void*)0); // 设置定时器的回调函数
os_timer_arm(&ledtimer, 500, 1); // 打开定时器,500ms,重复
这里还需要注意的一点,不要在后面加上
while(1)
{
system_soft_wdt_feed(); // 喂狗
}
二、硬件定时器的使用
硬件定时器的api
有三个
函数一:hw_timer_init()
void hw_timer_init (
FRC1_TIMER_SOURCE_TYPE source_type, // 中断源的选择,有两个
u8 req // 是否自动重装
)
FRC1_SOURCE: 使用 FRC1 中断源,不可以打断其他的中断
NMI_SOURCE: 使用 NMI 中断源,可以打断其他的中断
函数二:hw_timer_arm()
硬件定时器使能,参数为定时时间,单位是us,不同的中断源有不同的取值范围。具体看SDK
函数三:hw_timer_set_func()
设置硬件定时器回调函数,参数是回调函数的指针
void hw_timer_set_func (void (* user_hw_timer_cb_set)(void) )
回调函数在定义的时候,不能加上ICACHE_FLASH_ATTR
宏
user_main
代码:
/*回调函数定义*/
void Led_Overturn(void)
{
os_printf("OLG");
led_value = ~led_value;
GPIO_OUTPUT_SET(GPIO_ID_PIN(5),led_value);
}
hw_timer_init(NMI_SOURCE, 1); // 初始化-NMI中断源(可打断),1-自动重装
hw_timer_set_func(Led_Overturn); // 设置回调函数
hw_timer_arm(1000*1000); // 1s
当然硬件定时器的使用需要添加源文件hw_timer.c
和头文件hw_timer.h
2020.5.27