void _sys_exit(int return_code) { /* Check if link with ICE */ if(SH_DoCommand(0x18, 0x20026, NULL) == 0) { /* Make sure all message is print out */ while(IsDebugFifoEmpty() == 0); } label: goto label; /* endless loop */ }
/*---------------------------------------------------------------------------------------------------------*/ void PowerDownFunction(void) { SYS_UnlockReg(); /* To check if all the debug messages are finished */ while (IsDebugFifoEmpty() == 0); SCB->SCR = 4; SYSCLK->PWRCON = (SYSCLK->PWRCON & ~(SYSCLK_PWRCON_PWR_DOWN_EN_Msk | SYSCLK_PWRCON_PD_WAIT_CPU_Msk)) | SYSCLK_PWRCON_PD_WAIT_CPU_Msk | SYSCLK_PWRCON_PD_WU_INT_EN_Msk; SYSCLK->PWRCON |= SYSCLK_PWRCON_PWR_DOWN_EN_Msk; __WFI(); }
/*---------------------------------------------------------------------------------------------------------*/ void PowerDownFunction(void) { printf("\nSystem enter to power-down mode ...\n"); /* To check if all the debug messages are finished */ while(IsDebugFifoEmpty() == 0); SCB->SCR = 4; /* To program PWRCON register, it needs to disable register protection first. */ CLK->PWRCON = (CLK->PWRCON & ~(CLK_PWRCON_PWR_DOWN_EN_Msk | CLK_PWRCON_PD_WAIT_CPU_Msk)) | CLK_PWRCON_PD_WAIT_CPU_Msk | CLK_PWRCON_PD_WU_INT_EN_Msk; CLK->PWRCON |= CLK_PWRCON_PWR_DOWN_EN_Msk; __WFI(); }
/*---------------------------------------------------------------------------------------------------------*/ int main(void) { /* Unlock protected registers */ SYS_UnlockReg(); /* Init System, peripheral clock and multi-function I/O */ SYS_Init(); /* Lock protected registers */ SYS_LockReg(); /* Init UART0 for printf */ UART0_Init(); printf("\n\nCPU @ %d Hz\n", SystemCoreClock); printf("+----------------------------------------+\n"); printf("| WDT Time-out Wake-up Sample Code |\n"); printf("+----------------------------------------+\n\n"); /* To check if system has been reset by WDT time-out reset or not */ if(WDT_GET_RESET_FLAG() == 1) { WDT_CLEAR_RESET_FLAG(); printf("*** System has been reset by WDT time-out event ***\n\n"); while(1); } printf("# WDT Settings:\n"); printf(" - Clock source is LIRC \n"); printf(" - Time-out interval is 2^14 * WDT clock \n"); printf(" (around 1.6384 ~ 1.7408 s) \n"); printf(" - Interrupt enable \n"); printf(" - Wake-up function enable \n"); printf(" - Reset function enable \n"); printf(" - Reset delay period is 18 * WDT clock \n"); printf("# System will generate a WDT time-out interrupt event after 1.6384 ~ 1.7408 s, \n"); printf(" and will be wake up from power-down mode also.\n"); printf(" (Use PA.0 high/low period time to check WDT time-out interval)\n"); printf("# When WDT interrupt counts large than 10, \n"); printf(" we will not reset WDT counter value and system will be reset immediately by WDT time-out reset signal.\n"); /* Use PA.0 to check time-out period time */ PA->MODE = 0xFFFFFFFD; PA0 = 1; /* Enable WDT NVIC */ NVIC_EnableIRQ(WDT_IRQn); /* Because of all bits can be written in WDT Control Register are write-protected; To program it needs to disable register protection first. */ SYS_UnlockReg(); /* Configure WDT settings and start WDT counting */ g_u32WDTINTCounts = g_u8IsWDTWakeupINT = 0; WDT_Open(WDT_TIMEOUT_2POW14, WDT_RESET_DELAY_18CLK, TRUE, TRUE); /* Enable WDT interrupt function */ WDT_EnableInt(); while(1) { /* System enter to Power-down */ /* To program PWRCTL register, it needs to disable register protection first. */ SYS_UnlockReg(); printf("\nSystem enter to power-down mode ...\n"); /* To check if all the debug messages are finished */ while(IsDebugFifoEmpty() == 0); CLK_PowerDown(); /* Check if WDT time-out interrupt and wake-up occurred or not */ while(g_u8IsWDTWakeupINT == 0); g_u8IsWDTWakeupINT = 0; PA0 ^= 1; printf("System has been waken up done. WDT interrupt counts: %d.\n\n", g_u32WDTINTCounts); } }