Watchdog on BGM111 (and other Blue Gecko modules / boards)

by <a href="http://community.silabs.com/t5/Welcome-and-Announcements/Community-Ranking-System-and-Recognition-Program/m-p/140490#U140490"><font color="#000000"><font size="2">Hero Employee</font></font> </a> arkalvac on ‎02-23-2017 07:26 AM

 

If you want to use watchdog timer on any Blue Gecko boards / modules, do the followings:

 

1) Create a new C project in Simplicity Studio

 

2) copy em_wdog.c into the project from:

C:\SiliconLabs\SimplicityStudio\v4\developer\stacks\ble\v2.x.x.x\platform\emlib\src

 

3) #include "em_wdog.h"

 

4) Configure the watchdog timer:

 

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);.

 

5) Feed the watchdog before the counter overflows, e.g. using a soft timer:

 

while (1) {
struct gecko_cmd_packet* evt;
evt = gecko_wait_event();

switch (BGLIB_MSG_ID(evt->header)) {

case gecko_evt_system_boot_id:
/* Start soft timer to feed the watchdog every second.
* If the stack freezes, the soft timer will stop, and the watchdog will not be fed. */
gecko_cmd_hardware_set_soft_timer(32768,0,0);
break;

case gecko_evt_hardware_soft_timer_id:
/* Feed the watchdog every second while the stack is running */
WDOG_Feed();
break;

default: break;
}
}

 

6) Check at the beginning of main() if the reset was caused by watchdog

 

uint32_t resetCause = RMU_ResetCauseGet();
RMU_ResetCauseClear();

/* Check if the watchdog triggered the last reset */
if (resetCause & RMU_RSTCAUSE_WDOGRST)
{
/* watchdog reset occured */

You have to add em_rmu.c to the project and include "em_rmu.h" to implement this last step

 

Attached you can find an example project using wathchdog on BGM111 using Bluetooth SDK v2.1.1.