硬件定时器

以下硬件中断定时器接⼝位于 /ESP8266_NONOS_SDK/examples/driver_lib/hw_timer.c。
硬件中断定时器就是利用中断进行的定时,而且比软件定时器更为的准确。以下内容摘录于《ESP8266 Non-OS SDK API参考》

1. 硬件定时器相关API函数

1.1 hw_timer_init()函数

函数原型:void hw_timer_init (FRC1_TIMER_SOURCE_TYPE source_type,u8 req)
函数功能:初始化硬件 ISR 定时器
函数形参:
FRC1_TIMER_SOURCE_TYPE source_type:定时器的 ISR 源
可填参数:
          FRC1_SOURCE: 使⽤ FRC1 中断源
          NMI_SOURCE: 使⽤ NMI 中断源
u8 req:是否支持自动填装
 可填参数:
           0:不自动填装
           1:自动填装
    返回值:无
    例子:hw_timer_init(FRC1_SOURCE,1);

1.2 hw_timer_arm()函数

函数原型:void hw_timer_arm (uint32 val)
函数功能:使能硬件中断定时器
函数形参:
          uint32 val:定时时间
自动填装模式:
         使用FRC1中断源FRC1_SOURCE,取值范围:50 – 1677721us
         使用NMI中断源NMI_SOURCE,取值范围:100 -- 1677721us
非自动填装模式:取值范围:10 – 1677721us
返回值:无
例子:hw_timer_arm(100);

1.3 hw_timer_set_func()函数

函数原型:void hw_timer_set_func(void (* user_hw_timer_cb_set)(void) )
函数功能:设置定时器回调函数。使⽤定时器,必须设置回调函数。
函数形参:
         void (* user_hw_timer_cb_set)(void):定时器回调函数,函数定义时请勿添加ICACHE_FLASH_ATTR 宏。
返回值:无
例子:hw_timer_set_func(hw_test_timer_cb);

2. 使用注意事项

  1. 如果使⽤ NMI 中断源,且为⾃动填装的定时器,调⽤ hw_timer_arm 时参数 val 必须⼤于 100。
  2. 如果使⽤ NMI 中断源,那么该定时器将为最⾼优先级,可打断其他 ISR。
  3. 如果使⽤ FRC1 中断源,那么该定时器⽆法打断其他 ISR。
    4. hw_timer.c 的接⼝不能跟 PWM 驱动接⼝函数同时使⽤,因为⼆者共⽤了同⼀个硬件定时器。
  4. 硬件中断定时器的回调函数定义,请勿添加 ICACHE_FLASH_ATTR 宏。
  5. 使⽤ hw_timer.c 的接⼝,请勿调⽤ wifi_set_sleep_type(LIGT_SLEEP); 将⾃动睡眠模式设置为 Light-sleep。因为 Light-sleep 在睡眠期间会停 CPU,停 CPU 期间不能响应 NMI 中断。

3. 参考测试代码

1.因为硬件定时器的API函数接⼝位于 /ESP8266_NONOS_SDK/examples/driver_lib/hw_timer.c之中,所有我们要先移植hw_timer.c到我们的工程

esp8266定时器bug ESP8266定时器中断_esp8266定时器bug

/*
* HwTimer.c
*
*  Created on: 2018年9月10日
*      Author: 小良哥
*/
#include "driver/HwTimer.h"
#include "driver/led.h"
#include "driver/uart.h"

/*
* 函数名称:void HwTimerInterrupt(void)
* 函数功能:硬件定时器回调函数
* 函数形参:无
* 返  回  值:无
* */
void HwTimerInterrupt(void)
{
	static int LedFlag = 1;
	LedFlag = !LedFlag;
	LED(LedFlag);
	os_printf("硬件定时器中断!!!\r\n");
}

/*
*
* */
void HwTimerInitConfig(void)
{
	//	hw_timer_init(0,1);	//使用FRC1中断源  FRC1_SOURCE[枚举为0],自动填装[0:不自动填装  1:自动填装]
	hw_timer_init(1, 1);	//使用NMI 中断源  FRC1_SOURCE[枚举为0],自动填装[0:不自动填装  1:自动填装]
	hw_timer_set_func(HwTimerInterrupt);//设置HwTimerInterrupt()为定时器回调函数
	hw_timer_arm(1000000);//使能硬件定时器  1秒钟延时[单位:us  最大值:1677721us]
}
/*
* HwTimer.h
*
*  Created on: 2018年9月10日
*      Author: 小良哥
*/

#ifndef APP_INCLUDE_DRIVER_HWTIMER_H_
#define APP_INCLUDE_DRIVER_HWTIMER_H_

#include "ets_sys.h"
#include "osapi.h"
void HwTimerInterrupt(void);
void HwTimerInitConfig(void);

#endif /* APP_INCLUDE_DRIVER_HWTIMER_H_ */
//user_main.c
/******************************************************************************
* FunctionName : user_init
* Description  : entry of user application, init user function here
* Parameters   : none
* Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR user_init(void)
{
	system_soft_wdt_feed();//喂软件看门狗,防止程序跑偏
	uart_init(115200, 115200);//设置串口波特率
	LedInitConfig();//LED灯初始化函数
	KeyInitConfig();//按键初始化函数
	KeyExtiInitConfig();//配置按键外部中断
//	TimerInitConfig(500,1);
	hw_timer_set_func();
	HwTimerInitConfig();
	os_printf("=============================================\r\n");
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n嵌入式陈工个人编辑资料\r\n未经本人同意请勿私自传播\r\n");
	os_printf("\r\n硬件定时器控制代码\r\n");
	os_printf("=============================================\r\n");
}

源代码参考:https://github.com/ChenJiliang00/ESP8266