ESP8266学习——HW Timer

Posted 王铁柱子哟-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP8266学习——HW Timer相关的知识,希望对你有一定的参考价值。

内容

效果

步骤

  1. 添加hw_timer.c文件
  2. 使用函数hw_timer_init(0,1);初始化硬件定时器
  3. 定义中断回调函数
  4. 注册回调函数
  5. 设置定时器参数

添加hw_timer.c文件

hw_timer_init函数

作用:初始化硬件定时器
【参数1:中断源】

  • FRC1_SOURCE==0
  • NMI_SOURCE=1

【参数2:是否重复】

  • 重复:1
  • 不重复:0

中断源选择

代码

头文件

#include "ets_sys.h"

#include "osapi.h"
#include "user_interface.h"

#include "driver/uart.h"

宏定义

#define		ProjectName		"HW_Timer"		// 工程名宏定义

全局变量

u8 F_LED = 0;	// LED状态标志位

延时函数delay_ms

void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{	
	for(;C_time>0;C_time--)
		os_delay_us(1000);

}

LED初始化函数LED_init

void ICACHE_FLASH_ATTR LED_init(void)
{
	//选择GPIO4的功能
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
	//设置GPIO4的电平
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);

}

硬件定时器回调函数HW_Timer_cb

void HW_Timer_cb(void)
{
	F_LED = !F_LED;
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED);			//LED状态翻转

	os_printf("\\r\\n-----HW_Timer_INT-----\\r\\n");	//进入定时器函数标志

}

硬件定时器初始化函数HW_Timer_init

void HW_Timer_init(void)
{
    // 硬件定时器初始化【FRC1_SOURCE==0、NMI_SOURCE=1】
	hw_timer_init(0,1);					//初始化硬件定时器【参数1:中断源】【参数2:是否重复】
	hw_timer_set_func(HW_Timer_cb);	//注册回调函数
	hw_timer_arm(500000);				//设置定时器参数(单位us,参数必须<=1,677,721)

}

user_init

void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\\r\\n=================================================\\r\\n");
	os_printf("\\t Project:\\t%s\\r\\n", ProjectName);
	os_printf("\\t SDK version:\\t%s", system_get_sdk_version());
	os_printf("\\r\\n=================================================\\r\\n");

	LED_init();		// LED初始化

	HW_Timer_init();
}

其他

/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
            rf_cal_sec = 1024 - 5;
            break;
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}



void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}

总结框架

需要更改的参数

  • 中断源、是否重复
  • 定时时长

要点

  • 回调函数名和注册回调函数中的回调函数名一致
void HW_Timer_cb(void)
{
	.......			//到达指定时间,完成的功能
}

void HW_Timer_init(void)
{
    // 硬件定时器初始化【FRC1_SOURCE==0、NMI_SOURCE=1】
	hw_timer_init(0,1);					//初始化硬件定时器【参数1:中断源】【参数2:是否重复】
	hw_timer_set_func(HW_Timer_cb);		//注册回调函数
	hw_timer_arm(500000);				//设置定时器参数(单位us,参数必须<=1,677,721)

}

以上是关于ESP8266学习——HW Timer的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266中断和定时器使用

玩转 ESP32 + Arduino (六) 硬件定时器, IIC, SPI

ESP8266的使用学习

stm32f373利用esp8266连接onenet平台

ESP8266学习笔记6:ESP8266规范wifi连接操作

ESP8266学习笔记4:ESP8266的SmartConfig