我使用的是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 參考手冊