1 /** 2 **************************************************************************************************** 3 * @file fm33lc0xx_fl_rcc.c 4 * @author FMSH Application Team 5 * @brief Src file of RCC FL Module 6 **************************************************************************************************** 7 * @attention 8 * 9 * Copyright (c) [2021] [Fudan Microelectronics] 10 * THIS SOFTWARE is licensed under Mulan PSL v2. 11 * You can use this software according to the terms and conditions of the Mulan PSL v2. 12 * You may obtain a copy of Mulan PSL v2 at: 13 * http://license.coscl.org.cn/MulanPSL2 14 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 15 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 16 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 17 * See the Mulan PSL v2 for more details. 18 * 19 **************************************************************************************************** 20 */ 21 /* Includes ------------------------------------------------------------------*/ 22 #include "fm33lc0xx_fl.h" 23 24 /** @addtogroup FM33LC0XX_FL_Driver 25 * @{ 26 */ 27 28 /** @addtogroup RCC 29 * @{ 30 */ 31 32 #ifdef FL_RCC_DRIVER_ENABLED 33 34 /** @addtogroup RCC_FL_EF_Operation 35 * @{ 36 */ 37 38 /** 39 * @brief 获取USB提供给系统总线时钟的频率 40 * 41 * @retval USB提供给SYSCLK的时钟频率(Hz) 42 */ FL_RCC_GetUSBClockFreqToSysclk(void)43uint32_t FL_RCC_GetUSBClockFreqToSysclk(void) 44 { 45 if(FL_RCC_GetUSBClockOutput() == FL_RCC_USB_CLK_OUT_48M) 46 { 47 return 48000000; 48 } 49 else 50 { 51 return 60000000; 52 } 53 } 54 55 /** 56 * @brief 获取系统当前工作时钟SYSCLK 57 * 58 * @note 函数中用到了 @ref XTHF_VALUE 宏,这个宏应该被定义为外部晶振的输入频率值 59 * 60 * @retval 系统时钟频率(Hz) 61 * 62 */ FL_RCC_GetSystemClockFreq(void)63uint32_t FL_RCC_GetSystemClockFreq(void) 64 { 65 uint32_t frequency = 0; 66 /* 获取系统时钟源 */ 67 switch(FL_RCC_GetSystemClockSource()) 68 { 69 /* 系统时钟源为内部RCHF */ 70 case FL_RCC_SYSTEM_CLK_SOURCE_RCHF: 71 /* 内部RCHF默认为8MHz ,可以配置为16或24M */ 72 frequency = FL_RCC_GetRCHFClockFreq(); 73 break; 74 /* 系统时钟源为XTHF */ 75 case FL_RCC_SYSTEM_CLK_SOURCE_XTHF: 76 frequency = XTHFClock; 77 break; 78 /* 系统时钟源为PLL */ 79 case FL_RCC_SYSTEM_CLK_SOURCE_PLL: 80 frequency = FL_RCC_GetPLLClockFreq(); 81 break; 82 /* 系统时钟源为内部RCMF */ 83 case FL_RCC_SYSTEM_CLK_SOURCE_RCMF_PSC: 84 /* 根据RCMF的分频配置得出系统时钟 */ 85 frequency = FL_RCC_GetRCMFClockFreq(); 86 break; 87 /* 系统时钟源为LSCLK */ 88 case FL_RCC_SYSTEM_CLK_SOURCE_LSCLK: 89 #ifdef USE_LSCLK_CLOCK_SRC_LPOSC 90 frequency = 32000; 91 #else 92 frequency = XTLFClock; 93 #endif 94 break; 95 /* 系统时钟源为USB BCK */ 96 case FL_RCC_SYSTEM_CLK_SOURCE_USBCLK: 97 /* USB时钟频率获取 */ 98 frequency = FL_RCC_GetUSBClockFreqToSysclk(); 99 break; 100 /* 系统时钟源为LPOSC */ 101 case FL_RCC_SYSTEM_CLK_SOURCE_LPOSC: 102 frequency = 32000; 103 break; 104 default: 105 frequency = FL_RCC_GetRCHFClockFreq(); 106 break; 107 } 108 return frequency; 109 } 110 /** 111 * @brief 获取AHB总线时钟频率 112 * 113 * @retval AHB总线时钟频率(Hz) 114 * 115 */ FL_RCC_GetAHBClockFreq(void)116uint32_t FL_RCC_GetAHBClockFreq(void) 117 { 118 uint32_t frequency = 0; 119 /* 获取AHB分频系数,AHB源自系统主时钟 */ 120 switch(FL_RCC_GetAHBPrescaler()) 121 { 122 case FL_RCC_AHBCLK_PSC_DIV1: 123 frequency = FL_RCC_GetSystemClockFreq(); 124 break; 125 case FL_RCC_AHBCLK_PSC_DIV2: 126 frequency = FL_RCC_GetSystemClockFreq() / 2; 127 break; 128 case FL_RCC_AHBCLK_PSC_DIV4: 129 frequency = FL_RCC_GetSystemClockFreq() / 4; 130 break; 131 case FL_RCC_AHBCLK_PSC_DIV8: 132 frequency = FL_RCC_GetSystemClockFreq() / 8; 133 break; 134 case FL_RCC_AHBCLK_PSC_DIV16: 135 frequency = FL_RCC_GetSystemClockFreq() / 16; 136 break; 137 default: 138 frequency = FL_RCC_GetSystemClockFreq(); 139 break; 140 } 141 return frequency; 142 } 143 144 /** 145 * @brief 获取当前系统的APB1总线时钟 146 * 147 * @retval APB1总线时钟频率(Hz) 148 * 149 */ FL_RCC_GetAPB1ClockFreq(void)150uint32_t FL_RCC_GetAPB1ClockFreq(void) 151 { 152 uint32_t frequency = 0; 153 /* 获取APB1分频系数,APB源自AHB */ 154 switch(FL_RCC_GetAPB1Prescaler()) 155 { 156 case FL_RCC_APB1CLK_PSC_DIV1: 157 frequency = FL_RCC_GetAHBClockFreq(); 158 break; 159 case FL_RCC_APB1CLK_PSC_DIV2: 160 frequency = FL_RCC_GetAHBClockFreq() / 2; 161 break; 162 case FL_RCC_APB1CLK_PSC_DIV4: 163 frequency = FL_RCC_GetAHBClockFreq() / 4; 164 break; 165 case FL_RCC_APB1CLK_PSC_DIV8: 166 frequency = FL_RCC_GetAHBClockFreq() / 8; 167 break; 168 case FL_RCC_APB1CLK_PSC_DIV16: 169 frequency = FL_RCC_GetAHBClockFreq() / 16; 170 break; 171 default: 172 frequency = FL_RCC_GetAHBClockFreq(); 173 break; 174 } 175 return frequency; 176 } 177 /** 178 * @brief 获取当前系统的APB2总线时钟 179 * 180 * @retval APB2总线时钟频率(Hz) 181 * 182 */ FL_RCC_GetAPB2ClockFreq(void)183uint32_t FL_RCC_GetAPB2ClockFreq(void) 184 { 185 uint32_t frequency = 0; 186 /* 获取APB2分频系数,APB源自AHB */ 187 switch(FL_RCC_GetAPB2Prescaler()) 188 { 189 case FL_RCC_APB2CLK_PSC_DIV1: 190 frequency = FL_RCC_GetAHBClockFreq(); 191 break; 192 case FL_RCC_APB2CLK_PSC_DIV2: 193 frequency = FL_RCC_GetAHBClockFreq() / 2; 194 break; 195 case FL_RCC_APB2CLK_PSC_DIV4: 196 frequency = FL_RCC_GetAHBClockFreq() / 4; 197 break; 198 case FL_RCC_APB2CLK_PSC_DIV8: 199 frequency = FL_RCC_GetAHBClockFreq() / 8; 200 break; 201 case FL_RCC_APB2CLK_PSC_DIV16: 202 frequency = FL_RCC_GetAHBClockFreq() / 16; 203 break; 204 default: 205 frequency = FL_RCC_GetAHBClockFreq(); 206 break; 207 } 208 return frequency; 209 } 210 /** 211 * @brief 获取RCMF输出时钟频率 212 * 213 * @retval RCMF输出时钟频率(Hz) 214 * 215 */ FL_RCC_GetRCMFClockFreq(void)216uint32_t FL_RCC_GetRCMFClockFreq(void) 217 { 218 uint32_t frequency = 0; 219 switch(FL_RCC_RCMF_GetPrescaler()) 220 { 221 case FL_RCC_RCMF_PSC_DIV1: 222 frequency = 4000000; 223 break; 224 case FL_RCC_RCMF_PSC_DIV4: 225 frequency = 1000000; 226 break; 227 case FL_RCC_RCMF_PSC_DIV8: 228 frequency = 500000; 229 break; 230 case FL_RCC_RCMF_PSC_DIV16: 231 frequency = 250000; 232 break; 233 default: 234 frequency = 4000000; 235 break; 236 } 237 return frequency; 238 } 239 /** 240 * @brief 获取RCHF输出时钟频率 241 * 242 * @retval 返回RCHF输出时钟频率(Hz) 243 * 244 */ FL_RCC_GetRCHFClockFreq(void)245uint32_t FL_RCC_GetRCHFClockFreq(void) 246 { 247 uint32_t frequency = 0; 248 switch(FL_RCC_RCHF_GetFrequency()) 249 { 250 case FL_RCC_RCHF_FREQUENCY_8MHZ: 251 frequency = 8000000; 252 break; 253 case FL_RCC_RCHF_FREQUENCY_16MHZ: 254 frequency = 16000000; 255 break; 256 case FL_RCC_RCHF_FREQUENCY_24MHZ: 257 frequency = 24000000; 258 break; 259 default: 260 frequency = 8000000; 261 break; 262 } 263 return frequency; 264 } 265 /** 266 * @brief 获取PLL输出时钟频率 267 * 268 * @retval 返回PLL输出时钟频率(Hz) 269 * 270 */ FL_RCC_GetPLLClockFreq(void)271uint32_t FL_RCC_GetPLLClockFreq(void) 272 { 273 uint32_t frequency = 0; 274 uint32_t multiplier = 0; 275 /* 获取PLL时钟源 */ 276 switch(FL_RCC_PLL_GetClockSource()) 277 { 278 case FL_RCC_PLL_CLK_SOURCE_RCHF: 279 /* 获取RCHF配置主频 */ 280 frequency = FL_RCC_GetRCHFClockFreq(); 281 break; 282 case FL_RCC_PLL_CLK_SOURCE_XTHF: 283 frequency = XTHFClock; 284 break; 285 default: 286 frequency = FL_RCC_GetRCHFClockFreq(); 287 break; 288 } 289 /* 获取PLL时钟分频系数 */ 290 switch(FL_RCC_PLL_GetPrescaler()) 291 { 292 case FL_RCC_PLL_PSC_DIV1: 293 break; 294 case FL_RCC_PLL_PSC_DIV2: 295 frequency /= 2; 296 break; 297 case FL_RCC_PLL_PSC_DIV4: 298 frequency /= 4; 299 break; 300 case FL_RCC_PLL_PSC_DIV8: 301 frequency /= 8; 302 break; 303 case FL_RCC_PLL_PSC_DIV12: 304 frequency /= 12; 305 break; 306 case FL_RCC_PLL_PSC_DIV16: 307 frequency /= 16; 308 break; 309 case FL_RCC_PLL_PSC_DIV24: 310 frequency /= 24; 311 break; 312 case FL_RCC_PLL_PSC_DIV32: 313 frequency /= 32; 314 break; 315 default: 316 break; 317 } 318 multiplier = FL_RCC_PLL_ReadMultiplier() + 1; 319 frequency *= multiplier; 320 return frequency; 321 } 322 323 /** 324 * @} 325 */ 326 327 #endif /* FL_RCC_DRIVER_ENABLED */ 328 329 /** 330 * @} 331 */ 332 333 /** 334 * @} 335 */ 336 337 /********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ 338