示例#1
0
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();
    }
}
示例#2
0
/*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;
}
示例#7
0
/*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;
}
示例#8
0
            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*************************************************************************/