/**
******************************************************************************
* @file system_XL6600.c
* @author xu.wang
* @version V3.0.0
* @date 4-Jun-2019
* @brief This file provide function about system XL6600 firmware program
* Provides a system configuration function and a global variable that contains
* the system frequency. It configures the device and initializes the oscillator
* (PLL) that is part of the microcontroller device.
******************************************************************************
* @attention
*
* 2019 by Chipways Communications,Inc. All Rights Reserved.
* This software is supplied under the terms of a license
* agreement or non-disclosure agreement with Chipways.
* Passing on and copying of this document,and communication
* of its contents is not permitted without prior written
* authorization.
*
*
© COPYRIGHT 2019 Chipways
******************************************************************************
*/
/* Includes ---------------------------------------------------------------*/
#include "system_xl6600.h"
#include "xl6600.h"
#include "xl_sim.h"
#include "xl_wdog.h"
#include "xl_ics.h"
#include "xl_osc.h"
#include "xl_flash.h"
static uint32_t OSC_ClockSource;
/**
* @brief SystemInitº¯Êý
*/
void SystemInit(void)
{
FMC->FCPC0 |= FMC_FCPC0_CEN_MASK;
SIM_SCGC_Cmd(SIM_SCGC_WDG,ENABLE);
WDOG_EnableCmd(WDOG,ENABLE);
WDOG_ClrInt(WDOG);
WDOG_CountRestart(WDOG);
WDOG_DeInit(WDOG);
WDOG_EnableCmd(WDOG,DISABLE);
SIM_SCGC_Cmd(SIM_SCGC_WDG,DISABLE);
}
/**
* @brief ÉèÖÃÄÚ²¿Ê±ÖÓ
* @param ICS_IRCSel: IRCƵÂÊÑ¡Ôñ
* @arg ICS_IRC_50K £º50K
* @arg ICS_IRC_37o5K £º37.5K
* @param FactorValue: ±¶ÆµÏµÊý
* @arg ICS_FLLFACTOR_1280 £º1280±¶Æµ
* @arg ICS_FLLFACTOR_1920 £º1920±¶Æµ
* @retval None
*/
SYS_CLK_STATUS SystemSetFEI(uint8_t ICS_IRCSel,uint8_t ICS_FLLFSel)
{
uint32_t coreclk;
uint32_t busclk;
uint32_t timeout = 0xFFFFFu;
SYS_CLK_STATUS ClkState = SYS_CLK_OK;
//FLASH_SetReadWait(FLASH_READWAIT_4CYCLE);
if((OSC->CR & OSC_CR_OSCEN_MASK) == OSC_CR_OSCEN_MASK)
{
ICS_ClocksSelect(ICS_CLOCKS_IRC);
OSC->CR &= ~OSC_CR_OSCEN_MASK;
OSC->CR |= 0x16u;
OSC->CR |= OSC_CR_OSCEN_MASK;
while((OSC->CR & OSC_CR_OSCINIT_MASK) != OSC_CR_OSCINIT_MASK)
{
timeout--;
if((timeout<50u)||(timeout>0xFFFFFu))
{
OSC->CR &= ~OSC_CR_OSCEN_MASK;
break;
}
}
OSC->CR &= ~OSC_CR_OSCEN_MASK;
}
ICS_ClocksSelect(ICS_CLOCKS_IRC);
FLASH_SetReadWait(FLASH_READWAIT_2CYCLE);
if(ICS_IRCSel == ICS_IRC_50K)//50k
{
ICS_IRCSelect(ICS_IRC_50K);
if(ICS_FLLFSel == ICS_FLLFACTOR_1920)
{
ICS_FllFactorSelect(ICS_FLLFACTOR_1920);
coreclk = 96000000;
}
else//1280
{
ICS_FllFactorSelect(ICS_FLLFACTOR_1280);
coreclk = 64000000;
}
}
else//37.5k
{
ICS_IRCSelect(ICS_IRC_37o5K);
if(ICS_FLLFSel == ICS_FLLFACTOR_1920)//72
{
ICS_FllFactorSelect(ICS_FLLFACTOR_1920);
coreclk = 72000000;
}
else//1280
{
ICS_FllFactorSelect(ICS_FLLFACTOR_1280);
coreclk = 48000000;
}
}
ICS_IREFSSelect(ICS_IREFS_IRC);
ICS_IRCEnableCmd(ENABLE);
ICS_FllLPModeStopEnableCmd(DISABLE);
timeout = 0xFFFFFu;
while(0u == ICS_GetStatus(ICS_STATUS_LOCK))
{
timeout--;
if((timeout<50u)||(timeout>0xFFFFFu))
{
ClkState = ICS_STATUS_UNLOCK;
break;
//return feeState;
}
}
if(ClkState == SYS_CLK_OK)
{
//coreclk = Get_SystemCoreClock();
if(coreclk > 50000000u)
{
//SIM_CLKDIV_OUTDIV2(2u);
busclk = coreclk>>1u;
}
else
{
busclk = coreclk;
}
timeout = 0xFFFFFu;
while(FLASH_ERR_SUCCESS != FLASH_Init((uint8_t)(busclk/1000000u)))
{
timeout--;
if((timeout<50u)||(timeout>0xFFFFFu))
{
ClkState = FLASH_INIT_ERROR;
break;
//return feeState;
}
}
if(ClkState == SYS_CLK_OK)
{
if(busclk > 90000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_5CYCLE);
}
else if(busclk > 60000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_4CYCLE);
}
else if(busclk > 30000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_3CYCLE);
}
else
{
FLASH_SetReadWait(FLASH_READWAIT_2CYCLE);
}
}
else
{
FLASH_SetReadWait(FLASH_READWAIT_5CYCLE);
}
if(coreclk > 50000000u)
{
SIM_CLKDIV_OUTDIV2(2u);
}
else
{
SIM_CLKDIV_OUTDIV2(1u);
}
ICS_ClocksSelect(ICS_CLOCKS_FLL);
}
return ClkState;
}
/**
* @brief ʹÓÃÍⲿʱÖÓ
* @param osc_clkfre: Íⲿ¾§ÕñƵÂÊ
* @param ICS_FLLFSel: ±¶ÆµÏµÊý
* @arg ICS_FLLFACTOR_1280 £º1280±¶Æµ
* @arg ICS_FLLFACTOR_1920 £º1920±¶Æµ
* @param osc_bdiv: OSCµÚÒ»·ÖƵÆ÷
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
* @arg ICS_RDIV_1or32 £º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ1 £»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ32£»
* @arg ICS_RDIV_2or64 £º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ2 £»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ64£»
* @arg ICS_RDIV_4or128 £º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ4 £»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ128£»
* @arg ICS_RDIV_8or256 £º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ8 £»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ256£»
* @arg ICS_RDIV_16or512 £º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ16 £»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ512£»
* @arg ICS_RDIV_32or1024£º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ32 £»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ1024£»
* @arg ICS_RDIV_64 £º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ64 £»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ±£Áô£»
* @arg ICS_RDIV_128 £º(OSC_CR[RANGE]=0)ƵÂÊ·¶Î§Îª32kHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ128£»ÆµÂÊ·¶Î§Îª4-24MHzµÍƵ·¶Î§£º·ÖƵϵÊýΪ±£Áô£»
* @param osc_bdiv2: OSCµÚ¶þ·ÖƵÆ÷
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
* @arg ICS_RDIV2_1 £º1·ÖƵ
* @arg ICS_RDIV2_2 £º2·ÖƵ
* @arg ICS_RDIV2_3 £º3·ÖƵ
* @arg ICS_RDIV2_4 £º4·ÖƵ
* @arg ICS_RDIV2_5 £º5·ÖƵ
* @arg ICS_RDIV2_6 £º6·ÖƵ
* @arg ICS_RDIV2_7 £º7·ÖƵ
* @arg ICS_RDIV2_8 £º8·ÖƵ
* @retval None
*/
SYS_CLK_STATUS SystemSetFEE(uint32_t osc_clkfre, uint8_t ICS_FLLFSel, uint8_t osc_bdiv,uint8_t osc_bdiv2)
{
OSC_InitTypeDef sOSC_InitTypeDef;
uint32_t temp;
uint32_t temp1;
//uint8_t stat_flag;
uint32_t coreclk;
uint32_t busclk;
uint32_t timeout = 0xFFFFu;
SYS_CLK_STATUS ClkState = SYS_CLK_OK;
OSC_EnableCmd(DISABLE);
sOSC_InitTypeDef.OSC_ModeSelect = OSC_HG_MODE;//OSC_HG_MODE OSC_LP_MODE
sOSC_InitTypeDef.OSC_OutputSelect = OSC_OSCCILLATOR_COLOR;
sOSC_InitTypeDef.OSC_RangeSelect = OSC_RANGE_HIGH;//OSC_RANGE_LOW OSC_RANGE_HIGH
OSC_Init(&sOSC_InitTypeDef);
OSC_EnableCmd(ENABLE);
while(0u==OSC_GetInitStatus())
{
timeout--;
if((timeout<50u)||(timeout>0xFFFFu))
{
ClkState = OSC_INIT_ERROR;
break;
//return feeState;
}
}
if(ClkState == SYS_CLK_OK)
{
//FLASH_SetReadWait(FLASH_READWAIT_4CYCLE);
if(OSC_RANGE_HIGH == OSC_GetRange())
{
temp = (uint32_t)((uint32_t)1u<<(osc_bdiv+5u));
temp *= ((uint32_t)osc_bdiv2+1u);
}
else
{
temp = (uint32_t)((uint32_t)1u<<(osc_bdiv));
temp *= ((uint32_t)osc_bdiv2+1u);
}
temp1 = osc_clkfre/temp;
if((temp1<30000u) || (temp1>65000u))
{
//stat_flag=0;
ClkState = OSC_DIV_ERROR;
OSC_EnableCmd(DISABLE);
sOSC_InitTypeDef.OSC_ModeSelect = OSC_HG_MODE;//OSC_HG_MODE OSC_LP_MODE
sOSC_InitTypeDef.OSC_OutputSelect = OSC_OSCCILLATOR_COLOR;
sOSC_InitTypeDef.OSC_RangeSelect = OSC_RANGE_HIGH;//OSC_RANGE_LOW OSC_RANGE_HIGH
OSC_Init(&sOSC_InitTypeDef);
OSC_EnableCmd(DISABLE);
}
else
{
ICS_BaseDivider(osc_bdiv);//ÉèÖÃÍⲿʱÖÓ·ÖÆµÖµ
ICS_BaseDivider2(osc_bdiv2);
ICS_ClocksSelect(ICS_CLOCKS_IRC);
FLASH_SetReadWait(FLASH_READWAIT_2CYCLE);
if(ICS_FLLFSel == ICS_FLLFACTOR_1920)
{
ICS_FllFactorSelect(ICS_FLLFACTOR_1920);
coreclk = temp1 * 1920;
}
else//1280
{
ICS_FllFactorSelect(ICS_FLLFACTOR_1280);
coreclk = temp1 * 1280;
}
/*FLL is not must close in stop mode*/
//ICS_FllStopModeCloseEnableCmd(ICS,DISABLE);
//SystemSetFBI();//ÄÚ²¿ÅÔ·ʱÖÓ
//ICS_ClocksSelect(ICS_CLOCKS_IRC);
ICS_IREFSSelect(ICS_IREFS_OSC);
/*FLL ÔÚÅÔ·ģʽϲ»½ûÓÃ*/
ICS_FllLPModeStopEnableCmd(DISABLE);
timeout = 0xFFFFu;
while(0u==ICS_GetStatus(ICS_STATUS_LOCK))
{
timeout--;
if((timeout<50u)||(timeout>0xFFFFu))
{
ClkState = ICS_STATUS_UNLOCK;
break;
//return feeState;
}
}
if(ClkState == SYS_CLK_OK)
{
OSC_ClockSource = osc_clkfre;
/*Ñ¡ÔñIREFS(FLL)ʱÖÓԴΪÍⲿʱÖÓ*/
//ICS_IREFSSelect(ICS_IREFS_OSC);
//coreclk = Get_SystemCoreClock();
if(coreclk > 50000000u)
{
//SIM_CLKDIV_OUTDIV2(2);
busclk = coreclk>>1u;
}
else
{
busclk = coreclk;
}
timeout = 0xFFFFFu;
while(FLASH_ERR_SUCCESS != FLASH_Init((uint8_t)(busclk/1000000u)))
{
timeout--;
if((timeout<50u)||(timeout>0xFFFFu))
{
ClkState = FLASH_INIT_ERROR;
break;
}
}
if(ClkState == SYS_CLK_OK)
{
if(busclk > 90000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_5CYCLE);
}
else if(busclk > 60000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_4CYCLE);
}
else if(busclk > 30000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_3CYCLE);
}
else
{
FLASH_SetReadWait(FLASH_READWAIT_2CYCLE);
}
if(coreclk > 50000000u)
{
SIM_CLKDIV_OUTDIV2(2);
}
else
{
SIM_CLKDIV_OUTDIV2(1);
}
ICS_ClocksSelect(ICS_CLOCKS_FLL);
}
else
{
FLASH_SetReadWait(FLASH_READWAIT_5CYCLE);
}
}
else
{
ICS_IREFSSelect(ICS_IREFS_IRC);
OSC_EnableCmd(DISABLE);
sOSC_InitTypeDef.OSC_ModeSelect = OSC_HG_MODE;//OSC_HG_MODE OSC_LP_MODE
sOSC_InitTypeDef.OSC_OutputSelect = OSC_OSCCILLATOR_COLOR;
sOSC_InitTypeDef.OSC_RangeSelect = OSC_RANGE_HIGH;//OSC_RANGE_LOW OSC_RANGE_HIGH
OSC_Init(&sOSC_InitTypeDef);
OSC_EnableCmd(DISABLE);
}
}
}
else
{
OSC_EnableCmd(DISABLE);
sOSC_InitTypeDef.OSC_ModeSelect = OSC_HG_MODE;//OSC_HG_MODE OSC_LP_MODE
sOSC_InitTypeDef.OSC_OutputSelect = OSC_OSCCILLATOR_COLOR;
sOSC_InitTypeDef.OSC_RangeSelect = OSC_RANGE_HIGH;//OSC_RANGE_LOW OSC_RANGE_HIGH
OSC_Init(&sOSC_InitTypeDef);
OSC_EnableCmd(DISABLE);
}
return ClkState;
}
/**
* @brief ÄÚ²¿ÅÔ·
* @param None
* @retval ÄÚ²¿ÅÔ·ʱÖӵįµÂÊ
*/
uint32_t SystemSetFBI(void)
{
uint32_t temp;
uint32_t coreclk;
/* ICS Clocks is IRC*/
ICS_ClocksSelect(ICS_CLOCKS_IRC);
/*FLL ÔÚÅÔ·ģʽϲ»½ûÓÃ*/
ICS_FllLPModeStopEnableCmd(DISABLE);
if(ICS_GetIRCFre() == ICS_IRC_37o5K)
{
temp = 150000u;
}
else
{
temp = 100000u;
}
coreclk = Get_SystemCoreClock();
if(coreclk > 50000000u)
{
SIM_CLKDIV_OUTDIV2(2);
}
if(Get_BusClock() > 90000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_5CYCLE);
}
else if(Get_BusClock() > 60000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_4CYCLE);
}
else if(Get_BusClock() > 30000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_3CYCLE);
}
else
{
FLASH_SetReadWait(FLASH_READWAIT_2CYCLE);
}
return temp;
}
/**
* @brief ÄÚ²¿ÅÔ·µÍ¹¦ºÄ
* @param None
* @retval None
*/
void SystemSetFBILP(void)
{
/* ICS Clocks is IRC*/
ICS_ClocksSelect(ICS_CLOCKS_IRC);
//ICS_IRCSelect(ICS_IRC_37o5K);
//ICS_IREFStopEnableCmd(ENABLE);
/*FLL Factor is 1280*/
ICS_FllFactorSelect(ICS_FLLFACTOR_1280);
/*FLL is must close in stop mode*/
ICS_FllStopModeCloseEnableCmd(ENABLE);
//ICS_FllLPModeStopEnableCmd(ENABLE);
}
/**
* @brief ÍⲿÅÔ·
* @param None
* @retval None
*/
void SystemSetFBE(uint32_t osc_clkfre)
{
OSC_InitTypeDef sOSC_InitTypeDef;
uint32_t coreclk;
OSC_EnableCmd(DISABLE);
sOSC_InitTypeDef.OSC_ModeSelect = OSC_HG_MODE;
sOSC_InitTypeDef.OSC_OutputSelect = OSC_OSCCILLATOR_COLOR;
sOSC_InitTypeDef.OSC_RangeSelect = OSC_RANGE_HIGH;
OSC_Init(&sOSC_InitTypeDef);
OSC_EnableCmd(ENABLE);
while(0u==OSC_GetInitStatus()){};
/*Ñ¡ÔñICSΪÍⲿ»ù׼ʱÖÓ*/
ICS_ClocksSelect(ICS_CLOCKS_OSC);
/*Ñ¡ÔñIREFS(FLL)ʱÖÓԴΪÍⲿʱÖÓ*/
ICS_IREFSSelect(ICS_IREFS_OSC);
/*Ñ¡ÔñIREFSÔÚstopģʽϲ»Í£Ö¹Ê¹ÄÜ*/
ICS_IREFStopEnableCmd(DISABLE);
/*FLL Factor is 1280*/
ICS_FllFactorSelect(ICS_FLLFACTOR_1280);
/*FLL is not must close in stop mode*/
ICS_FllStopModeCloseEnableCmd(DISABLE);
/*FLL ÔÚÅÔ·ģʽϲ»½ûÓÃ*/
ICS_FllLPModeStopEnableCmd(ENABLE);
//ICS_IRCEnableCmd(ICS,DISABLE);
OSC_ClockSource = osc_clkfre;
coreclk = Get_SystemCoreClock();
if(coreclk > 50000000u)
{
SIM_CLKDIV_OUTDIV2(2);
}
if(Get_BusClock() > 90000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_5CYCLE);
}
else if(Get_BusClock() > 60000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_4CYCLE);
}
else if(Get_BusClock() > 30000000u)
{
FLASH_SetReadWait(FLASH_READWAIT_3CYCLE);
}
else
{
FLASH_SetReadWait(FLASH_READWAIT_2CYCLE);
}
}
/**
* @brief ÍⲿÅÔ·µÍ¹¦ºÄ
* @param ICSx: Ö¸ÏòICSÍâÉè
* @param FactorValue: ±¶ÆµÏµÊý
* @arg ICS_FLLFactorSelect1280 £º1280±¶Æµ
* @arg ICS_FLLFactorSelect1920 £º1920±¶Æµ
* @retval None
*/
void SystemSetFBELP(void)
{
OSC_InitTypeDef sOSC_InitTypeDef;
OSC_EnableCmd(DISABLE);
sOSC_InitTypeDef.OSC_ModeSelect = OSC_HG_MODE;
sOSC_InitTypeDef.OSC_OutputSelect = OSC_OSCCILLATOR_COLOR;
sOSC_InitTypeDef.OSC_RangeSelect = OSC_RANGE_HIGH;
OSC_Init(&sOSC_InitTypeDef);
OSC_EnableCmd(ENABLE);
while(0u != OSC_GetInitStatus()){};
/*Ñ¡ÔñICSΪÍⲿ»ù׼ʱÖÓ*/
ICS_ClocksSelect(ICS_CLOCKS_OSC);
/*Ñ¡ÔñIREFSÔÚstopģʽϲ»Í£Ö¹Ê¹ÄÜ*/
ICS_IREFStopEnableCmd(ENABLE);
/*FLL is must close in stop mode*/
ICS_FllStopModeCloseEnableCmd(ENABLE);
}
/**
* @brief »ñÈ¡FLLOutCLKÊä³öµÄʱÖÓÆµÂÊ
* @param None
* @retval FLLÊä³öµÄʱÖÓÆµÂÊ
*/
static uint32_t Get_FllOutClock(void)
{
uint32_t FLL_OutClock;
uint32_t rdiv_flag;
uint32_t rdiv2_flag;
uint32_t rdiv_value;
if(ICS_IREFS_IRC == ICS_GetIREFSSelect())//ÄÚ²¿Ê±ÖÓÔ´
{
if(ICS_IRC_37o5K == ICS_GetIRCFre())
{
if(ICS_FLLFACTOR_1920 == ICS_GetFLLMultiple())
{
FLL_OutClock = 37500 * 1920;
}
else
{
FLL_OutClock = 37500 * 1280;
}
}
else
{
if(ICS_FLLFACTOR_1920 == ICS_GetFLLMultiple())
{
FLL_OutClock = 50000 * 1920;
}
else
{
FLL_OutClock = 50000 * 1280;
}
}
}
else//ÍⲿʱÖÓ
{
rdiv_flag = ICS_GetBaseDivider();
rdiv2_flag = ICS_GetBaseDivider2();
if(OSC_RANGE_HIGH == OSC_GetRange())
{
rdiv_value = (uint32_t)((uint32_t)1u<<(rdiv_flag+5u));
}
else
{
rdiv_value = (uint32_t)((uint32_t)1u<<(rdiv_flag));
}
rdiv_value = rdiv_value*rdiv2_flag;
if(ICS_FLLFACTOR_1920 == ICS_GetFLLMultiple())
{
FLL_OutClock = (OSC_ClockSource/rdiv_value) * 1920u;
}
else
{
FLL_OutClock = (OSC_ClockSource/rdiv_value) * 1280u;
}
}
return FLL_OutClock;
}
/**
* @brief »ñÈ¡IcsOutCLKÊä³öµÄʱÖÓÆµÂÊ
* @param None
* @retval FLLÊä³öµÄʱÖÓÆµÂÊ
*/
uint32_t Get_ICSOUTClock(void)
{
uint8_t bdiv_value;
uint32_t fll_outfre;
fll_outfre = Get_FllOutClock();
bdiv_value = ICS_GetBusDivder();
return (fll_outfre/((uint32_t)bdiv_value+1u));
}
/**
* @brief »ñÈ¡ÊäÈëµ½CoreµÄʱÖÓÆµÂÊ
* @param None
* @retval ÊäÈëµ½CoreµÄʱÖÓÆµÂÊ
*/
uint32_t Get_SystemCoreClock(void)
{
uint32_t ics_outclk;
uint8_t outdiv1_value;
ics_outclk = Get_ICSOUTClock();
outdiv1_value = SIM_GetOUTDIV1();
return (ics_outclk/((uint32_t)outdiv1_value+1u));
}
/**
* @brief »ñÈ¡ÊäÈëµ½FTMºÍPWTµÄʱÖÓÆµÂÊ
* @param None
* @retval ÊäÈëµ½FTMºÍPWTµÄʱÖÓÆµÂÊ
*/
uint32_t Get_FTM_PWT_Clock(void)
{
uint32_t ics_outclk;
uint8_t outdiv4_value;
ics_outclk = Get_ICSOUTClock();
outdiv4_value = SIM_GetOUTDIV4();
return (ics_outclk/((uint32_t)outdiv4_value+1u));
}
/**
* @brief »ñÈ¡ÊäÈëµ½BUSºÍFlashµÄʱÖÓÆµÂÊ
* @param None
* @retval ÊäÈëµ½BUSºÍFlashµÄʱÖÓÆµÂÊ
*/
uint32_t Get_BusClock(void)
{
uint32_t core_clk;
uint8_t outdiv2_value;
core_clk = Get_SystemCoreClock();
// if(core_clk > 50000000)
// {
// SIM_CLKDIV_OUTDIV2(2);
// }
outdiv2_value = SIM_GetOUTDIV2();
return (core_clk/((uint32_t)outdiv2_value+1u));
}
/**
* @brief »ñÈ¡ÊäÈëµ½ÍâÉèµÄʱÖÓÆµÂÊ
* @param None
* @retval ÊäÈëµ½ÍâÉèµÄʱÖÓÆµÂÊ
*/
uint32_t Get_PeripheralClock(void)
{
uint32_t bus_clk;
uint8_t outdiv3_value;
bus_clk = Get_BusClock();
outdiv3_value = SIM_GetOUTDIV3();
return (bus_clk/((uint32_t)outdiv3_value+1u));
}