Rcu.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*********************************************************************************************************
  2. * 模块名称:RCU.c
  3. * 摘 要:RCU模块,包含各种时钟的配置
  4. * 当前版本:1.0.0
  5. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. * 完成日期:2021年07月01日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "Rcu.h"
  20. #include "gd32e230x_conf.h"
  21. /*********************************************************************************************************
  22. * 宏定义
  23. *********************************************************************************************************/
  24. /*********************************************************************************************************
  25. * 枚举结构体
  26. *********************************************************************************************************/
  27. /*********************************************************************************************************
  28. * 内部变量定义
  29. *********************************************************************************************************/
  30. unsigned int CLK_SYS;
  31. unsigned int CLK_AHB;
  32. unsigned int CLK_APB1;
  33. unsigned int CLK_APB2;
  34. /*********************************************************************************************************
  35. * 内部函数声明
  36. *********************************************************************************************************/
  37. static void ConfigRCU(void); //配置RCU
  38. /*********************************************************************************************************
  39. * 内部函数实现
  40. *********************************************************************************************************/
  41. /*********************************************************************************************************
  42. * 函数名称:ConfigRCU
  43. * 函数功能:配置RCU
  44. * 输入参数:void
  45. * 输出参数:void
  46. * 返 回 值:void
  47. * 创建日期:2021年07月01日
  48. * 注 意:配置的时钟如下:
  49. * (1)PLLCLK(PLL时钟) = 72MHz
  50. * (2)SYSCLK(系统时钟) = 72MHz
  51. * (3)HCLK(AHB总线时钟) = 72MHz
  52. * (4)PCLK1(APB1总线时钟)= 36MHz
  53. * (5)PCLK2(APB2总线时钟)= 72MHz
  54. *********************************************************************************************************/
  55. static void ConfigRCU(void)
  56. {
  57. ErrStatus HXTALStartUpStatus;
  58. rcu_deinit(); //RCU配置恢复默认值
  59. rcu_osci_on(RCU_HXTAL); //使能外部高速晶振
  60. HXTALStartUpStatus = rcu_osci_stab_wait(RCU_HXTAL); //等待外部晶振稳定
  61. if(HXTALStartUpStatus == SUCCESS) //外部晶振已经稳定
  62. {
  63. fmc_wscnt_set(WS_WSCNT_1);
  64. rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1); //设置高速AHB时钟(HCLK) = SYSCLK
  65. rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1); //设置高速APB2时钟(PCLK2) = AHB
  66. rcu_apb1_clock_config(RCU_APB1_CKAHB_DIV2); //设置低速APB1时钟(PCLK1) = AHB/2
  67. //设置锁相环PLL = HXTAL / 2 * 18 = 72 MHz
  68. rcu_hxtal_prediv_config(RCU_PLL_PREDV1);
  69. rcu_pll_config(RCU_PLLSRC_HXTAL, RCU_PLL_MUL9);
  70. rcu_osci_on(RCU_PLL_CK);
  71. //等待锁相环稳定
  72. while(0U == rcu_flag_get(RCU_FLAG_PLLSTB))
  73. {
  74. }
  75. //选择PLL作为系统时钟
  76. rcu_system_clock_source_config(RCU_CKSYSSRC_PLL);
  77. //等待PLL成功用于系统时钟
  78. while(0U == rcu_system_clock_source_get())
  79. {
  80. }
  81. }
  82. }
  83. /*********************************************************************************************************
  84. * API函数实现
  85. *********************************************************************************************************/
  86. /*********************************************************************************************************
  87. * 函数名称:InitRCU
  88. * 函数功能:初始化RCU模块
  89. * 输入参数:void
  90. * 输出参数:void
  91. * 返 回 值:void
  92. * 创建日期:2021年07月01日
  93. * 注 意:
  94. *********************************************************************************************************/
  95. void InitRCU(void)
  96. {
  97. ConfigRCU(); //配置RCU
  98. }
  99. /*********************************************************************************************************
  100. * 函数名称:ViewRcuClock
  101. * 函数功能:查看各个时钟频率
  102. * 输入参数:void
  103. * 输出参数:void
  104. * 返 回 值:void
  105. * 创建日期:2021年07月01日
  106. * 注 意:
  107. *********************************************************************************************************/
  108. void ViewRcuClock(void)
  109. {
  110. CLK_SYS=rcu_clock_freq_get(CK_SYS); //读取系统时钟频率
  111. CLK_AHB=rcu_clock_freq_get(CK_AHB); //读取系统时钟频率
  112. CLK_APB1=rcu_clock_freq_get(CK_APB1); //读取系统时钟频率
  113. CLK_APB2=rcu_clock_freq_get(CK_APB2); //读取系统时钟频率
  114. }