如?下是看門狗的基本介紹以及基本的操作。大致上還算比較簡單。
EFM32的WDT不同於其他MCU,WDT不能用作定時器,如果看門狗溢出,一定會引起系統複位。同時在程式中也可以查詢複位的標誌位來判斷是否為看門狗引起的複位。
另外就是,僅可以在WDT使能的狀態下,才可以對WDT的寄存器進行操作。
最後,一般習慣於先調試其他功能,等其他功能全部調試完畢之後,再加入WDT,以減少軟體調試的複雜度和難度。
看門狗初始化:
WDOG_Init_TypeDef init =
{
.enable = true, /* Start watchdog when init done */
.debugRun = false, /* WDOG not counting during debug halt */
.em2Run = true, /* WDOG counting when in EM2 */
.em3Run = true, /* WDOG counting when in EM3 */
.em4Block = false, /* EM4 can be entered */
.swoscBlock = false, /* Do not block disabling LFRCO/LFXO in CMU */
.lock = false, /* Do not lock WDOG configuration (if locked, reset needed to unlock) */
.clkSel = wdogClkSelULFRCO, /* Select 1kHZ WDOG oscillator */
.perSel = wdogPeriod_2k, /* Set the watchdog period to 2049 clock periods (ie ~2 seconds)*/
};
WDOG_Init(&init);
enable: 該參數決定了看門狗初始化完成之後,是否使能看門狗
debugRun:決定了在Debug的狀態下,看門狗計數器是否繼續計數,建議選擇false。
em2Run,em3Run: 決定了EFM32在EM2,EM3模式下看門狗是否繼續運行,視情況決定是否需要開啟
em4Block:是否阻止進入EM4模式
swoscBlock: 決定了程式是否能否停止看門狗的時鐘源。0代表允許,1則表示不允許。另外,寫1會自動使能看門狗的時鐘源。防止看門狗的時鐘源被程式意外修改。
Lock:決定了是否對看門狗的配置進行上鎖。
clkSel:選擇看門狗的時鐘源。可以選擇ULFRCO,LFRCO,LFXO。如果選擇LFRCO,或則LFXO,必須先使能這兩個時鐘源。
perSel: 看門狗溢出周期選擇。wdogPeriod_2k,表示WDT溢出需要2048個周期。通過時鐘源的頻率,即可折算出溢出時間。
另外,如果WDT選擇的時鐘源為LFXO或LFRCO的情況下,往swoscBlock寫1的話,則會阻止MCU進入EM3模式。如果時鐘源為ULFRO的話,則會阻止MCU進入EM4模式。
看門狗喂狗:
WDOG_Feed();
看門狗使能或則失能:
WDOG_Enable()
看門狗寄存器上鎖:
WDOG_Lock()
需要注意的是,
1. 在看門狗未使能之前,不能對看門狗進行操作。
2. 對看門狗寄存器的操作,需要有3個低速刻度的同步時間。因此象如下的操作,是不合適的.
...........
WDOG_Enable(false);
.......
WDOG_Enable(true);
WDOG_Feed();
需要在中間插入等待完成:
...........
WDOG_Enable(false);
.......
WDOG_Enable(true);
while (WDOG->SYNCBUSY & WDOG_SYNCBUSY_CTRL);
WDOG_Feed();