NodeMCU NO_OS SDK 开发——硬件中断定时器
硬件中断定时器说明
硬件中断定时器接口位于 /ESP8266_NONOS_SDK/examples/driver_lib/hw_timer.c
注意:
- 如果使用 NMI 中断源,且为自动填装的定时器,调用 hw_timer_arm 时参数 val 必须大于 100。
- 如果使用 NMI 中断源,那么该定时器将为最高优先级,可打断其他ISR。
- 如果使用 FRC1 中断源,那么该定时器无法打断其他 ISR。
- hw_timer.c 的接口不能跟 PWM 驱动接口函数同时使用,因为二者共用了同一个硬件定时器。
- 硬件中断定时器的回调函数定义,请勿添加 ICACHE_FLASH_ATTR 宏。
- 使用 hw_timer.c 的接口,请勿调用 wifi_set_sleep_type(LIGHT_SLEEP); 将自动睡眠模式设置为 Light-sleep。因为 Light-sleep 在睡眠期间会停 CPU,停 CPU 期间不能响应 NMI 中断。
硬件中断定时器初始化
void hw_timer_init (
FRC1_TIMER_SOURCE_TYPE source_type,
u8 req)
- FRC1_TIMER_SOURCE_TYPE source_type:定时器的 ISR 源
- FRC1_SOURCE:使用 FRC1 中断源
- NMI_SOURCE:使用 NMI 中断源
- u8 req
- 0:不自动填装;
- 1:自动填装
硬件中断定时器使能
void hw_timer_arm (uint32 val)
- uint32 val:定时时间
自动填装模式:
- 使用 FRC1 中断源 FRC1_SOURCE,取值范围: 50 ~ 0x199999μs(1677721);
- 使用 NMI 中断源 NMI_SOURCE,取值范围 : 100 ~ 0x199999μs(1677721):
非自动填装模式,取值范围: 10 ~ 0x199999μs
设置硬件中断定时器回调函数
注意
回调函数前不能添加 ICACHE_FLASH_ATTR 宏定义,中断响应不能存放在 Flash 中。
void hw_timer_set_func (void (* user_hw_timer_cb_set)(void) )
- void (* user_hw_timer_cb_set)(void):定时器回调函数,函数定义时请勿添加ICACHE_FLASH_ATTR 宏。
硬件定时器示例
- 在C:\Users\用户.platformio\packages\framework-esp8266-nonos-sdk\driver_lib\driver文件夹路径下,复制hw_timer.c 文件到工程lib文件夹下,在user_main.c中添加如下代码:
uint8_t flag = 0;
void hw_tmr_callback(void)
{
if (flag == 0)
{
flag = 1;
gpio_set_l(GPIO_ID_PIN(2));
}
else
{
flag = 0;
gpio_set_h(GPIO_ID_PIN(2));
}
}
void ICACHE_FLASH_ATTR hw_tmr_user_init(void)
{
//hw_timer_init(FRC1_SOURCE, 1); 编译不通过,使用下一条
hw_timer_init(0, 1); //设置为FRC1_SOURCE中断源,重复定时
hw_timer_set_func(hw_tmr_callback); //设置中断回调函数
hw_timer_arm(1000000); //启动硬件定时器1000000us = 1s
}
可以看到开发板上的灯间隔1s闪烁