bool PCM_gotoLPM0InterruptSafe(void) { bool slHappenedCorrect; /* Disabling master interrupts. In Cortex M, if an interrupt is enabled but master interrupts are disabled and a WFI happens the WFI will immediately exit. */ Interrupt_disableMaster(); slHappenedCorrect = PCM_gotoLPM0(); /* Enabling and Disabling Interrupts very quickly so that the processor catches any pending interrupts */ Interrupt_enableMaster(); Interrupt_disableMaster(); return slHappenedCorrect; }
int main(void) { /* Halting WDT */ WDT_A_holdTimer(); Interrupt_enableSleepOnIsrExit(); /* Initializing ADC (MCLK/1/1) */ ADC14_enableModule(); ADC14_initModule(ADC_CLOCKSOURCE_MCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_1, 0); /* Configuring ADC Memory (ADC_MEM0 A0/A1 Differential) in repeat mode * with use of external references */ ADC14_configureSingleSampleMode(ADC_MEM0, true); ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_EXTPOS_VREFNEG_EXTNEG, ADC_INPUT_A0, true); /* Setting up GPIO pins as analog inputs (and references) */ GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN6 | GPIO_PIN5 | GPIO_PIN4, GPIO_TERTIARY_MODULE_FUNCTION); /* Enabling sample timer in auto iteration mode and interrupts*/ ADC14_enableSampleTimer(ADC_AUTOMATIC_ITERATION); ADC14_enableInterrupt(ADC_INT0); /* Enabling Interrupts */ Interrupt_enableInterrupt(INT_ADC14); Interrupt_enableMaster(); /* Triggering the start of the sample */ ADC14_enableConversion(); ADC14_toggleConversionTrigger(); /* Going to sleep */ while (1) { PCM_gotoLPM0(); } }
int CLI_Read(unsigned char *pBuff) { if(pBuff == NULL) return -1; #ifdef _USE_CLI_ cli_have_cmd = 0; g_ucUARTBuffer = pBuff; UCA0IE |= UCRXIE; Interrupt_enableMaster(); Interrupt_enableInterrupt(INT_EUSCIA0); PCM_gotoLPM0(); // __bis_SR_register(LPM0_bits + GIE); while(cli_have_cmd == 0); UCA0IE &= ~UCRXIE; return strlen((const char *)pBuff); #else return 0; #endif }
static bool __PCM_setPowerStateAdvanced(uint_fast8_t powerState, uint32_t timeout, bool blocking) { uint8_t bCurrentPowerState; bCurrentPowerState = PCM_getPowerState(); ASSERT( powerState == PCM_AM_LDO_VCORE0 || powerState == PCM_AM_LDO_VCORE1 || powerState == PCM_AM_DCDC_VCORE0 || powerState == PCM_AM_DCDC_VCORE1 || powerState == PCM_AM_LF_VCORE0 || powerState == PCM_AM_LF_VCORE1 || powerState == PCM_LPM0_LDO_VCORE0 || powerState == PCM_LPM0_LDO_VCORE1 || powerState == PCM_LPM0_DCDC_VCORE0 || powerState == PCM_LPM0_DCDC_VCORE1 || powerState == PCM_LPM3 || powerState == PCM_LPM35_VCORE0 || powerState == PCM_LPM45 || powerState == PCM_LPM4); if (bCurrentPowerState == powerState) return true; switch (powerState) { case PCM_AM_LDO_VCORE0: return (__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE0, timeout, blocking) && __PCM_setPowerModeAdvanced(PCM_LDO_MODE, timeout, blocking)); case PCM_AM_LDO_VCORE1: return (__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE1, timeout, blocking) && __PCM_setPowerModeAdvanced(PCM_LDO_MODE, timeout, blocking)); case PCM_AM_DCDC_VCORE0: return (__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE0, timeout, blocking) && __PCM_setPowerModeAdvanced(PCM_DCDC_MODE, timeout, blocking)); case PCM_AM_DCDC_VCORE1: return (__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE1, timeout, blocking) && __PCM_setPowerModeAdvanced(PCM_DCDC_MODE, timeout, blocking)); case PCM_AM_LF_VCORE0: return (__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE0, timeout, blocking) && __PCM_setPowerModeAdvanced(PCM_LF_MODE, timeout, blocking)); case PCM_AM_LF_VCORE1: return (__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE1, timeout, blocking) && __PCM_setPowerModeAdvanced(PCM_LF_MODE, timeout, blocking)); case PCM_LPM0_LDO_VCORE0: if (!__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE0, timeout, blocking) || !__PCM_setPowerModeAdvanced(PCM_LDO_MODE, timeout, blocking)) break; return PCM_gotoLPM0(); case PCM_LPM0_LDO_VCORE1: if (!__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE1, timeout, blocking) || !__PCM_setPowerModeAdvanced(PCM_LDO_MODE, timeout, blocking)) break; return PCM_gotoLPM0(); case PCM_LPM0_DCDC_VCORE0: if (!__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE0, timeout, blocking) || !__PCM_setPowerModeAdvanced(PCM_DCDC_MODE, timeout, blocking)) break; return PCM_gotoLPM0(); case PCM_LPM0_DCDC_VCORE1: if (!__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE1, timeout, blocking) || !__PCM_setPowerModeAdvanced(PCM_DCDC_MODE, timeout, blocking)) break; return PCM_gotoLPM0(); case PCM_LPM0_LF_VCORE0: if (!__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE0, timeout, blocking) || !__PCM_setPowerModeAdvanced(PCM_LF_MODE, timeout, blocking)) break; return PCM_gotoLPM0(); case PCM_LPM0_LF_VCORE1: if (!__PCM_setCoreVoltageLevelAdvanced(PCM_VCORE1, timeout, blocking) || !__PCM_setPowerModeAdvanced(PCM_LF_MODE, timeout, blocking)) break; return PCM_gotoLPM0(); case PCM_LPM3: return PCM_gotoLPM3(); case PCM_LPM4: return PCM_gotoLPM4(); case PCM_LPM45: return PCM_shutdownDevice(PCM_LPM45); case PCM_LPM35_VCORE0: return PCM_shutdownDevice(PCM_LPM35_VCORE0); default: ASSERT(false); return false; } return false; }