I am trying to prove that I can put the K64 module on the FRDM board to LLS sleep mode, but when I execute the __asm("WFI") command, it skips over any sleep attempts and moves on to the next line of code.
A brief into to my code, and the order of operation: Green LED is turned on and the wake handler is supposed to turn it off. This never happens. In fact with debugger I have seen that the asm("WFI") code is practically skipped over. An external pin is supposed to be used to trigger wake on rising edge. Any help is appreciated.
[code begin]
#define GLED_ON (GPIOE_PDOR &= ~(1<< 26))
#define GLED_OFF (GPIOE_PDOR |= (1<<26) )
static void
disableRTC()
{
//This function is used when RTC is known to keep pending interrupt at startup...(erratta note)
SIM->SCGC6 |=SIM_SCGC6_RTC_MASK; // enable clock to RTC
RTC->TSR = 0x00; // dummy write to RTC TSR per errata 8068
SIM->SCGC6 &= ~SIM_SCGC6_RTC_MASK; // disable clock to RTC
}
wakeIRQHandler()
{
//Is only used to turn off the GREEN led on board
{
sleep_init()
{
PORTC_PCR11 = 0x00090102; // PTC11 Wakeup rising edge, Pull-down, rising edge reset, enable IRQ
LLWU_PE3 = 0x40; // LLWU_P11 rising edge detection
OSA_InstallIntHandler(LLWU_IRQn, wakeIRQHandler);
}
init()
{
SIM_HAL_EnableClock(SIM,kSimClockGatePortC); //For wake pin
SIM_HAL_EnableClock(SIM,kSimClockGatePortE); //For green led pin
PORTE_PCR26 = 0x00000103;
GPIOE_PDDR = (1 << 26); // Make led-green an output
GLED_ON; // Make sure green LED is on
sleep_init();
}
goto_sleep()
{
| volatile unsigned int sync_read; |
LLWU_F1 = 0xFF;
LLWU_F2 = 0xFF;
SMC_PMCTRL = 0x03; // set stop mode to LLS
sync_read = SMC_PMCTRL;
sync_read++; // Silence compiler warning
__asm("WFI"); //Issue wait for interrupt asm
sync_read++; // Silence compiler warning
}
int main()
{
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
init();
goto_sleep();
while(1);
//never get here
return 0;
}
[code end]