Exemplo n.º 1
0
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
    }
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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"));
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
/* 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
    }
}
Exemplo n.º 7
0
/// 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
}
Exemplo n.º 8
0
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();
	}
}