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)43 uint32_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)63 uint32_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)116 uint32_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)150 uint32_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)183 uint32_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)216 uint32_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)245 uint32_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)271 uint32_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