uint32_t CLOCK_SYS_GetSystickFreq(void) { /* Use external reference clock. */ if (!(SysTick->CTRL & SysTick_CTRL_CLKSOURCE_Msk)) { #if FSL_FEATURE_SYSTICK_EXT_REF_CORE_DIV return CLOCK_SYS_GetCoreClockFreq() / FSL_FEATURE_SYSTICK_EXT_REF_CORE_DIV; #else return 0U; #endif } else // Use core clock. { return CLOCK_SYS_GetCoreClockFreq(); } }
/*FUNCTION********************************************************************* * * Function Name : rtos_cm_callback * Description : rtos callback for change event from clock manager * *END*************************************************************************/ clock_manager_error_code_t rtos_cm_callback(clock_notify_struct_t *notify, void* callbackData) { clock_manager_error_code_t result = kClockManagerSuccess; lptmrStructure_t *lptmrStr = (lptmrStructure_t*)callbackData; switch (notify->notifyType) { case kClockManagerNotifyBefore: // Received "pre" message wait_finish_uart(); SYSTICK_DISABLE(); break; case kClockManagerNotifyRecover: // Received "recover" message SYSTICK_DISABLE(); SYSTICK_RELOAD((CLOCK_SYS_GetCoreClockFreq()/TICK_PER_SEC)-1UL); SYSTICK_ENABLE(); break; case kClockManagerNotifyAfter: // Received "post" message /* Caculate prescaler clock frequency */ if ( kLptmrTimerModeTimeCounter == lptmrStr->lptmrUserConfig.timerMode) { lptmrStr->lptmrState.prescalerClockHz = CLOCK_SYS_GetLptmrFreq(lptmrStr->instance, lptmrStr->lptmrUserConfig.prescalerClockSource); if (lptmrStr->lptmrUserConfig.prescalerEnable) { lptmrStr->lptmrState.prescalerClockHz = (lptmrStr->lptmrState.prescalerClockHz >> ((uint32_t)(lptmrStr->lptmrUserConfig.prescalerValue+1))); } }
clock_manager_error_code_t CLOCK_SYS_GetFreq(clock_names_t clockName, uint32_t *frequency) { clock_manager_error_code_t returnCode = kClockManagerSuccess; switch (clockName) { case kCoreClock: case kSystemClock: *frequency = CLOCK_SYS_GetCoreClockFreq(); break; case kPlatformClock: *frequency = CLOCK_SYS_GetSystemClockFreq(); break; case kBusClock: *frequency = CLOCK_SYS_GetBusClockFreq(); break; case kFlexBusClock: *frequency = CLOCK_SYS_GetFlexbusFreq(); break; case kFlashClock: *frequency = CLOCK_SYS_GetFlashClockFreq(); break; case kOsc32kClock: *frequency = CLOCK_SYS_GetExternalRefClock32kFreq(); break; case kOsc0ErClock: *frequency = CLOCK_SYS_GetOsc0ExternalRefClockFreq(); break; case kRtcoutClock: *frequency = CLOCK_SYS_GetRtcOutFreq(); break; case kMcgFfClock: *frequency = CLOCK_SYS_GetFixedFreqClockFreq(); break; case kMcgFllClock: *frequency = CLOCK_HAL_GetFllClk(MCG_BASE); break; case kMcgPll0Clock: *frequency = CLOCK_HAL_GetPll0Clk(MCG_BASE); break; case kMcgOutClock: *frequency = CLOCK_HAL_GetOutClk(MCG_BASE); break; case kMcgIrClock: *frequency = CLOCK_HAL_GetInternalRefClk(MCG_BASE); break; case kLpoClock: *frequency = CLOCK_SYS_GetLpoClockFreq(); break; default: *frequency = 0U; returnCode = kClockManagerNoSuchClockName; break; } return returnCode; }
/*FUNCTION********************************************************************** * * Function Name : CLOCK_SYS_FllStableDelay * Description : This funtion is used to delay for FLL stable. * According to datasheet, every time the FLL reference source or reference * divider is changed, trim value is changed, DMX32 bit is changed, DRS bits * are changed, or changing from FLL disabled (BLPE, BLPI) to FLL enabled * (FEI, FEE, FBE, FBI), there should be 1ms delay for FLL stable. Please * check datasheet for t(fll_aquire). * *END**************************************************************************/ static void CLOCK_SYS_FllStableDelay(void) { uint32_t coreClk = CLOCK_SYS_GetCoreClockFreq(); coreClk /= 3000U; // Delay 1 ms. while (coreClk--) { __asm ("nop"); } }
/*FUNCTION********************************************************************** * * Function Name : CLOCK_SYS_GetTraceFreq * Description : Gets debug trace clock frequency. * This function gets the debug trace clock frequency. * *END**************************************************************************/ uint32_t CLOCK_SYS_GetTraceFreq(uint32_t instance) { clock_trace_src_t src = CLOCK_HAL_GetTraceClkSrc(SIM); if (kClockTraceSrcMcgoutClk == src) { return CLOCK_HAL_GetOutClk(MCG); } else { return CLOCK_SYS_GetCoreClockFreq(); } }
/*FUNCTION********************************************************************** * * Function Name : CLOCK_SYS_SetConfiguration * Description : This funtion sets the system to target configuration, it * only sets the clock modules registers for clock mode change, but not send * notifications to drivers. * *END**************************************************************************/ clock_manager_error_code_t CLOCK_SYS_SetConfiguration(clock_manager_user_config_t const* config) { assert(NULL != config); /* Set outdiv for safe output clock frequency. */ CLOCK_HAL_SetOutDiv(SIM, 0U, 1U, 1U, 4U); /* Set MCG mode. */ CLOCK_SYS_SetMcgMode(&config->mcgConfig); /* Set SIM setting. */ CLOCK_SYS_SetSimConfigration(&config->simConfig); /* Set OSCERCLK setting. */ CLOCK_SYS_SetOscerConfigration(0, &config->oscerConfig); SystemCoreClock = CLOCK_SYS_GetCoreClockFreq(); return kClockManagerSuccess; }
/*FUNCTION********************************************************************** * Function Name : POWER_SYS_CheckClocks * Description :Internal function used by POWER_SYS_SetMode function *END**************************************************************************/ static power_manager_error_code_t POWER_SYS_CheckClocks(power_manager_modes_t mode) { #if POWER_VLPR_MCG_LITE mcglite_mode_t mcgMode = CLOCK_HAL_GetMode(MCG); #else mcg_modes_t mcgMode = CLOCK_HAL_GetMcgMode(MCG); /* Check clock monitors */ switch(mode) { #if FSL_FEATURE_SMC_HAS_HIGH_SPEED_RUN_MODE case kPowerManagerHsrun: #endif case kPowerManagerRun: case kPowerManagerWait: /* Clock monitors can be enabled */ break; default: /* For other modes clock monitors should be disabled */ #if FSL_FEATURE_MCG_HAS_EXTERNAL_CLOCK_MONITOR if( CLOCK_HAL_IsOsc0MonitorEnabled(MCG) ) { return kPowerManagerErrorClock; } #endif #if FSL_FEATURE_MCG_HAS_RTC_32K if( CLOCK_HAL_IsRtcOscMonitorEnabled(MCG) ) { return kPowerManagerErrorClock; } #endif #if FSL_FEATURE_MCG_USE_PLLREFSEL if( CLOCK_HAL_IsOsc1MonitorEnabled(MCG) ) { return kPowerManagerErrorClock; } #endif break; } #endif /* We need check clocks if goes into VLPR or VLPW over VLPR */ if( (mode!=kPowerManagerVlpr) && (mode!=kPowerManagerVlpw) ) { return kPowerManagerSuccess; } #if POWER_VLPR_MCG_LITE switch(mcgMode) { case kMcgliteModeLirc8M: case kMcgliteModeLirc2M: case kMcgliteModeExt: /* allowed modes */ break; default: return kPowerManagerErrorClock; } if(CLOCK_SYS_GetFlashClockFreq() > POWER_VLPR_MAX_FLASH_BLPE_CLK) { return kPowerManagerErrorClock; } #else switch(mcgMode) { case kMcgModeBLPI: /* fast IRC must be selected */ if(CLOCK_HAL_GetInternalRefClkMode(MCG) != kMcgIrcFast) { return kPowerManagerErrorClock; } if(CLOCK_SYS_GetFlashClockFreq() > POWER_VLPR_MAX_FLASH_BLPI_CLK) { return kPowerManagerErrorClock; } break; case kMcgModeBLPE: if(CLOCK_SYS_GetFlashClockFreq() > POWER_VLPR_MAX_FLASH_BLPE_CLK) { return kPowerManagerErrorClock; } break; default: return kPowerManagerErrorClock; } #endif if(CLOCK_SYS_GetCoreClockFreq() > POWER_VLPR_MAX_CLK) { return kPowerManagerErrorClock; } if(CLOCK_SYS_GetBusClockFreq() > POWER_VLPR_MAX_CLK) { return kPowerManagerErrorClock; } if(CLOCK_SYS_GetSystemClockFreq() > POWER_VLPR_MAX_CLK) { return kPowerManagerErrorClock; } return kPowerManagerSuccess; }
SYSTICK_ENABLE(); break; case kClockManagerNotifyAfter: // Received "post" message /* Caculate prescaler clock frequency */ if ( kLptmrTimerModeTimeCounter == lptmrStr->lptmrUserConfig.timerMode) { lptmrStr->lptmrState.prescalerClockHz = CLOCK_SYS_GetLptmrFreq(lptmrStr->instance, lptmrStr->lptmrUserConfig.prescalerClockSource); if (lptmrStr->lptmrUserConfig.prescalerEnable) { lptmrStr->lptmrState.prescalerClockHz = (lptmrStr->lptmrState.prescalerClockHz >> ((uint32_t)(lptmrStr->lptmrUserConfig.prescalerValue+1))); } } SYSTICK_RELOAD((CLOCK_SYS_GetCoreClockFreq()/TICK_PER_SEC)-1UL); SYSTICK_ENABLE(); break; default: result = kClockManagerError; break; } return result; } /*FUNCTION********************************************************************* * * Function Name : rtos_pm_callback * Description : rtos callback for change event from power manager * *END*************************************************************************/