current_v/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_cmu.c
2025-12-31 08:21:43 +08:00

290 lines
7.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
****************************************************************************************************
* @file fm33lg0xx_fl_cmu.c
* @author FMSH Application Team
* @brief Src file of CMU FL Module
****************************************************************************************************
* @attention
*
* Copyright (c) [2021] [Fudan Microelectronics]
* THIS SOFTWARE is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*
****************************************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "fm33lg0xx_fl.h"
/** @addtogroup FM33LG0XX_FL_Driver
* @{
*/
/** @addtogroup CMU
* @{
*/
#ifdef FL_CMU_DRIVER_ENABLED
/* Exported functions --------------------------------------------------------*/
/** @addtogroup CMU_FL_EF_QUERY
* @{
*/
/**
* @brief 获取系统当前工作时钟SYSCLK。
* @param None
* @note 函数中用到了XTHF_VALUE 宏,这个宏应该被定义为外部晶振的输入频率值。
*
* @retval 系统时钟频率 (Hz)。
*
*/
uint32_t FL_CMU_GetSystemClockFreq(void)
{
uint32_t frequency = 0;
/* 获取系统时钟源 */
switch(FL_CMU_GetSystemClockSource())
{
/* 系统时钟源为内部RCHF */
case FL_CMU_SYSTEM_CLK_SOURCE_RCHF:
/* 内部RCHF默认为8MHz ,可以配置为16或24M */
frequency = FL_CMU_GetRCHFClockFreq();
break;
/* 系统时钟源为XTHF */
case FL_CMU_SYSTEM_CLK_SOURCE_XTHF:
frequency = XTHFClock;
break;
/* 系统时钟源为PLL */
case FL_CMU_SYSTEM_CLK_SOURCE_PLL:
frequency = FL_CMU_GetPLLClockFreq();
break;
/* 系统时钟源为内部RCLF */
case FL_CMU_SYSTEM_CLK_SOURCE_RCLF:
/* 根据RC4M的分频配置得出系统时钟 */
frequency = FL_CMU_GetRCLFClockFreq();
break;
/* 系统时钟源为XTLF */
case FL_CMU_SYSTEM_CLK_SOURCE_XTLF:
/* 根据外部晶振的频率得出系统时钟 */
frequency = XTLFClock;
break;
/* 系统时钟源为RCLP */
case FL_CMU_SYSTEM_CLK_SOURCE_RCLP:
frequency = 32768;
break;
default:
frequency = FL_CMU_GetRCHFClockFreq();
break;
}
return frequency;
}
/**
* @brief 获取 AHB 总线时钟频率。
*
* @param SYSCLK_Frequency 系统主时钟频率SYSCLK
*
* @retval AHB 总线时钟频率(Hz)
*
*/
uint32_t FL_CMU_GetAHBClockFreq(void)
{
uint32_t frequency = 0;
/* 获取AHB分频系数AHB源自系统主时钟 */
switch(FL_CMU_GetAHBPrescaler())
{
case FL_CMU_AHBCLK_PSC_DIV1:
frequency = FL_CMU_GetSystemClockFreq();
break;
case FL_CMU_AHBCLK_PSC_DIV2:
frequency = FL_CMU_GetSystemClockFreq() / 2;
break;
case FL_CMU_AHBCLK_PSC_DIV4:
frequency = FL_CMU_GetSystemClockFreq() / 4;
break;
case FL_CMU_AHBCLK_PSC_DIV8:
frequency = FL_CMU_GetSystemClockFreq() / 8;
break;
case FL_CMU_AHBCLK_PSC_DIV16:
frequency = FL_CMU_GetSystemClockFreq() / 16;
break;
default:
frequency = FL_CMU_GetSystemClockFreq();
break;
}
return frequency;
}
/**
* @brief 获取当前系统的APB总线时钟
* @param APB_Frequency APB总线的时钟频率
*
* @retval APB clock frequency (in Hz)
*
*/
uint32_t FL_CMU_GetAPBClockFreq(void)
{
uint32_t frequency = 0;
/* 获取APB1分频系数APB源自AHB */
switch(FL_CMU_GetAPBPrescaler())
{
case FL_CMU_APBCLK_PSC_DIV1:
frequency = FL_CMU_GetAHBClockFreq();
break;
case FL_CMU_APBCLK_PSC_DIV2:
frequency = FL_CMU_GetAHBClockFreq() / 2;
break;
case FL_CMU_APBCLK_PSC_DIV4:
frequency = FL_CMU_GetAHBClockFreq() / 4;
break;
case FL_CMU_APBCLK_PSC_DIV8:
frequency = FL_CMU_GetAHBClockFreq() / 8;
break;
case FL_CMU_APBCLK_PSC_DIV16:
frequency = FL_CMU_GetAHBClockFreq() / 16;
break;
default:
frequency = FL_CMU_GetAHBClockFreq();
break;
}
return frequency;
}
/**
* @brief 获取RCLF输出时钟频率
* @param None
*
* @retval 返回RCLF输出时钟频率(Hz)
*
*/
uint32_t FL_CMU_GetRCLFClockFreq(void)
{
uint32_t frequency = 0;
switch(FL_CMU_RCLF_GetPrescaler())
{
case FL_CMU_RCLF_PSC_DIV1:
frequency = 614400;
break;
case FL_CMU_RCLF_PSC_DIV4:
frequency = 153600;
break;
case FL_CMU_RCLF_PSC_DIV8:
frequency = 76800;
break;
case FL_CMU_RCLF_PSC_DIV16:
frequency = 38400;
break;
default:
frequency = 614400;
break;
}
return frequency;
}
/**
* @brief 获取RCHF输出时钟频率
* @param None
*
* @retval 返回RCHF输出时钟频率(Hz)
*
*/
uint32_t FL_CMU_GetRCHFClockFreq(void)
{
uint32_t frequency = 0;
switch(FL_CMU_RCHF_GetFrequency())
{
case FL_CMU_RCHF_FREQUENCY_8MHZ:
frequency = 8000000;
break;
case FL_CMU_RCHF_FREQUENCY_16MHZ:
frequency = 16000000;
break;
case FL_CMU_RCHF_FREQUENCY_24MHZ:
frequency = 24000000;
break;
case FL_CMU_RCHF_FREQUENCY_32MHZ:
frequency = 32000000;
break;
default:
frequency = 8000000;
break;
}
return frequency;
}
/**
* @brief 获取PLL输出时钟频率
* @param None
*
* @retval 返回PLL输出时钟频率(Hz)
*
*/
uint32_t FL_CMU_GetPLLClockFreq(void)
{
uint32_t frequency = 0;
uint32_t multiplier = 0;
/* 获取PLL时钟源 */
switch(FL_CMU_PLL_GetClockSource())
{
case FL_CMU_PLL_CLK_SOURCE_RCHF:
/* 获取RCHF配置主频 */
frequency = FL_CMU_GetRCHFClockFreq();
break;
case FL_CMU_PLL_CLK_SOURCE_XTHF:
frequency = XTHFClock;
break;
default:
frequency = FL_CMU_GetRCHFClockFreq();
break;
}
/* 获取PLL时钟分频系数 */
switch(FL_CMU_PLL_GetPrescaler())
{
case FL_CMU_PLL_PSC_DIV1:
break;
case FL_CMU_PLL_PSC_DIV2:
frequency /= 2;
break;
case FL_CMU_PLL_PSC_DIV4:
frequency /= 4;
break;
case FL_CMU_PLL_PSC_DIV8:
frequency /= 8;
break;
case FL_CMU_PLL_PSC_DIV12:
frequency /= 12;
break;
case FL_CMU_PLL_PSC_DIV16:
frequency /= 16;
break;
case FL_CMU_PLL_PSC_DIV24:
frequency /= 24;
break;
case FL_CMU_PLL_PSC_DIV32:
frequency /= 32;
break;
default:
break;
}
multiplier = FL_CMU_PLL_ReadMultiplier() + 1;
frequency *= multiplier;
return frequency;
}
/**
* @}
*/
#endif /* FL_CMU_DRIVER_ENABLED */
/**
* @}
*/
/**
* @}
*/
/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/