ESP8266軟件定時器使用小結

我使用的是ESP8266-12F物聯網開發板,編程軟件是AiThinker_IDE。

軟件定時器使用模板小結:

//!!!全局變量!!!
os_timer_t OS_Timer_1;       //①:定義軟件定時器(os_timer_t型結構體)

void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)      // ②:定義回調函數
{
	...
    //此處編寫要執行的操作代碼
}

void ICACHE_FLASH_ATTR OS_Timer_1_Init(u32 time_ms, u8 time_repetitive)
{
     os_timer_disarm(&OS_Timer_1);     // ③:關閉軟件定時器
     os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // ④:設置定時器、回調函數、回調函數的參數
     os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // ⑤:使能定時器、設置定時時間、設置是否重複定時

}


void ICACHE_FLASH_ATTR user_init(void)
{
    ...
    //其他的初始化操作
    
   OS_Timer_1_Init(500,1);        // 500ms(重複) //調用軟件定時器


}

軟件定時器例程:

user_main.c中:

// 頭文件引用
//==================================================================================
#include "user_config.h"		// 用戶配置
#include "driver/uart.h"  		// 串口

#include "c_types.h"			// 變量類型
#include "eagle_soc.h"			// GPIO函數、宏定義

#include "ets_sys.h"			// 回調函數

#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、軟件定時器

#include "user_interface.h" 	// 系統接口、system_param_xxx接口、WIFI、RateContro
//==================================================================================

// 宏定義
//==================================================================================
#define		ProjectName		"OS_Timer"		// 工程名宏定義
//==================================================================================

// 全局變量
//==================================================================================
u8 F_LED = 0;				// LED狀態標誌位

// os_timer_t OS_Timer_1;	// 軟件定時器
//==================================================================================

// 毫秒延時函數
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
		os_delay_us(1000);
}
//===========================================

// 注:OS_Timer_1必須定義爲全局變量,因爲ESP8266的內核還要使用
//--------------------------------------------------------------------
os_timer_t OS_Timer_1;	// ①:定義軟件定時器(os_timer_t型結構體)

// 軟件定時的回調函數
//======================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)		// ②:定義回調函數
{
	F_LED = !F_LED;
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED);		// LED狀態翻轉


	os_printf("\r\n----OS_Timer_1_cb----\r\n");	// 進入回調函數標誌
}
//======================================================================


// 軟件定時器初始化(ms毫秒)
//================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
	// 關閉定時器
	// 參數一:要關閉的定時器
	//--------------------------------------------------------
	os_timer_disarm(&OS_Timer_1);	// ③:關閉軟件定時器


	// 設置定時器
	// 參數一:要設置的定時器;參數二:回調函數(需類型轉換);參數三:回調函數的參數
	//【注:os_timer_setfn必須在軟件定時器未使能的情況下調用】
	//------------------------------------------------------------------------------------------
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// ④:設置回調函數


	// 使能(啓動)ms定時器
	// 參數一:要使能的定時器;參數二:定時時間(單位:ms);參數三:1=重複/0=只一次
	//------------------------------------------------------------------------------------------
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // ⑤:設置定時器參數並使能定時器
	//-------------------------------------------------------------------
	// 【如未調用system_timer_reinit,可支持範圍:[5ms ~ 6,870,947ms]】
	// 【如果調用system_timer_reinit,可支持範圍:[100ms ~ 428,496 ms]】
	//-------------------------------------------------------------------
}
//================================================================================================

// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4設爲IO口

	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// IO4 = 1
}
//=============================================================================

// user_init:entry of user application, init user function here
//=================================================================================================
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_JX();					// LED初始化

	// 初始化軟件定時器
	//--------------------------------------------
	OS_Timer_1_Init_JX(500,1);		// 500ms(重複)

	os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}
//=================================================================================================


/******************************************************************************
 * 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:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
        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){}

關於程序中使用到的一些API函數,如:os_timer_disarm,os_timer_setfn,os_timer_arm等,可以查閱學習以下文檔:
ESP8266 Non-OS SDK API 參考手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章