一:简述
硬件为ESP-LAUNCHER开发板(使用GPIO12)。
要求是某一定时间指示灯状态发生改变。
ESP8266定时功能的实现有两种方式:软件定时器和硬件定时器。
软件定时器的接口在/ESP8266_NONOS_SDK/include/osapi.h中,由于软件定时器的任务可能被中断,或者被
其他⾼高优先级的任务延迟,所以若想获取准确的定时任务,可以选择硬件定时器,但是硬件定时器不能与PWM接口函数同时使用,因为两者共用一个硬件中断定时器。
二:软件定时器的使用
- 首先,定义一个定时器的结构体。
- 其次,先进行关闭定时器,因为对于同⼀个 timer,os_timer_arm 或 os_timer_arm_us 不能重复调⽤,必须先os_timer_disarm。
- 再者,进行定时函数的回调。
- 最后,开启定时器。
- 程序:
static os_timer_t os_timer;//定义延时结构体
void LED_INIT()
{
uint32 i;
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));//设置IO13为输入
i = ~GPIO_INPUT_GET(GPIO_ID_PIN(12));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//选择指示灯IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(12),i);
}
void ICACHE_FLASH_ATTR user_init()//初始化
{
uart_init(115200, 115200);//设置串口0和串口1的波特率
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//选择指示灯IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//默认指示灯不亮
//软件延时函数练习
os_timer_disarm (&os_timer);
os_timer_setfn(&os_timer, (ETSTimerFunc *) (LED_INIT), NULL);
os_timer_arm(&os_timer, 1000, true);
三:硬件定时器的使用
硬件中断定时器接口位于 /ESP8266_NONOS_SDK/examples/driver_lib/hw_timer.c中。
注意:硬件定时器的回调函数前不能添加 ICACHE_FLASH_ATTR 宏定义,中断响应不能存放在 Flash 中。
- 首先,确定中断源以及是否重装。
- 其次,确定定时器回调函数。
- 最后,启动定时器。
- 程序
void ICACHE_FLASH_ATTR user_init(void) {
uart_init(57600, 57600);
os_printf("SDK version:%s\n", system_get_sdk_version());
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//默认指示灯不亮
hw_timer_init(NMI_SOURCE, 0);//初始化确定使用的中断源以及是否自动填装
hw_timer_set_func(LED_INIT);
hw_timer_arm(500);
}
如有错误,请批评指正。