OSStatus mico_wdg_initialize( uint32_t timeout_ms ) { #ifndef MICO_DISABLE_WATCHDOG OSStatus err = kNoErr; uint32_t wdt_mode, timeout_value; /* Get timeout value. */ timeout_value = wdt_get_timeout_value(timeout_ms* 1000, BOARD_FREQ_SLCK_XTAL); require_action( timeout_value != WDT_INVALID_ARGUMENT, exit, err = kParamErr ); /* Configure WDT to trigger an interrupt (or reset). */ wdt_mode = WDT_MR_WDFIEN | /* Enable WDT fault interrupt. */ WDT_MR_WDRPROC | /* WDT fault resets processor only. */ WDT_MR_WDDBGHLT | /* WDT stops in debug state. */ WDT_MR_WDIDLEHLT; /* WDT stops in idle state. */ /* Initialize WDT with the given parameters. */ wdt_init(WDT, wdt_mode, timeout_value, timeout_value); printf("Enable watchdog with %d microseconds period\n\r", (int)wdt_get_us_timeout_period(WDT, BOARD_FREQ_SLCK_XTAL)); /* Configure and enable WDT interrupt. */ NVIC_DisableIRQ(WDT_IRQn); NVIC_ClearPendingIRQ(WDT_IRQn); NVIC_SetPriority(WDT_IRQn, 5); NVIC_EnableIRQ(WDT_IRQn); exit: return err; #else UNUSED_PARAMETER( timeout_ms ); return kUnsupportedErr; #endif }
/** * \brief Application entry point for wdt_irq example. * * \return Unused (ANSI-C compatibility). */ int main(void) { uint32_t wdt_mode, timeout_value; /* Initialize the system */ sysclk_init(); board_init(); /* Configure pins of console UART, LED and push button on board. */ configure_console(); configure_led(); /* Output example information. */ puts(STRING_HEADER); /* Initialize reset counter */ ul_rst_counter = RST_MS_COUNTER; /* Systick configuration. */ puts("Configure systick to get 1ms tick period.\r"); if (SysTick_Config(sysclk_get_cpu_hz() / 1000)) { puts("-F- Systick configuration error\r"); } /* Get timeout value. */ timeout_value = wdt_get_timeout_value(WDT_PERIOD * 1000, BOARD_FREQ_SLCK_XTAL); if (timeout_value == WDT_INVALID_ARGUMENT) { while (1) { /* Invalid timeout value, error. */ } } /* Configure WDT to trigger an interrupt (or reset). */ wdt_mode = WDT_MR_WDFIEN | /* Enable WDT fault interrupt. */ WDT_MR_WDRPROC | /* WDT fault resets processor only. */ WDT_MR_WDDBGHLT | /* WDT stops in debug state. */ WDT_MR_WDIDLEHLT; /* WDT stops in idle state. */ /* Initialize WDT with the given parameters. */ wdt_init(WDT, wdt_mode, timeout_value, timeout_value); printf("Enable watchdog with %d microseconds period\n\r", (int)wdt_get_us_timeout_period(WDT, BOARD_FREQ_SLCK_XTAL)); /* Configure and enable WDT interrupt. */ NVIC_DisableIRQ(WDT_IRQn); NVIC_ClearPendingIRQ(WDT_IRQn); NVIC_SetPriority(WDT_IRQn, 0); NVIC_EnableIRQ(WDT_IRQn); printf("After %u seconds the system enters in a deadlock loop.\n\r", (int)ul_rst_counter/1000); while (1) { if (g_b_systick_event == true) { g_b_systick_event = false; /* Toggle LED at the given period. */ if ((g_ul_ms_ticks % BLINK_PERIOD) == 0) { #if (SAM4CM) LED_Toggle(LED4); #else LED_Toggle(LED0); #endif } /* Restart watchdog at the given period. */ if ((g_ul_ms_ticks % WDT_RESTART_PERIOD) == 0) { wdt_restart(WDT); } } /* Simulate deadlock when reset counter is reset. */ if (!ul_rst_counter) { puts("Program enters infinite loop for triggering watchdog interrupt.\r"); while (1) { } } } }