/** ****************************************************************************** * @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)); }