如?下是看门狗的基本介绍以及基本的操作。大致上还算比较简单。
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();