ESP8266之SDK開發教程-第三講

第三講,用定時器實現定時0.5秒閃爍點亮一盞LED

作者:電子快遞哥

日期:於2020年3月18日

有態度,有溫度,歡迎關注電子快遞哥,轉載請註明出處,

關注電子快遞哥,一起學習後續教程,關注+轉發,私信免費索取源碼

3.1,軟件定時器實現LED燈閃爍

3.1.1,軟件定時函數介紹:

① 定時器結構體

static os_timer_t os_timer;

②關閉該定時器

os_timer_disarm( &os_timer );

ESP8266之SDK開發教程-第三講

③配置該定時器回調函數

os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );

ESP8266之SDK開發教程-第三講

④開始執行我們的定時器,也就是使能操作。下面這個函數的說明:第二個參數是定時時間,單位us,注意: os_timer_arm()的時間參數的單位是ms,1s =1000ms ,第三個參數是boolean值,false是不重複,true是重複執行。但是os_timer_arm_us()時間參數的單位是us,1s =1000ms =1000 000 us;

// 啟動該定時器

os_timer_arm( &os_timer, 500, true );

ESP8266之SDK開發教程-第三講

ESP8266之SDK開發教程-第三講

3.1.2程序代碼:

//*003例程 按鍵(GPIO13)控制 LED(GPIO12)

/** 定時器結構體 */

static os_timer_t os_timer;

/** LED操作命令 */

void Led_Cmd(bool status ){

if (status == true ) {

GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);

} else {

GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);

}

}

void Led_Task_Run(void){

static bool status = false;

if ( status == true ) {

status = false;

} else {

status = true;

}

Led_Cmd( status );

}

void user_init(void)//初始化

{

// 設置串口0和串口1的波特率

uart_init(115200, 115200);

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

Led_Cmd(false);

/** 關閉該定時器 */

os_timer_disarm( &os_timer );

/** 配置該定時器回調函數 */

os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );

/** 啟動該定時器 */

os_timer_arm( &os_timer, 500, true );

}

3.2,硬件定時器實現LED燈閃爍

3.2.1,硬件定時器不像軟件定時器,它的驅動接口是一個c文件,所以我們必須要拿過來。hw_timer.c 複製到編譯目錄即可。

3.2.2,程序代碼:

void ICACHE_FLASH_ATTR user_init(void)

{

uart_init(115200, 115200);

os_printf("SDK version:%s\n", system_get_sdk_version());

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

Led_Cmd(false);

//第一個參數0使用的是FRC1_SOURCE,如果是1則為NMI_SOURCE類型,第二個參數是否自動填充,也就是是否重複。

hw_timer_init(0, 1);

//設置定時器的回調函數

hw_timer_set_func(hw_test_timer_cb);

//設置定時時間

hw_timer_arm(500);

}

void Led_Cmd(bool status) {

if (status == true) {

GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);

} else {

GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);

}

}

void hw_test_timer_cb(void) {

static bool status = false;

if (status == true) {

status = false;

os_printf("Led_Cmd false");

} else {

status = true;

os_printf("Led_Cmd true");

}

Led_Cmd(status);

}


分享到:


相關文章: