void hal_deepsleep(void) { #if (defined(FSL_FEATURE_SOC_MCG_COUNT) && FSL_FEATURE_SOC_MCG_COUNT) #if (defined(FSL_FEATURE_MCG_HAS_PLL) && FSL_FEATURE_MCG_HAS_PLL) mcg_mode_t mode = CLOCK_GetMode(); #endif // FSL_FEATURE_MCG_HAS_PLL #endif // FSL_FEATURE_SOC_MCG_COUNT SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll); PreEnterStopModes(); SMC_SetPowerModeVlps(SMC); PostExitStopModes(); #if (defined(FSL_FEATURE_SOC_MCG_COUNT) && FSL_FEATURE_SOC_MCG_COUNT) #if (defined(FSL_FEATURE_MCG_HAS_PLL) && FSL_FEATURE_MCG_HAS_PLL) /* * If enter stop modes when MCG in PEE mode, then after wakeup, the MCG is in PBE mode, * need to enter PEE mode manually. */ if (mode == kMCG_ModePEE) { BOARD_BootClockRUN(); } #endif // FSL_FEATURE_MCG_HAS_PLL #endif // FSL_FEATURE_SOC_MCG_COUNT }
/*! * @brief Application task function. * * This function runs the task for application. * * @return None. */ void APP_task(void) { usb_status_t error = kStatus_USB_Error; if ((1 == s_cdcVcom.attach) && (1 == s_cdcVcom.startTransactions)) { /* User Code */ if ((0 != s_recvSize) && (0xFFFFFFFFU != s_recvSize)) { int32_t i; /* Copy Buffer to Send Buff */ for (i = 0; i < s_recvSize; i++) { s_currSendBuf[s_sendSize++] = s_currRecvBuf[i]; } s_recvSize = 0; } if (s_sendSize) { uint32_t size = s_sendSize; s_sendSize = 0; error = USB_DeviceSendRequest(s_cdcVcom.deviceHandle, USB_CDC_VCOM_BULK_IN_ENDPOINT, s_currSendBuf, size); if (error != kStatus_USB_Success) { /* Failure to send Data Handling code here */ } } #if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \ defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \ defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U) if ((s_waitForDataReceive)) { if (s_comOpen == 1) { /* Wait for all the packets been sent during opening the com port. Otherwise these packets may * wake up the system. */ usb_echo("Waiting to enter lowpower ...\r\n"); for (uint32_t i = 0U; i < 16000000U; ++i) { __ASM("NOP"); /* delay */ } s_comOpen = 0; } usb_echo("Enter lowpower\r\n"); USB0->INTEN &= ~USB_INTEN_TOKDNEEN_MASK; SMC_SetPowerModeVlps(SMC); s_waitForDataReceive = 0; USB0->INTEN |= USB_INTEN_TOKDNEEN_MASK; usb_echo("Exit lowpower\r\n"); } #endif } #if USB_DEVICE_CONFIG_USE_TASK USB_DeviceKhciTaskFunction(s_cdcVcom.deviceHandle); #endif }
/*! * @brief main function */ int main(void) { int32_t currentTemperature = 0; uint32_t updateBoundariesCounter = 0; int32_t tempArray[UPDATE_BOUNDARIES_TIME * 2]; lowPowerAdcBoundaries_t boundaries; /* Init hardware */ BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); /* Init using Led in Demo app */ LED1_INIT(); LED2_INIT(); /* Set to allow entering vlps mode */ SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeVlp); /* Calibrate param Temperature sensor */ ADC16_CalibrateParams(DEMO_ADC16_BASEADDR); /* Initialize Demo ADC */ if (!ADC16_InitHardwareTrigger(DEMO_ADC16_BASEADDR)) { PRINTF("Failed to do the ADC init\r\n"); return -1; } PRINTF("\n\r ADC LOW POWER DEMO\n"); PRINTF("\r The Low Power ADC project is designed to work with the Tower System or in a stand alone setting\n\n"); PRINTF("\r 1. Set your target board in a place where the temperature is constant.\n"); PRINTF("\r 2. Wait until two Led light turns on.\n"); PRINTF("\r 3. Increment or decrement the temperature to see the changes.\n"); PRINTF("\r Wait two led on...\n\r"); /* setup the HW trigger source */ LPTMR_InitTriggerSourceOfAdc(DEMO_LPTMR_BASE); ADC16_EnableDMA(DEMO_ADC16_BASEADDR, false); NVIC_EnableIRQ(DEMO_ADC16_IRQ_ID); /* Warm up microcontroller and allow to set first boundaries */ while (updateBoundariesCounter < (UPDATE_BOUNDARIES_TIME * 2)) { while (!conversionCompleted) { } currentTemperature = GetCurrentTempValue(); tempArray[updateBoundariesCounter] = currentTemperature; updateBoundariesCounter++; conversionCompleted = false; } /* Temp Sensor Calibration */ boundaries = TempSensorCalibration(updateBoundariesCounter, tempArray); updateBoundariesCounter = 0; /* Two LED is turned on indicating calibration is done */ LED1_ON(); LED2_ON(); /* Wait for user input before beginning demo */ PRINTF("\r Enter any character to begin...\n"); GETCHAR(); PRINTF("\r ---> OK! Main process is running...!\n"); while (1) { /* Prevents the use of wrong values */ while (!conversionCompleted) { } /* Get current Temperature Value */ currentTemperature = GetCurrentTempValue(); /* Store temperature values that are going to be use to calculate average temperature */ tempArray[updateBoundariesCounter] = currentTemperature; if (currentTemperature > boundaries.upperBoundary) { LED2_OFF(); LED1_ON(); } else if (currentTemperature < boundaries.lowerBoundary) { LED2_ON(); LED1_OFF(); } else { LED2_ON(); LED1_ON(); } /* Call update function */ if (updateBoundariesCounter >= (UPDATE_BOUNDARIES_TIME)) { boundaries = TempSensorCalibration(updateBoundariesCounter, tempArray); updateBoundariesCounter = 0; } else { updateBoundariesCounter++; } /* Clear conversionCompleted flag */ conversionCompleted = false; /* Enter to Very Low Power Stop Mode */ SMC_SetPowerModeVlps(SMC); } }