int32_t main (void) { /* Init System, IP clock and multi-function I/O In the end of SYS_Init() will issue SYS_LockReg() to lock protected register. If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register if necessary */ SYS_Init(); /* Init UART to 115200-8n1 for print message */ UART_Open(UART0, 115200); printf("\nThis sample code demonstrate using WDT in polling mode\n"); // WDT register is locked, so it is necessary to unlock protect register before configure WDT SYS_UnlockReg(); // WDT timeout every 2^14 WDT clock, disable system reset, disable wake up system WDT_Open(WDT_TIMEOUT_2POW14, 0, FALSE, FALSE); while(1) { // WDT timeout flag set if(WDT_GET_TIMEOUT_INT_FLAG()) { // Reset WDT and clear time out flag WDT_CLEAR_TIMEOUT_INT_FLAG(); printf("Reset WDT counter\n"); } } }
void GoToSleep() { gFlags.light_sleep = !( gFlags.has_x32 || dfStatus.lsloff || gFlags.noclock ); ScreenOff(); LEDOff(); gFlags.firing = 0; BatReadTimer = 50; RTCSleep(); DevicesOnOff( 1 ); CLK_SysTickDelay( 250 ); CLK_SysTickDelay( 250 ); CLK_SysTickDelay( 250 ); if ( dfStatus.off || PE0 || KeyPressTime == 1100 ) { SYS_UnlockReg(); WDT_Close(); FlushAndSleep(); PreheatDelay = 0; } WDT_Open( WDT_TIMEOUT_2POW14, WDT_RESET_DELAY_18CLK, TRUE, FALSE ); SYS_LockReg(); gFlags.refresh_battery = 1; DevicesOnOff( 0 ); RTCWakeUp(); InitDisplay(); }
/*---------------------------------------------------------------------------------------------------------*/ int main(void) { uint32_t u32IntCnts = 0; /* 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("CPU @ %d Hz\n", SystemCoreClock); printf("+------------------------------------------+\n"); printf("| WDT Time-out Interrupt Sample Code |\n"); printf("+------------------------------------------+\n\n"); printf("# WDT Settings:\n"); printf(" - Clock source is 10 kHz \n"); printf(" - Time-out interval is 2^14 * WDT clock \n"); printf(" (around 1.6384 second) \n"); printf(" - Interrupt enable \n"); printf("# System will generate a WDT time-out interrupt event after around 1.6384 second.\n"); printf(" (Use PA.0 high/low period time to check WDT time-out interval)\n\n"); /* Use PA.0 to check time-out period time */ GPIO_SetMode(PA, BIT0, GPIO_PMD_OUTPUT); PA0 = 1; PA0 = 0; /* 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(); /* Select WDT time-out interval to 2^14 * WDT clock then start WDT counting */ g_u8IsWDTTimeoutINT = 0; WDT_Open(WDT_TIMEOUT_2POW14, 0, FALSE, FALSE); /* Enable WDT interrupt function */ WDT_EnableInt(); /* Enable WDT NVIC */ NVIC_EnableIRQ(WDT_IRQn); while(1) { /* Check if WDT time-out interrupt occurred or not */ while(g_u8IsWDTTimeoutINT == 0); g_u8IsWDTTimeoutINT = 0; PA0 ^= 1; printf("WDT time-out interrupt occurred. INT counts: %d \r", ++u32IntCnts); } }
/*---------------------------------------------------------------------------------------------------------*/ 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(); if(WDT_GET_RESET_FLAG() == 1) { /* Use PA.0 to check time-out period time */ GPIO_SetMode(PA, BIT0, GPIO_PMD_OUTPUT); PA0 = 1; WDT_CLEAR_RESET_FLAG(); printf("\n\n*** WDT time-out reset occurred ***\n"); while(1); } printf("\n\nCPU @ %d Hz\n", SystemCoreClock); printf("+--------------------------------------+\n"); printf("| WDT Time-out Reset Sample Code |\n"); printf("+--------------------------------------+\n\n"); printf("# WDT Settings:\n"); printf(" Clock source is 10 kHz; Enable interrupt; Time-out interval is 2^14 * WDT clock.\n"); printf("# When WDT start counting, system will generate a WDT time-out interrupt after 1.6384 ~ 1.7408 s.\n"); printf(" Measure PA.0 low period to check time-out interval and do not reload WDT counter will cause system reset.\n\n"); /* Use PA.0 to check time-out period time */ GPIO_SetMode(PA, BIT0, GPIO_PMD_OUTPUT); PA0 = 1; PA0 = 0; /* 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(); /* Enable WDT time-out reset function and select time-out interval to 2^14 * WDT clock then start WDT counting */ g_u8IsWDTTimeoutINT = 0; WDT_Open(WDT_TIMEOUT_2POW14, WDT_RESET_DELAY_1026CLK, TRUE, FALSE); /* Enable WDT interrupt function */ WDT_EnableInt(); /* Enable WDT NVIC */ NVIC_EnableIRQ(WDT_IRQn); while(1); }
/*---------------------------------------------------------------------------------------------------------*/ 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); } }
//========================================================================= //----- (0000652C) -------------------------------------------------------- void InitDevices() { SYS_UnlockReg(); // Internal 22.1184MHz oscillator CLK_EnableXtalRC( CLK_PWRCTL_HIRCEN_Msk ); CLK_WaitClockReady( CLK_STATUS_HIRCSTB_Msk ); CLK_SetHCLK( CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK( 1 ) ); // 12.000MHz external crystal CLK_EnableXtalRC( CLK_PWRCTL_HXTEN_Msk ); CLK_WaitClockReady( CLK_STATUS_HXTSTB_Msk ); // FMC Frequency Optimisation mode <= 72MHz FMC_EnableFreqOptimizeMode( FMC_FTCTL_OPTIMIZE_72MHZ ); // Setup PLL to 144MHz and HCLK source to PLL/2 CLK_SetCoreClock( CPU_FREQ ); // UART0 CLK = HXT/1 #if (ENABLE_UART) CLK_EnableModuleClock( UART0_MODULE ); CLK_SetModuleClock( UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART( 1 ) ); #endif // USB CLK = PLL/3 (48MHz) CLK_EnableModuleClock( USBD_MODULE ); CLK_SetModuleClock( USBD_MODULE, 0, CLK_CLKDIV0_USB( 3 ) ); SYS->USBPHY = SYS_USBPHY_LDO33EN_Msk; // WDT CLK = LIRC/1 CLK_EnableModuleClock( WDT_MODULE ); CLK_SetModuleClock( WDT_MODULE, CLK_CLKSEL1_WDTSEL_LIRC, 0 ); // SPI0 CLK = PCLK0/1 CLK_EnableModuleClock( SPI0_MODULE ); // EADC CLK = PCLK1/8 (9MHz) CLK_EnableModuleClock( EADC_MODULE ); CLK_SetModuleClock( EADC_MODULE, 0, CLK_CLKDIV0_EADC( 8 ) ); // CRC CLK = HCLK/1 CLK_EnableModuleClock( CRC_MODULE ); // TIMERS CLOCKS CLK_EnableModuleClock( TMR0_MODULE ); CLK_EnableModuleClock( TMR1_MODULE ); CLK_EnableModuleClock( TMR2_MODULE ); CLK_EnableModuleClock( TMR3_MODULE ); CLK_SetModuleClock( TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0 ); CLK_SetModuleClock( TMR1_MODULE, CLK_CLKSEL1_TMR1SEL_PCLK0, 0 ); CLK_SetModuleClock( TMR2_MODULE, CLK_CLKSEL1_TMR2SEL_HIRC, 0 ); CLK_SetModuleClock( TMR3_MODULE, CLK_CLKSEL1_TMR3SEL_HXT, 0 ); // Enable battery voltage sampling by ADC SYS->IVSCTL |= SYS_IVSCTL_VBATUGEN_Msk; // ADC reference voltage SYS->VREFCTL = SYS_VREFCTL_VREF_2_56V; // Brown-out detector; interrupts under 2.2V SYS_EnableBOD( SYS_BODCTL_BOD_RST_EN, SYS_BODCTL_BODVL_2_2V ); // Update clock data SystemCoreClockUpdate(); WDT_Open( WDT_TIMEOUT_2POW18, WDT_RESET_DELAY_18CLK, TRUE, FALSE ); SYS_LockReg(); }