第三講,用定時器實現定時0.5秒閃爍點亮一盞LED
作者:電子快遞哥
日期:於2020年3月18日
有態度,有溫度,歡迎關注電子快遞哥,轉載請註明出處,
關注電子快遞哥,一起學習後續教程,關注+轉發,私信免費索取源碼
3.1,軟件定時器實現LED燈閃爍
3.1.1,軟件定時函數介紹:
① 定時器結構體
static os_timer_t os_timer;
②關閉該定時器
os_timer_disarm( &os_timer );
③配置該定時器回調函數
os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );
④開始執行我們的定時器,也就是使能操作。下面這個函數的說明:第二個參數是定時時間,單位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 );
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);
}