/**
|
******************************************************************************
|
* @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.
|
*
|
* <h2><center>© COPYRIGHT 2019 Chipways</center></h2>
|
******************************************************************************
|
*/
|
|
/* 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));
|
}
|