/*! * @brief Example function to show how to change from FEE to BLPI mode. * MCG transition: FEE -> FBI -> BLPI */ void APP_ChangeFeeToBlpiExample(void) { /* Change FEE -> FBI * It's transitional mode, don't need to wait for FLL stable, * so NULL is passed as variable here. */ CLOCK_SetFbiMode(kMCG_DrsLow, NULL); assert(kMCG_ModeFBI == CLOCK_GetMode()); /* Change FBI -> BLPI */ CLOCK_SetLowPowerEnable(true); assert(kMCG_ModeBLPI == CLOCK_GetMode()); }
status_t CLOCK_SetMcgConfig(const mcg_config_t *config) { mcg_mode_t next_mode; status_t status = kStatus_Success; mcg_pll_clk_select_t pllcs = kMCG_PllClkSelPll0; /* If need to change external clock, MCG_C7[OSCSEL]. */ if (MCG_C7_OSCSEL_VAL != config->oscsel) { /* If external clock is in use, change to FEI first. */ if (!(MCG->S & MCG_S_IRCST_MASK)) { CLOCK_ExternalModeToFbeModeQuick(); CLOCK_SetFeiMode(config->dmx32, config->drs, (void (*)(void))0); } CLOCK_SetExternalRefClkConfig(config->oscsel); } /* Re-configure MCGIRCLK, if MCGIRCLK is used as system clock source, then change to FEI/PEI first. */ if (MCG_S_CLKST_VAL == kMCG_ClkOutStatInt) { MCG->C2 &= ~MCG_C2_LP_MASK; /* Disable lowpower. */ { CLOCK_SetFeiMode(config->dmx32, config->drs, CLOCK_FllStableDelay); } } /* Configure MCGIRCLK. */ CLOCK_SetInternalRefClkConfig(config->irclkEnableMode, config->ircs, config->fcrdiv); next_mode = CLOCK_GetMode(); do { next_mode = mcgModeMatrix[next_mode][config->mcgMode]; switch (next_mode) { case kMCG_ModeFEI: status = CLOCK_SetFeiMode(config->dmx32, config->drs, CLOCK_FllStableDelay); break; case kMCG_ModeFEE: status = CLOCK_SetFeeMode(config->frdiv, config->dmx32, config->drs, CLOCK_FllStableDelay); break; case kMCG_ModeFBI: status = CLOCK_SetFbiMode(config->dmx32, config->drs, (void (*)(void))0); break; case kMCG_ModeFBE: status = CLOCK_SetFbeMode(config->frdiv, config->dmx32, config->drs, (void (*)(void))0); break; case kMCG_ModeBLPI: status = CLOCK_SetBlpiMode(); break; case kMCG_ModeBLPE: status = CLOCK_SetBlpeMode(); break; case kMCG_ModePBE: /* If target mode is not PBE or PEE, then only need to set CLKS = EXT here. */ if ((kMCG_ModePEE == config->mcgMode) || (kMCG_ModePBE == config->mcgMode)) { { status = CLOCK_SetPbeMode(pllcs, &config->pll0Config); } } else { MCG->C1 = ((MCG->C1 & ~MCG_C1_CLKS_MASK) | MCG_C1_CLKS(kMCG_ClkOutSrcExternal)); while (MCG_S_CLKST_VAL != kMCG_ClkOutStatExt) { } } break; case kMCG_ModePEE: status = CLOCK_SetPeeMode(); break; default: break; } if (kStatus_Success != status) { return status; } } while (next_mode != config->mcgMode); if (config->pll0Config.enableMode & kMCG_PllEnableIndependent) { CLOCK_EnablePll0(&config->pll0Config); } else { MCG->C5 &= ~(uint32_t)kMCG_PllEnableIndependent; } return kStatus_Success; }
status_t CLOCK_SetMcgConfig(const mcg_config_t *config) { mcg_mode_t next_mode; status_t status = kStatus_Success; /* If need to change external clock, MCG_C7[OSCSEL]. */ if (MCG_C7_OSCSEL_VAL != config->oscsel) { /* If external clock is in use, change to FEI first. */ if (!(MCG->S & MCG_S_IRCST_MASK)) { CLOCK_ExternalModeToFbeModeQuick(); CLOCK_SetFeiMode(config->dmx32, config->drs, (void (*)(void))0); } CLOCK_SetExternalRefClkConfig(config->oscsel); } /* Re-configure MCGIRCLK, if MCGIRCLK is used as system clock source, then change to FEI/PEI first. */ if (MCG_S_CLKST_VAL == kMCG_ClkOutStatInt) { MCG->C2 &= ~MCG_C2_LP_MASK; /* Disable lowpower. */ { CLOCK_SetFeiMode(config->dmx32, config->drs, CLOCK_FllStableDelay); } } /* Configure MCGIRCLK. */ CLOCK_SetInternalRefClkConfig(config->irclkEnableMode, config->ircs, config->fcrdiv); next_mode = CLOCK_GetMode(); do { next_mode = mcgModeMatrix[next_mode][config->mcgMode]; switch (next_mode) { case kMCG_ModeFEI: status = CLOCK_SetFeiMode(config->dmx32, config->drs, CLOCK_FllStableDelay); break; case kMCG_ModeFEE: status = CLOCK_SetFeeMode(config->frdiv, config->dmx32, config->drs, CLOCK_FllStableDelay); break; case kMCG_ModeFBI: status = CLOCK_SetFbiMode(config->dmx32, config->drs, (void (*)(void))0); break; case kMCG_ModeFBE: status = CLOCK_SetFbeMode(config->frdiv, config->dmx32, config->drs, (void (*)(void))0); break; case kMCG_ModeBLPI: status = CLOCK_SetBlpiMode(); break; case kMCG_ModeBLPE: status = CLOCK_SetBlpeMode(); break; default: break; } if (kStatus_Success != status) { return status; } } while (next_mode != config->mcgMode); return kStatus_Success; }