/** ########################################################################## ** Filename : ** Project : ** Module : ** Processor : ** Version : ** Compiler : ** Date/Time : ** Abstract : ** Contents : ** Note : ** ** (c) Copyright dmdz Co.,Ltd ** -------------------------------------------------------------------------- ** R E V I S I O N H I S T O R Y ** -------------------------------------------------------------------------- ** Date Ver Author Description ** -20230602- --V1.0-- --mingyea--- --修改-- ** #########################################################################*/ /*--------------------------------------------------------------------------- - I N C L U D E F I L E S ----------------------------------------------------------------------------*/ #include "clk.h" #include "mf_config.h" #include "nvic.h" /*--------------------------------------------------------------------------- - D E F I N E S / M A C R O S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - T Y P E D E F I N I T I O N S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - S T A T I C V A R I A B L E S ----------------------------------------------------------------------------*/ //static clk_work_mode_e g_clk_work_mode; static clk_clocks_freq_s g_clk_info; /*--------------------------------------------------------------------------- * G L O B A L V A R I A B L E S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - C O N S T A N T S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - F U N C T I O N P R O T O T Y P E ----------------------------------------------------------------------------*/ extern void SystemInit_hsi(void); /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description :初始化 ----------------------------------------------------------------------------*/ void clk_init(void) { FL_Init(); MF_Clock_Init(); #ifdef CLK_HSE_EN /* XTHF 8M倍频至48M */ SelXTHFToPLL(FL_CMU_PLL_PSC_DIV8, 48 - 1); #else SystemInit_hsi(); #endif FL_CMU_RCLP_Enable(); //其实默认己开 //SystemCoreClockUpdate(); } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ void SystemDeInit (void) { #if 0 CKGEN_SetSysclkSrc(SYSCLK_SRC_INTERNAL_OSC); ///PLLCR, CMU_PLLCR_DB_Msk | CMU_PLLCR_REFPRSC_Msk | CMU_PLLCR_OSEL_Msk | CMU_PLLCR_INSEL_Msk, (PLL_DB << CMU_PLLCR_DB_Pos) | PLL_REFPSC | PLL_OSEL | Source); } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : RCHF振荡频率值 |Output parameters : |Return value : |Description : RCHF初始化配置 ----------------------------------------------------------------------------*/ void RCHFInit(uint32_t clock) { switch(clock) { case FL_CMU_RCHF_FREQUENCY_8MHZ: FL_CMU_RCHF_WriteTrimValue(RCHF8M_TRIM); break; case FL_CMU_RCHF_FREQUENCY_16MHZ: FL_CMU_RCHF_WriteTrimValue(RCHF16M_TRIM); break; case FL_CMU_RCHF_FREQUENCY_24MHZ: FL_CMU_RCHF_WriteTrimValue(RCHF24M_TRIM); break; case FL_CMU_RCHF_FREQUENCY_32MHZ: FL_CMU_RCHF_WriteTrimValue(RCHF32M_TRIM); break; default: FL_CMU_RCHF_WriteTrimValue(RCHF8M_TRIM); break; } FL_CMU_RCHF_SetFrequency(clock); } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : rchf FL_CMU_RCHF_FREQUENCY_8MHZ clock PLL倍频输出频率 |Output parameters : |Return value : |Description : RCHF初始化配置 ----------------------------------------------------------------------------*/ void SelRCHFToPLL(uint32_t rchf, uint32_t clock) { FL_NVIC_ConfigTypeDef InterruptConfigStruct; uint32_t counter = 0; uint32_t readystatus = 0; uint32_t div = FL_CMU_PLL_PSC_DIV8; if(clock > 63) { return; } RCHFInit(rchf); FL_CMU_ClearFlag_SYSCLKSELError(); //清除时钟选择错误标志 FL_CMU_EnableIT_SYSCLKSELError(); //使能时钟选择错误中断 InterruptConfigStruct.preemptPriority = NVIC_PRIORITY_CLK; FL_NVIC_Init(&InterruptConfigStruct, FDET_IRQn); //系统时钟选择错误中断 switch(rchf) { case FL_CMU_RCHF_FREQUENCY_16MHZ: div = FL_CMU_PLL_PSC_DIV16; break; case FL_CMU_RCHF_FREQUENCY_24MHZ: div = FL_CMU_PLL_PSC_DIV24; break; case FL_CMU_RCHF_FREQUENCY_32MHZ: div = FL_CMU_PLL_PSC_DIV32; break; default: break; } if(clock <= 23) { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE); } else if((clock > 23) && (clock <= 47)) { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_1CYCLE); } else { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_2CYCLE); } CMU_PLL_ConfigDomain_SYSTEM(FL_CMU_PLL_CLK_SOURCE_RCHF, div, clock, FL_CMU_PLL_OUTPUT_X1); FL_CMU_PLL_Enable(); do { readystatus = FL_CMU_IsActiveFlag_PLLReady(); counter++; } while((readystatus != 0x1U) && (counter != PLL_TIMEOUT)); FL_CDIF_SetPrescaler(CDIF, FL_CDIF_PSC_DIV8); //CDIF接口访问的最高频率建议不超过8M FL_CMU_SetSystemClockSource(FL_CMU_SYSTEM_CLK_SOURCE_PLL); //系统时钟源选择PLL FL_CMU_SetAHBPrescaler(FL_CMU_AHBCLK_PSC_DIV1); FL_CMU_SetAPBPrescaler(FL_CMU_APBCLK_PSC_DIV1); SystemCoreClockUpdate(); } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : XTHF初始化配置 ----------------------------------------------------------------------------*/ void XTHFInit(void) { FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; FL_NVIC_ConfigTypeDef InterruptConfigStruct; //PC2.3配置成模拟功能,外接XTHF GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3; GPIO_InitStruct.mode = FL_GPIO_MODE_ANALOG; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; GPIO_InitStruct.analogSwitch = FL_DISABLE; (void)FL_GPIO_Init(GPIOC, &GPIO_InitStruct); //使能XTHF FL_CMU_XTHF_Enable(); FL_CMU_XTHF_WriteDriverStrength(0x02); //振荡强度---05 可能合适 10PF, FL_DelayMs(2); #if 1 //晶振停振检测,要开启 FL_CMU_ClearFlag_XTHFFail(); FL_CMU_EnableIT_XTHFFail(); //开启XTHF停振检测中断 InterruptConfigStruct.preemptPriority = NVIC_PRIORITY_CLK; FL_NVIC_Init(&InterruptConfigStruct, FDET_IRQn); #endif SystemCoreClockUpdate(); } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : div 对XTHF参考时钟的分频,目标分频到1M; clock PLL倍频输出频率 |Output parameters : |Return value : |Description : 选择外部XTHF作为锁相环的参考时钟 ----------------------------------------------------------------------------*/ void SelXTHFToPLL(uint32_t div, uint32_t clock) { FL_NVIC_ConfigTypeDef InterruptConfigStruct; uint32_t counter = 0; uint32_t readystatus = 0; if(clock > 63) { return; } XTHFInit(); FL_CMU_ClearFlag_SYSCLKSELError(); //清除时钟选择错误标志 FL_CMU_EnableIT_SYSCLKSELError(); //使能时钟选择错误中断 InterruptConfigStruct.preemptPriority = 0x00; FL_NVIC_Init(&InterruptConfigStruct, FDET_IRQn); //系统时钟选择错误中断 if(clock <= 23) { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE); } else if((clock > 23) && (clock <= 47)) { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_1CYCLE); } else { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_2CYCLE); } CMU_PLL_ConfigDomain_SYSTEM(FL_CMU_PLL_CLK_SOURCE_XTHF, div, clock, FL_CMU_PLL_OUTPUT_X1); FL_CMU_PLL_Enable(); do { readystatus = FL_CMU_IsActiveFlag_PLLReady(); counter++; } while((readystatus != 0x1U) && (counter != PLL_TIMEOUT)); FL_CDIF_SetPrescaler(CDIF, FL_CDIF_PSC_DIV8); //CDIF接口访问的最高频率建议不超过8M FL_CMU_SetSystemClockSource(FL_CMU_SYSTEM_CLK_SOURCE_PLL); FL_CMU_SetAHBPrescaler(FL_CMU_AHBCLK_PSC_DIV1); FL_CMU_SetAPBPrescaler(FL_CMU_APBCLK_PSC_DIV1); SystemCoreClockUpdate(); }