硬件定时器
以下硬件中断定时器接⼝位于 /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. 使用注意事项
- 如果使⽤ NMI 中断源,且为⾃动填装的定时器,调⽤ hw_timer_arm 时参数 val 必须⼤于 100。
- 如果使⽤ NMI 中断源,那么该定时器将为最⾼优先级,可打断其他 ISR。
- 如果使⽤ FRC1 中断源,那么该定时器⽆法打断其他 ISR。
4. hw_timer.c 的接⼝不能跟 PWM 驱动接⼝函数同时使⽤,因为⼆者共⽤了同⼀个硬件定时器。 - 硬件中断定时器的回调函数定义,请勿添加 ICACHE_FLASH_ATTR 宏。
- 使⽤ 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到我们的工程
/*
* 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