fm33lc0xx_fl_rcc.c 8.8 KB

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