void wkt_start(void){ // + turn-off peripherals LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<6); LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<7); LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<11); LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<14); LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<18); LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<19); NVIC_ClearPendingIRQ(WKT_IRQn); NVIC_DisableIRQ(WKT_IRQn); /* Enable clock for WKT */ LPC_SYSCON->SYSAHBCLKCTRL |= (1 << SYSCTL_CLOCK_WKT); /* Reset WKT */ LPC_SYSCON->PRESETCTRL &= ~(1 << RESET_WKT); LPC_SYSCON->PRESETCTRL |= (1 << RESET_WKT); LPC_PMU->DPDCTRL |= (1<<LPOSCEN); LPC_PMU->DPDCTRL |= (1<<LPOSCDPDEN); /* Enable Interrupt for WKT in NVIC */ NVIC_EnableIRQ(WKT_IRQn); /* Config WKT */ LPC_WKT->CTRL = (1 << 2); LPC_WKT->COUNT = ( SLEEP_TIME * (10000 - 920) ) / 1; LPC_WKT->CTRL = 1; /* Set wakeup config to same as run config */ LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG; /* WKT can wake up */ LPC_SYSCON->STARTERP1 = SYSCTL_WAKEUP_WKTINT; SCB->SCR |= (1<<2); LPC_PMU->DPDCTRL &= ~(1<<WAKEPAD_DISABLE); /* Go to deep power down mode */ LPC_PMU->PCON = PMU_MCU_DEEP_PWRDOWN; __WFI(); } |