void WDT_NMI(void) { WDT_InitTypeDef WDT_InitStruct; WDT_InitStruct.DetectTime = WDT_DETECT_TIME_EXP_25; WDT_InitStruct.OverflowOutput = WDT_NMIINT; LED_Init(); Delay(5000U); LED_On(LED1 | LED2); WDT_Init(&WDT_InitStruct); WDT_Enable(); while (1) { if (fIntNMI == 1U) { fIntNMI = 0U; LED_On(LED3); Delay(500U); LED_Off(LED3); Delay(500U); WDT_Disable(); } else { /* Do nothing */ } #ifdef DEMO2 Delay(500U); WDT_WriteClearCode(); LED_On(LED2); Delay(500U); LED_Off(LED2); #endif } }
rt_err_t fh_watchdog_ctrl(rt_watchdog_t *wdt, int cmd, void *arg) { struct wdt_driver *wdt_drv = wdt->parent.user_data; struct fh_wdt_obj *wdt_obj = wdt_drv->priv; rt_uint32_t val; switch (cmd) { case RT_DEVICE_CTRL_WDT_START: WDT_Enable(wdt_obj, RT_TRUE); break; case RT_DEVICE_CTRL_WDT_STOP: WDT_Enable(wdt_obj, RT_FALSE); break; case RT_DEVICE_CTRL_WDT_KEEPALIVE: // fh_wdt_set_next_heartbeat(wdt_drv); fh_wdt_keepalive(wdt_drv); break; case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: heartbeat = *((int *)(arg)); PRINT_WDT_DBG("[wdt] settime value %lu\n", heartbeat); fh_wdt_set_top(wdt_drv, heartbeat); /// 3000); fh_wdt_keepalive(wdt_drv); fh_wdt_set_next_heartbeat(wdt_drv); break; case RT_DEVICE_CTRL_WDT_GET_TIMEOUT: arg = &heartbeat; break; case RT_DEVICE_CTRL_WDT_GET_TIMELEFT: val = fh_wdt_time_left(wdt_drv); arg = &val; break; default: return -RT_EIO; } return RT_EOK; }
void watchdogEnable (uint32_t timeout) { /* this assumes the slow clock is running at 32.768 kHz watchdog frequency is therefore 32768 / 128 = 256 Hz */ timeout = timeout * 256 / 1000; if (timeout == 0) timeout = 1; else if (timeout > 0xFFF) timeout = 0xFFF; timeout = WDT_MR_WDRSTEN | WDT_MR_WDV(timeout) | WDT_MR_WDD(timeout); WDT_Enable (WDT, timeout); }
void naiboard_sleep(void) { if (naiboard_state.usb_vendor_enabled) // If we're not connected we won't go to sleep. return; // We're only using the IDLE sleep level because USB doesn't work below that. // Not much power saving though... SLEEP.CTRL = SLEEP_SMODE_IDLE_gc; sysclk_disable_peripheral_clock(&RTC); //printf_P(PSTR("sleep\n")); WDT_Disable(); sleep_enable(); cpu_sleep(); // Waking up sleep_disable(); WDT_Enable(); sysclk_enable_peripheral_clock(&RTC); //printf_P(PSTR("wake\n")); }
void xs_wdt_start(xsMachine *the) { int index = xsToInteger(xsArg(0)); WDT_Config_Type cfg; cfg.timeoutVal = index; cfg.mode = WDT_MODE_RESET; cfg.resetPulseLen = WDT_RESET_PULSE_LEN_2; WDT_Init(&cfg); CLK_ModuleClkEnable(CLK_WDT); #if defined(CONFIG_CPU_MW300) /* For 88MW300, APB1 bus runs at 50MHz whereas for 88MC200 it runs at * 25MHz, hence following clk divider is added to keep timeout same. */ CLK_ModuleClkDivider(CLK_WDT, 1); #endif WDT_Enable(); wdt_enable = 1; }
/* WDT_NMI function */ void WDT_NMI(void) { WDT_InitTypeDef WDT_InitStruct; WDT_InitStruct.DetectTime = WDT_DETECT_TIME_EXP_25; WDT_InitStruct.OverflowOutput = WDT_NMIINT; SystemInit(); /* WDT and LED configuration */ TSB_PM->CR = (uint32_t) 0xF0; TSB_PM->PUP = (uint32_t) 0xF0; TSB_PM->DATA = (uint32_t)0xFF; WDT_Init(&WDT_InitStruct); WDT_Enable(); while (1) { #ifdef DEMO2 Delay(500U); WDT_WriteClearCode(); TSB_PM_DATA_PM6 = !TSB_PM_DATA_PM6; #endif } }
/// intialise watch dog with a 4 sec interrupt time void watchdog_init() { const uint32_t wdtTicks = 256; // number of watchdog ticks @ 32768Hz/128 before the watchdog times out (max 4095) WDT_Enable(WDT, (wdtTicks << WDT_MR_WDV_Pos) | (wdtTicks << WDT_MR_WDD_Pos) | WDT_MR_WDRSTEN); // enable watchdog, reset the mcu if it times out }
int main(void) { int nCounter = 0; //給Beep Loop用的Counter //初始化參數 u8gLCD_BOOT = 1; u32NeedWriteFlash = 0; u32ADC = POWER_LOWEST_ADC + 100; //檢查電源用的參數,電不夠時把馬達動作變小。 u8MotorSuspended = 0; //看看馬達是不是在暫停狀態 //正式程式碼,開始初始化動作。 SysCLK_config_clock_select(0); // 配置時鐘 EL_Init(); ADC_Init(); //讀取CPU ID u32IAP_ReadUID(uid); sn = uid[0] + uid[1] +uid[2] +uid[3]; //讀取記憶的速度 memset(BufferFlash, 0x0, IAP_FLASH_PAGE_SIZE_BYTES); u32IAP_ReadUserDataFlash(BufferFlash, IAP_FLASH_PAGE_SIZE_BYTES); memcpy(BackupBuffer, BufferFlash,IAP_FLASH_PAGE_SIZE_BYTES); BeeperInit(); HallInit(); KeyInit(); PWMInit(); // For motor control voltage. WDT_Enable(); //Enable the watch dog. InitialTimeTick(TIME_TICK_NUMBER); while(u8gLCD_BOOT != 0); //time tic 開始後就會叫callback, 此時LCD及Beeper,KeyBounce要初始完成。 u32ADC = ADC_Read(); if(u32ADC > POWER_LOWEST_ADC && u32ADC != 0) { LCD_Init(); // LCD update for(nCounter = 0 ; nCounter < 2; nCounter++) { BeepMillisecondsAndWait(500); WDTFeed(); } } else { //如果一開始就電量不足,在閃一下後,就離開,等下次初始化。 EL_OnOff(); delay_us(1000); EL_OnOff(); delay_us(1000); return 0; } StatusInit(); nCounter = 0; while(sn % 1000 != UID) { #ifndef PROGRAMING BeepMillisecondsAndWait(500); #endif WDTFeed(); } if( !(GPIO2->DATA & (1 << 1)) && !(GPIO0->DATA & (1 << 5))) { while(1) { WDTFeed();// Feed Dog. } } while(1) { WDTFeed();// Feed Dog. u32ADC = ADC_Read(); PWM_CheckSuspend(u32ADC); WDTFeed();// Feed Dog. ProcessHall(); Status_ProcessKey(GetKey()); WriteFlash(); } }