您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
N76E003提供一個看門狗定時器(WDT),它可以配置成一個超時復位定時器用于復位整個設備。一旦由于外界干擾設備進入非正常狀態(tài)或掛起,看門狗可以復位恢復系統(tǒng)。這有用于監(jiān)測系統(tǒng)運行以提高系統(tǒng)可靠性。對于容易受到噪聲,電源干擾或靜電放電干擾的系統(tǒng),是十分有用的?撮T狗也可以配置成通用定時器,可以工作在空閑模式或掉電模式,用于周期中斷服務作為事件定時器或連續(xù)系統(tǒng)監(jiān)測。WDTEN[3:0] (CONFIG4[7:4])初始化WDT工作在超時復位定時器或通用定時器模式。
WDT帶一個獨立的分頻器用于分頻10K LIRC時鐘。分頻器的時鐘分頻可選,來決定超時間間隔。當達到超時間隔,系統(tǒng)會被從空閑或掉電模式喚醒,且如果WDT中斷使能會產(chǎn)生一個中斷事件。如果WDT初始化為一個超時復位定時器,在經(jīng)過一個延時周期而軟件沒有任何動作后會產(chǎn)生系統(tǒng)復位。
超時復位定時器
當配置 CONFIG 位 WDTEN[3:0] (CONFIG4[7:4]) 不是 FH時,WDT將初始化為一個超時復位定時器。如果WDTEN[3:0] 不是 5H, WDT在系統(tǒng)進入空閑或掉電模式后允許繼續(xù)運行。注意當WDT初始化為超時復位定時器時,WDTR 和 WIDPD 沒有作用。
在設備上電后,開始執(zhí)行軟件代碼,同時WDT開始計數(shù)。超時間隔時間通過WDPS[2:0] (WDCON[2:0])配置。當
配置的超時事件發(fā)生,WDT會置位中斷標志W(wǎng)DTF (WDCON.5)。如果WDT中斷使能位EWDT (EIE.4)和全局中
斷使能EA都置位,WDT中斷程序被執(zhí)行。同時如果系統(tǒng)在正常運行中,在512個LIRC時鐘延時期間,系統(tǒng)可通
過置位WDCLR來清零計數(shù)器來避免系統(tǒng)被WDT復位。如果在這512個LIRC時鐘內沒有寫1到WDCLR,WDT復
位將會發(fā)生。置位WDCLR位用來清零WDT計數(shù)器。如系統(tǒng)正常運行,該位是自我清零。一旦WDT復位發(fā)生,
WDT復位標志W(wǎng)DTRF (WDCON.3)將會被置位,除上電復位之外的其他任何復位后,該位都保持不變。用戶可
以通過軟件清零WDTRF。注意WDCON的所有位有寫入時序要求。
注意:WDT計數(shù)器需特別注意。硬件會自動清除WDT計數(shù)器和預分頻數(shù)值在下面事件發(fā)生后:
(1)進入空閑或掉電模式,或被喚醒從空閑或掉電模式
(2)重啟。它能阻止不可預測的系統(tǒng)重啟。
看門狗定時器復位的主要應用是系統(tǒng)監(jiān)測,這對于實時控制系統(tǒng)來說這很重要。在一些電源干擾,電磁干擾,
CPU可能執(zhí)行錯誤代碼,或進入不可控制的狀態(tài)。如果發(fā)生這些情況不加以控制,系統(tǒng)有可能崩潰。使用看門狗
定時器用戶可選擇理想的“喂狗”時間來清除WDT計數(shù)器。通過指令置位 WDCLR, 可使程序繼續(xù)運行而不看門
狗定時器復位。如果干擾引起代碼運行在錯誤的狀態(tài)下,導致無法及時清除看門狗定時器,將引起芯片復位,使
系統(tǒng)從錯誤的狀態(tài)恢復過來。
注意:如下條件會造成WDT復位失效,請避免。當CKDIV有設定值(不等于00H),說明系統(tǒng)頻率除頻生效,
此時如果進入掉電模式,WDT復位會失效。建議對于掉電模式喚醒的應用,采用WKT喚醒。
通用定時器
看門狗定時器的另一個應用是用作簡單的,長周期定時器。當CONFIG 位 WDTEN[3:0] (CONFIG4[7:4]) 是
FH,WDT初始化為通用定時器。在這種模式下,WDTR 和 WIDPD 是可以通過軟件進行訪問操作。
看門狗定時器通過設置WDTR為1開始運行,通過清零WDTR停止。當WDT配置的時間間隔到后,WDTF標志會
置位。可通過軟件查詢WDTF標志來偵測是否超時。如果EWDT (EIE.4)和EA置位,WDT會產(chǎn)生中斷,接著WDT
會繼續(xù)計數(shù)。用戶必須清零WDTF并等待下一次溢出,通過查詢WDTF標志或等待中斷發(fā)生。
在一些低功耗的應用中,為節(jié)省功耗,CPU在沒有處理事件時常處于空閑模式。通過運行定時器0~3,周期性的
的喚醒察看是否有需求響應,然后這種空閑模式下耗電量將達到毫安(mA)級,為了減少耗電量達到微安(μA)級的
要求,當沒有需求需要相應的時候,CPU應該停留在掉電模式,并且可以通過編程的時候間隔來喚醒。
N76E003配備了很有用的WDT喚醒功能,由于基于內部10kHz的RC時鐘源,看門狗定時器功耗非常低,它能夠
在掉電模式下計數(shù)并喚醒CPU。
/*---------------------------------------------------------------------------------------------------------*/ /* */ /* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved. */ /* */ /*---------------------------------------------------------------------------------------------------------*/ //*********************************************************************************************************** // Nuvoton Technoledge Corp. // Website: http://www.nuvoton.com // E-Mail : MicroC-8bit@nuvoton.com // Date : Apr/21/2016 //***********************************************************************************************************
#define set_WIDPD BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;WDCON|=SET_BIT4;EA=BIT_TMP;
//*********************************************************************************************************** // File Function: N76E003 Watch Dog as pure timer with interrupt demo code //*********************************************************************************************************** #include "N76E003.h" #include "Common.h" #include "Delay.h" #include "SFR_Macro.h" #include "Function_define.h" /************************************************************************************************************ * WDT interrupt sub-routine ************************************************************************************************************/ void WDT_ISR (void) interrupt 10 { //---------toggle GPIO1--------- clr_GPIO1; Timer0_Delay1ms(50); set_GPIO1; Timer0_Delay1ms(50); clr_GPIO1; Timer0_Delay1ms(50); set_GPIO1; Timer0_Delay1ms(50); //---------end toggle GPIO2-------- clr_WDTF; set_WDCLR; } /************************************************************************************************************ * Main function ************************************************************************************************************/ void main (void) { /* Note WDT timer base is LIRC 10Khz */ Set_All_GPIO_Quasi_Mode; clr_GPIO1; Timer0_Delay1ms(500); set_GPIO1; Timer0_Delay1ms(500); clr_GPIO1; Timer0_Delay1ms(500); set_GPIO1; Timer0_Delay1ms(500); //WDT init //-------------------------------------------------------- //Warning: //Pleaes always check CONFIG WDT disable first //only when WDT reset disable, WDT use as pure timer //-------------------------------------------------------- TA=0xAA;TA=0x55;WDCON=0x07; //Setting WDT prescale set_WDTR; //WDT run set_WDCLR; //Clear WDT timer set_EWDT; EA =1; #if 0 while(1); #else set_WIDPD; //WDT run in POWER DOWM mode setting if needed while (1) { set_PD; //---------toggle GPIO1--------- clr_P04; Timer1_Delay10ms(5); set_P04; Timer1_Delay10ms(5); clr_P04; Timer1_Delay10ms(5); set_P04; Timer1_Delay10ms(5); //---------end toggle GPIO1--------- } #endif }
#if ...
#else
...
#endif//與#if對應
作為一個編譯“開關”,比如:
#if(條件滿足)
執(zhí)行代碼1
#else
執(zhí)行代碼2
#endif
假如編譯時,確實滿足條件,則生成的程序文件(.exe文件)中不會有執(zhí)行代碼2的。如果用普通if語句,生成的程序文件就會有執(zhí)行代碼2,這個區(qū)別看看生成文件大小就可以知道。
如果你的條件在程序編譯前就已經(jīng)確定了,那就用#if;如果條件需要在程序運行過程中才能判斷,則用if。
上一篇:Ubuntu輸入法切換問題