| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- /**
- ****************************************************************************************************
- * @file fm33lC0xx_fl_rcc.c
- * @author FMSH Application Team
- * @brief Src file of RCC FL Module
- ****************************************************************************************************
- * @attention
- *
- * Copyright (c) [2019] [Fudan Microelectronics]
- * THIS SOFTWARE is licensed under the Mulan PSL v1.
- * can use this software according to the terms and conditions of the Mulan PSL v1.
- * You may obtain a copy of Mulan PSL v1 at:
- * http://license.coscl.org.cn/MulanPSL
- * 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 v1 for more details.
- *
- ****************************************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "system_fm33lc0xx.h"
- #include "fm33lc0xx_fl_rcc.h"
- #include "fm33_assert.h"
- /** @addtogroup FM33LC0XX_FL_Driver
- * @{
- */
- /** @addtogroup RCC
- * @{
- */
- /** @addtogroup RCC_FL_EF_Operation
- * @{
- */
- /**
- * @brief 获取USB提供给系统总线时钟的频率
- *
- * @retval USB提供给SYSCLK的时钟频率(Hz)
- */
- uint32_t FL_RCC_GetUSBClockFreqToSysclk(void)
- {
- if(FL_RCC_GetUSBClockSource() == FL_RCC_USB_CLOCK_SELECT_48M)
- {
- return 48000000;
- }
- else
- {
- return 60000000;
- }
- }
- /**
- * @brief 获取系统当前工作时钟SYSCLK
- *
- * @note 函数中用到了 @ref XTHF_VALUE 宏,这个宏应该被定义为外部晶振的输入频率值
- *
- * @retval 系统时钟频率(Hz)
- *
- */
- uint32_t FL_RCC_GetSystemClockFreq(void)
- {
- uint32_t frequency = 0;
- /* 获取系统时钟源 */
- switch(FL_RCC_GetSystemClockSource())
- {
- /* 系统时钟源为内部RCHF */
- case FL_RCC_SYSTEM_CLK_SOURCE_RCHF:
- /* 内部RCHF默认为8MHz ,可以配置为16或24M */
- frequency = FL_RCC_GetRCHFClockFreq();
- break;
- /* 系统时钟源为XTHF */
- case FL_RCC_SYSTEM_CLK_SOURCE_XTHF:
- frequency = XTHF_VALUE;
- break;
- /* 系统时钟源为PLL */
- case FL_RCC_SYSTEM_CLK_SOURCE_PLL:
- frequency = FL_RCC_GetPLLClockFreq();
- break;
- /* 系统时钟源为内部RCMF */
- case FL_RCC_SYSTEM_CLK_SOURCE_RCMFPSC:
- /* 根据RC4M的分频配置得出系统时钟 */
- frequency = FL_RCC_GetRC4MClockFreq();
- break;
- /* 系统时钟源为XTLF */
- case FL_RCC_SYSTEM_CLK_SOURCE_XTLF:
- /* 根据外部晶振的频率得出系统时钟 */
- frequency = XTLF_VALUE;
- break;
- case FL_RCC_SYSTEM_CLK_SOURCE_USBCLK:
- /* USB时钟频率获取*/
- frequency = FL_RCC_GetUSBClockFreqToSysclk();
- break;
- /* 系统时钟源为RCLP */
- case FL_RCC_SYSTEM_CLK_SOURCE_RCLP:
- frequency = 32000;
- break;
- default:
- frequency = FL_RCC_GetRCHFClockFreq();
- break;
- }
- return frequency;
- }
- /**
- * @brief 获取AHB总线时钟频率
- *
- * @retval AHB总线时钟频率(Hz)
- *
- */
- uint32_t FL_RCC_GetAHBClockFreq(void)
- {
- uint32_t frequency = 0;
- /* 获取AHB分频系数,AHB源自系统主时钟 */
- switch(FL_RCC_GetAHBPrescaler())
- {
- case FL_RCC_AHBCLK_PSC_DIV1:
- frequency = FL_RCC_GetSystemClockFreq();
- break;
- case FL_RCC_AHBCLK_PSC_DIV2:
- frequency = FL_RCC_GetSystemClockFreq() / 2;
- break;
- case FL_RCC_AHBCLK_PSC_DIV4:
- frequency = FL_RCC_GetSystemClockFreq() / 4;
- break;
- case FL_RCC_AHBCLK_PSC_DIV8:
- frequency = FL_RCC_GetSystemClockFreq() / 8;
- break;
- case FL_RCC_AHBCLK_PSC_DIV16:
- frequency = FL_RCC_GetSystemClockFreq() / 16;
- break;
- default:
- frequency = FL_RCC_GetSystemClockFreq();
- break;
- }
- return frequency;
- }
- /**
- * @brief 获取当前系统的APB1总线时钟
- *
- * @retval APB1总线时钟频率(Hz)
- *
- */
- uint32_t FL_RCC_GetAPB1ClockFreq(void)
- {
- uint32_t frequency = 0;
- /* 获取APB1分频系数,APB源自AHB */
- switch(FL_RCC_GetAPB1Prescaler())
- {
- case FL_RCC_APB1CLK_PSC_DIV1:
- frequency = FL_RCC_GetAHBClockFreq();
- break;
- case FL_RCC_APB1CLK_PSC_DIV2:
- frequency = FL_RCC_GetAHBClockFreq() / 2;
- break;
- case FL_RCC_APB1CLK_PSC_DIV4:
- frequency = FL_RCC_GetAHBClockFreq() / 4;
- break;
- case FL_RCC_APB1CLK_PSC_DIV8:
- frequency = FL_RCC_GetAHBClockFreq() / 8;
- break;
- case FL_RCC_APB1CLK_PSC_DIV16:
- frequency = FL_RCC_GetAHBClockFreq() / 16;
- break;
- default:
- frequency = FL_RCC_GetAHBClockFreq();
- break;
- }
- return frequency;
- }
- /**
- * @brief 获取当前系统的APB2总线时钟
- *
- * @retval APB2总线时钟频率(Hz)
- *
- */
- uint32_t FL_RCC_GetAPB2ClockFreq(void)
- {
- uint32_t frequency = 0;
- /* 获取APB2分频系数,APB源自AHB */
- switch(FL_RCC_GetAPB2Prescaler())
- {
- case FL_RCC_APB2CLK_PSC_DIV1:
- frequency = FL_RCC_GetAHBClockFreq();
- break;
- case FL_RCC_APB2CLK_PSC_DIV2:
- frequency = FL_RCC_GetAHBClockFreq() / 2;
- break;
- case FL_RCC_APB2CLK_PSC_DIV4:
- frequency = FL_RCC_GetAHBClockFreq() / 4;
- break;
- case FL_RCC_APB2CLK_PSC_DIV8:
- frequency = FL_RCC_GetAHBClockFreq() / 8;
- break;
- case FL_RCC_APB2CLK_PSC_DIV16:
- frequency = FL_RCC_GetAHBClockFreq() / 16;
- break;
- default:
- frequency = FL_RCC_GetAHBClockFreq();
- break;
- }
- return frequency;
- }
- /**
- * @brief 获取RC4M输出时钟频率
- *
- * @retval RC4M输出时钟频率(Hz)
- *
- */
- uint32_t FL_RCC_GetRC4MClockFreq(void)
- {
- uint32_t frequency = 0;
- switch(FL_RCC_RCMF_GetPrescaler())
- {
- case FL_RCC_RCMF_PSC_DIV1:
- frequency = 4000000;
- break;
- case FL_RCC_RCMF_PSC_DIV4:
- frequency = 1000000;
- break;
- case FL_RCC_RCMF_PSC_DIV8:
- frequency = 500000;
- break;
- case FL_RCC_RCMF_PSC_DIV16:
- frequency = 250000;
- break;
- default:
- frequency = 4000000;
- break;
- }
- return frequency;
- }
- /**
- * @brief 获取RCHF输出时钟频率
- *
- * @retval 返回RCHF输出时钟频率(Hz)
- *
- */
- uint32_t FL_RCC_GetRCHFClockFreq(void)
- {
- uint32_t frequency = 0;
- switch(FL_RCC_RCHF_GetFrequency())
- {
- case FL_RCC_RCHF_FREQUENCY_8MHZ:
- frequency = 8000000;
- break;
- case FL_RCC_RCHF_FREQUENCY_16MHZ:
- frequency = 16000000;
- break;
- case FL_RCC_RCHF_FREQUENCY_24MHZ:
- frequency = 24000000;
- break;
- default:
- frequency = 8000000;
- break;
- }
- return frequency;
- }
- /**
- * @brief 获取PLL输出时钟频率
- *
- * @retval 返回PLL输出时钟频率(Hz)
- *
- */
- uint32_t FL_RCC_GetPLLClockFreq(void)
- {
- uint32_t frequency = 0;
- uint32_t multiplier = 0;
- /* 获取PLL时钟源 */
- switch(FL_RCC_PLL_GetClockSource())
- {
- case FL_RCC_PLL_CLK_SOURCE_RCHF:
- /* 获取RCHF配置主频 */
- frequency = FL_RCC_GetRCHFClockFreq();
- break;
- case FL_RCC_PLL_CLK_SOURCE_XTHF:
- frequency = XTHF_VALUE;
- break;
- default:
- frequency = FL_RCC_GetRCHFClockFreq();
- break;
- }
- /* 获取PLL时钟分频系数 */
- switch(FL_RCC_PLL_GetPrescaler())
- {
- case FL_RCC_PLL_PSC_DIV1:
- break;
- case FL_RCC_PLL_PSC_DIV2:
- frequency /= 2;
- break;
- case FL_RCC_PLL_PSC_DIV4:
- frequency /= 4;
- break;
- case FL_RCC_PLL_PSC_DIV8:
- frequency /= 8;
- break;
- case FL_RCC_PLL_PSC_DIV12:
- frequency /= 12;
- break;
- case FL_RCC_PLL_PSC_DIV16:
- frequency /= 16;
- break;
- case FL_RCC_PLL_PSC_DIV24:
- frequency /= 24;
- break;
- case FL_RCC_PLL_PSC_DIV32:
- frequency /= 32;
- break;
- default:
- break;
- }
- multiplier = FL_RCC_PLL_ReadMultiplier() + 1;
- frequency *= multiplier;
- return frequency;
- }
- /**
- * @}
- */
- /**
- * @}
- */
- /**
- * @}
- */
- /******************************************* END OF FILE *******************************************/
|