system_gd32f1xx.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131
  1. /**
  2. ******************************************************************************
  3. * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File.
  4. ******************************************************************************
  5. */
  6. /** @addtogroup CMSIS
  7. * @{
  8. */
  9. /** @addtogroup GD32f10x_system
  10. * @{
  11. */
  12. /** @addtogroup GD32f10x_System_Private_Includes
  13. * @{
  14. */
  15. #include "gd32f10x.h"
  16. /**
  17. * @}
  18. */
  19. /** @addtogroup GD32f10x_System_Private_Variables
  20. * @{
  21. */
  22. /* Uncomment the corresponding line to configure system clock that you need */
  23. /* The clock is from HSE oscillator clock */
  24. //#define SYSCLK_FREQ_HSE HSE_VALUE
  25. //#define SYSCLK_FREQ_24MHz 24000000
  26. //#define SYSCLK_FREQ_36MHz 36000000
  27. //#define SYSCLK_FREQ_48MHz 48000000
  28. //#define SYSCLK_FREQ_56MHz 56000000
  29. //#define SYSCLK_FREQ_72MHz 72000000
  30. //#define SYSCLK_FREQ_96MHz 96000000
  31. #define SYSCLK_FREQ_108MHz 108000000
  32. /* Uncomment the corresponding line to configure system clock that you need */
  33. /* The clock is from HSI oscillator clock */
  34. //#define SYSCLK_FREQ_48MHz_HSI 48000000
  35. //#define SYSCLK_FREQ_72MHz_HSI 72000000
  36. //#define SYSCLK_FREQ_108MHz_HSI 108000000
  37. /* ---------------------- RCC registers mask -------------------------------- */
  38. /* RCC GCCR_HSIEN mask */
  39. #define SYS_GCCR_HSIEN_SET ((uint32_t)0x00000001)
  40. /* RCC GCFGR_Reset mask */
  41. #define SYS_GCFGR_RESET_CL ((uint32_t)0xE0FF0000)
  42. #define SYS_GCFGR_RESET ((uint32_t)0xE8FF0000)
  43. /* RCC GCCR_HSEEN_CKMEN_PLLEN masks */
  44. #define SYS_GCCR_HSEEN_CKMEN_PLLEN_RESET ((uint32_t)0xFEF6FFFF)
  45. /* RCC GCCR_HSEBPS mask */
  46. #define SYS_GCCR_HSEBPS_RESET ((uint32_t)0xFFFBFFFF)
  47. /* RCC GCFGR_PLLSEL_PLLPREDV_PLLMF masks */
  48. #define SYS_GCFGR_PLLSEL_PLLPREDV_PLLMF_USBPS_RESET ((uint32_t)0xF700FFFF)
  49. #define SYS_GCFGR_PLLSEL_PLLPREDV_PLLMF_USBPS_RESET_CL ((uint32_t)0xDF00FFFF)
  50. /* RCC GCCR_PLL2EN_PLL3EN masks */
  51. #define SYS_GCCR_PLL2EN_PLL3EN_RESET ((uint32_t)0xEBFFFFFF)
  52. /* RCC GCFGR2 reset */
  53. #define SYS_GCFGR2_RESET ((uint32_t)0x00000000)
  54. /* RCC GCIR_INT ans FLAG masks */
  55. #define SYS_GCIR_INT_FLAG_RESET ((uint32_t)0x009F0000)
  56. #define SYS_GCIR_INT_FLAG_RESET_CL ((uint32_t)0x00FF0000)
  57. #define SYS_GCCR_HSEEN_HSEBPS_RESET ((uint32_t)0xFFF8FFFF)
  58. /* RCC GCCR_HSIADJ masks */
  59. #define SYS_GCCR_HSIADJ_OFFSET ((uint32_t)0x00000003)
  60. #define SYS_RCC_GCFGR_PLLMF_3_0 ((uint32_t)0x003C0000) /*!< PLLMF[3:0] Bits */
  61. /* RCC HSI clock divided by 2 masks */
  62. #define SYS_HSI_CLOCK_DIVIDED_2 ((uint32_t)0x00000001)
  63. /**
  64. * @}
  65. */
  66. /** @addtogroup GD32F10x_System_Private_Variables
  67. * @{
  68. */
  69. /*******************************************************************************
  70. * System Clock Select
  71. *******************************************************************************/
  72. #ifdef SYSCLK_FREQ_HSE
  73. uint32_t SystemCoreClock = SYSCLK_FREQ_HSE;
  74. #elif defined SYSCLK_FREQ_24MHz
  75. uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz;
  76. #elif defined SYSCLK_FREQ_36MHz
  77. uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz;
  78. #elif defined SYSCLK_FREQ_48MHz
  79. uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz;
  80. #elif defined SYSCLK_FREQ_56MHz
  81. uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz;
  82. #elif defined SYSCLK_FREQ_72MHz
  83. uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;
  84. #elif defined SYSCLK_FREQ_96MHz
  85. uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz;
  86. #elif defined SYSCLK_FREQ_108MHz
  87. uint32_t SystemCoreClock = SYSCLK_FREQ_108MHz;
  88. #elif defined SYSCLK_FREQ_48MHz_HSI
  89. uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz_HSI;
  90. #elif defined SYSCLK_FREQ_72MHz_HSI
  91. uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz_HSI;
  92. #elif defined SYSCLK_FREQ_108MHz_HSI
  93. uint32_t SystemCoreClock = SYSCLK_FREQ_108MHz_HSI;
  94. #else /*!< HSI Selected as System Clock source */
  95. uint32_t SystemCoreClock = HSI_VALUE; /*!< System Clock Frequency (Core Clock) */
  96. #endif
  97. __I uint8_t AHBPrescTableList[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  98. /**
  99. * @}
  100. */
  101. /** @addtogroup GD32f10x_System_Private_FunctionPrototypes
  102. * @{
  103. */
  104. static void SetSysClock(void);
  105. #ifdef SYSCLK_FREQ_HSE
  106. static void SetSysClockToHSE(void);
  107. #elif defined SYSCLK_FREQ_24MHz
  108. static void SetSysClockTo24(void);
  109. #elif defined SYSCLK_FREQ_36MHz
  110. static void SetSysClockTo36(void);
  111. #elif defined SYSCLK_FREQ_48MHz
  112. static void SetSysClockTo48(void);
  113. #elif defined SYSCLK_FREQ_56MHz
  114. static void SetSysClockTo56(void);
  115. #elif defined SYSCLK_FREQ_72MHz
  116. static void SetSysClockTo72(void);
  117. #elif defined SYSCLK_FREQ_96MHz
  118. static void SetSysClockTo96(void);
  119. #elif defined SYSCLK_FREQ_108MHz
  120. static void SetSysClockTo108(void);
  121. #elif defined SYSCLK_FREQ_48MHz_HSI
  122. static void SetSysClockTo48HSI(void);
  123. #elif defined SYSCLK_FREQ_72MHz_HSI
  124. static void SetSysClockTo72HSI(void);
  125. #elif defined SYSCLK_FREQ_108MHz_HSI
  126. static void SetSysClockTo108HSI(void);
  127. #endif
  128. /**
  129. * @}
  130. */
  131. /** @addtogroup GD32f10x_System_Private_Functions
  132. * @{
  133. */
  134. /**
  135. * @brief Initialize the Embedded Flash Interface, the PLL and set the
  136. * SystemCoreClock variable.
  137. * @param None
  138. * @retval None
  139. */
  140. void SystemInit(void)
  141. {
  142. /* Set RCC GCCR_HSIEN mask */
  143. RCC->GCCR |= SYS_GCCR_HSIEN_SET;
  144. /* Reset SCS[1:0], AHBPS[3:0], APB1PS[2:0],APB2PS[2:0], ADCPS[2:0],CKOTUSEL[2:0] bits */
  145. #ifdef GD32F10X_CL
  146. RCC->GCFGR &= SYS_GCFGR_RESET_CL;
  147. #else
  148. RCC->GCFGR &= SYS_GCFGR_RESET;
  149. #endif /* GD32F10X_CL */
  150. /* Reset HSEEN, CKMEN and PLLEN bits */
  151. RCC->GCCR &= SYS_GCCR_HSEEN_CKMEN_PLLEN_RESET;
  152. /* Reset HSEBPS bit */
  153. RCC->GCCR &= SYS_GCCR_HSEBPS_RESET;
  154. /* Reset PLLSEL, PLLPREDV and PLLMF[4:0] USBPS/OTGPS bits */
  155. #ifdef GD32F10X_CL
  156. RCC->GCFGR &= SYS_GCFGR_PLLSEL_PLLPREDV_PLLMF_USBPS_RESET_CL;
  157. #else
  158. RCC->GCFGR &= SYS_GCFGR_PLLSEL_PLLPREDV_PLLMF_USBPS_RESET;
  159. #endif /* GD32F10X_CL */
  160. #ifdef GD32F10X_CL
  161. /* Reset PLL2EN and PLL3EN bits */
  162. RCC->GCCR &= SYS_GCCR_PLL2EN_PLL3EN_RESET;
  163. /* Reset GCFGR2 register */
  164. RCC->GCFGR2 = SYS_GCFGR2_RESET ;
  165. /* Disable all interrupts and clear flag bits */
  166. RCC->GCIR = SYS_GCIR_INT_FLAG_RESET_CL;
  167. #else
  168. /* Disable all interrupts and clear flag bits */
  169. RCC->GCIR = SYS_GCIR_INT_FLAG_RESET;
  170. #endif /* GD32F10X_CL */
  171. /* Configure the System clock frequency, AHB, APB2 and APB1 prescalers */
  172. /* Configure the Flash Latency cycles and enable prefetch buffer */
  173. SetSysClock();
  174. }
  175. /**
  176. * @brief Update SystemCoreClock according to RCC Register Values
  177. * @note Update the SystemCoreClock variable values, when the core clock (HCLK) changes.
  178. * Otherwise, any configuration based on this variable will be wrong.
  179. * @param None
  180. * @retval None
  181. */
  182. void SystemCoreClockUpdate(void)
  183. {
  184. uint32_t temp = 0, pllmf = 0, pllmf4 = 0, pllselect = 0, presc = 0;
  185. #ifdef GD32F10X_CL
  186. uint32_t prediv1select = 0, prediv1factor = 0, prediv2factor = 0, pll2mf = 0;
  187. #endif /* GD32F10X_CL */
  188. /* Get CK_SYS source -------------------------------------------------------*/
  189. temp = RCC->GCFGR & RCC_GCFGR_SCSS;
  190. switch (temp) {
  191. case 0x00: /* HSI used as CK_SYS */
  192. SystemCoreClock = HSI_VALUE;
  193. break;
  194. case 0x04: /* HSE used as CK_SYS */
  195. SystemCoreClock = HSE_VALUE;
  196. break;
  197. case 0x08: /* PLL used as CK_SYS */
  198. #ifdef GD32F10X_CL
  199. /* Get PLL clock source and multiplication factor ----------------------*/
  200. /* Get PLLMF[3:0] */
  201. pllmf = RCC->GCFGR & SYS_RCC_GCFGR_PLLMF_3_0;
  202. /* Get PLLMF[4] */
  203. pllmf4 = RCC->GCFGR & RCC_GCFGR_PLLMF_4;
  204. pllmf4 = ((pllmf4 >> 29) * 15);
  205. pllmf = (pllmf >> 18) + pllmf4;
  206. if (pllmf != 0x0D) {
  207. pllmf += 2;
  208. } else {
  209. /* PLL multiplication factor = PLL input clock * 6.5 */
  210. pllmf = 13 / 2;
  211. }
  212. pllselect = RCC->GCFGR & RCC_GCFGR_PLLSEL;
  213. if (pllselect == 0x00) {
  214. /* HSI clock divided by 2 selected as PLL clock source */
  215. SystemCoreClock = (HSI_VALUE >> SYS_HSI_CLOCK_DIVIDED_2) * pllmf;
  216. } else {
  217. /* PREDIV1 selected as PLL clock entry */
  218. /* Get PREDIV1 clock source and division factor */
  219. prediv1select = RCC->GCFGR2 & RCC_GCFGR2_PREDV1SEL;
  220. prediv1factor = (RCC->GCFGR2 & RCC_GCFGR2_PREDV1) + 1;
  221. if (prediv1select == 0) {
  222. /* HSE clock selected as PREDIV1 clock entry */
  223. SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmf;
  224. } else {
  225. /* PLL2 clock selected as PREDIV1 clock entry */
  226. /* Get PREDIV2 division factor and PLL2 multiplication factor */
  227. prediv2factor = ((RCC->GCFGR2 & RCC_GCFGR2_PREDV2) >> 4) + 1;
  228. pll2mf = ((RCC->GCFGR2 & RCC_GCFGR2_PLL2MF) >> 8);
  229. if (pll2mf != 15) {
  230. pll2mf += 2;
  231. } else {
  232. pll2mf += 5;
  233. }
  234. SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mf) / prediv1factor) * pllmf;
  235. }
  236. }
  237. #else
  238. /* Get PLL clock source and multiplication factor ----------------------*/
  239. /* Get PLLMF[3:0] */
  240. pllmf = RCC->GCFGR & SYS_RCC_GCFGR_PLLMF_3_0;
  241. /* Get PLLMF[4] */
  242. pllmf4 = RCC->GCFGR & RCC_GCFGR_PLLMF_4;
  243. pllmf4 = ((pllmf4 >> 27) * 15);
  244. pllmf = (pllmf >> 18) + pllmf4 + 2;
  245. pllselect = RCC->GCFGR & RCC_GCFGR_PLLSEL;
  246. if (pllselect == 0x00) {
  247. /* HSI clock divided by 2 selected as PLL clock source */
  248. SystemCoreClock = (HSI_VALUE >> SYS_HSI_CLOCK_DIVIDED_2) * pllmf;
  249. } else {
  250. if ((RCC->GCFGR & RCC_GCFGR_PLLPREDV) != (uint32_t)RESET) {
  251. /* HSE clock divided by 2 */
  252. SystemCoreClock = (HSE_VALUE >> 1) * pllmf;
  253. } else {
  254. SystemCoreClock = HSE_VALUE * pllmf;
  255. }
  256. }
  257. #endif
  258. break;
  259. default: /* HSI used as system clock */
  260. SystemCoreClock = HSI_VALUE;
  261. break;
  262. }
  263. /* Get AHB prescaler */
  264. temp = RCC->GCFGR & RCC_GCFGR_AHBPS;
  265. temp = temp >> 4;
  266. presc = AHBPrescTableList[temp];
  267. /* Get AHB clock frequency */
  268. SystemCoreClock = SystemCoreClock >> presc;
  269. }
  270. /**
  271. * @brief Configure the System clock frequency, AHB, APB2 and APB1 prescalers.
  272. * @param None
  273. * @retval None
  274. */
  275. static void SetSysClock(void)
  276. {
  277. #ifdef SYSCLK_FREQ_HSE
  278. SetSysClockToHSE();
  279. #elif defined SYSCLK_FREQ_24MHz
  280. SetSysClockTo24();
  281. #elif defined SYSCLK_FREQ_36MHz
  282. SetSysClockTo36();
  283. #elif defined SYSCLK_FREQ_48MHz
  284. SetSysClockTo48();
  285. #elif defined SYSCLK_FREQ_56MHz
  286. SetSysClockTo56();
  287. #elif defined SYSCLK_FREQ_72MHz
  288. SetSysClockTo72();
  289. #elif defined SYSCLK_FREQ_96MHz
  290. SetSysClockTo96();
  291. #elif defined SYSCLK_FREQ_108MHz
  292. SetSysClockTo108();
  293. #elif defined SYSCLK_FREQ_48MHz_HSI
  294. SetSysClockTo48HSI();
  295. #elif defined SYSCLK_FREQ_72MHz_HSI
  296. SetSysClockTo72HSI();
  297. #elif defined SYSCLK_FREQ_108MHz_HSI
  298. SetSysClockTo108HSI();
  299. #endif
  300. }
  301. #ifdef SYSCLK_FREQ_HSE
  302. /**
  303. * @brief Select HSE as System clock source and configure AHB, APB2
  304. * and APB1 prescalers.
  305. * @param None
  306. * @retval None
  307. */
  308. static void SetSysClockToHSE(void)
  309. {
  310. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  311. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  312. /* Enable HSE */
  313. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  314. /* Wait till HSE is ready and if Time out is reached exit */
  315. do {
  316. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  317. StartUpCounter++;
  318. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  319. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  320. HSEStatus = (uint32_t)0x01;
  321. } else {
  322. HSEStatus = (uint32_t)0x00;
  323. }
  324. if (HSEStatus == (uint32_t)0x01) {
  325. /* AHB = CK_SYS not divided */
  326. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  327. /* APB2 = AHB not divided */
  328. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  329. /* APB1 = AHB is divided 2 */
  330. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  331. /* Select HSE as system clock source */
  332. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  333. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_HSE;
  334. /* Wait till HSE is used as system clock source */
  335. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x04) {
  336. }
  337. } else {
  338. }
  339. }
  340. #elif defined SYSCLK_FREQ_24MHz
  341. /**
  342. * @brief Set System clock frequency to 24MHz and configure AHB, APB1, and APB2 prescalers.
  343. * @note This function should be used only after reset.
  344. * @param None
  345. * @retval None
  346. */
  347. static void SetSysClockTo24(void)
  348. {
  349. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  350. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  351. /* Enable HSE */
  352. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  353. /* Wait till HSE is ready and if Time out is reached exit */
  354. do {
  355. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  356. StartUpCounter++;
  357. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  358. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  359. HSEStatus = (uint32_t)0x01;
  360. } else {
  361. HSEStatus = (uint32_t)0x00;
  362. }
  363. if (HSEStatus == (uint32_t)0x01) {
  364. /* AHB = CK_SYS not divided */
  365. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  366. /* APB2 = AHB not divided */
  367. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  368. /* APB1 = AHB is divided 2 */
  369. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  370. #ifdef GD32F10X_CL
  371. /* Configure PLLs ------------------------------------------------------*/
  372. /* PLL configuration: PLLCLK = PREDIV1 * 6 = 24 MHz */
  373. RCC->GCFGR &= (uint32_t)~(RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF);
  374. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_PREDIV1 | RCC_GCFGR_PLLSEL_PREDIV1 | RCC_GCFGR_PLLMF6);
  375. /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  376. /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */
  377. RCC->GCFGR2 &= (uint32_t)~(RCC_GCFGR2_PREDV2 | RCC_GCFGR2_PLL2MF |
  378. RCC_GCFGR2_PREDV1 | RCC_GCFGR2_PREDV1SEL);
  379. RCC->GCFGR2 |= (uint32_t)(RCC_GCFGR2_PREDV2_DIV5 | RCC_GCFGR2_PLL2MF8 |
  380. RCC_GCFGR2_PREDV1SEL_PLL2 | RCC_GCFGR2_PREDV1_DIV10);
  381. /* Enable PLL2 */
  382. RCC->GCCR |= RCC_GCCR_PLL2EN;
  383. /* Wait till PLL2 is ready */
  384. while ((RCC->GCCR & RCC_GCCR_PLL2STB) == 0) {
  385. }
  386. #else
  387. /* PLL configuration: PLLCLK = (HSE /2)* 6 = 24 MHz */
  388. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  389. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_HSE_DIV2 | RCC_GCFGR_PLLSEL_HSE | RCC_GCFGR_PLLMF6);
  390. #endif /* GD32F10X_CL */
  391. /* Enable PLL */
  392. RCC->GCCR |= RCC_GCCR_PLLEN;
  393. /* Wait till PLL is ready */
  394. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  395. }
  396. /* Select PLL as system clock source */
  397. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  398. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  399. /* Wait till PLL is used as system clock source */
  400. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  401. }
  402. } else {
  403. }
  404. }
  405. #elif defined SYSCLK_FREQ_36MHz
  406. /**
  407. * @brief Set System clock frequency to 36MHz and configure AHB, APB1, and APB2 prescalers.
  408. * @note This function should be used only after reset.
  409. * @param None
  410. * @retval None
  411. */
  412. static void SetSysClockTo36(void)
  413. {
  414. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  415. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  416. /* Enable HSE */
  417. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  418. /* Wait till HSE is ready and if Time out is reached exit */
  419. do {
  420. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  421. StartUpCounter++;
  422. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  423. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  424. HSEStatus = (uint32_t)0x01;
  425. } else {
  426. HSEStatus = (uint32_t)0x00;
  427. }
  428. if (HSEStatus == (uint32_t)0x01) {
  429. /* AHB = CK_SYS not divided */
  430. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  431. /* APB2 = AHB not divided */
  432. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  433. /* APB1 = AHB is divided 2 */
  434. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  435. #ifdef GD32F10X_CL
  436. /* Configure PLLs ------------------------------------------------------*/
  437. /* PLL configuration: PLLCLK = PREDIV1 * 9 = 36 MHz */
  438. RCC->GCFGR &= (uint32_t)~(RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF);
  439. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_PREDIV1 | RCC_GCFGR_PLLMF9);
  440. /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  441. /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */
  442. RCC->GCFGR2 &= (uint32_t)~(RCC_GCFGR2_PREDV2 | RCC_GCFGR2_PLL2MF |
  443. RCC_GCFGR2_PREDV1 | RCC_GCFGR2_PREDV1SEL);
  444. RCC->GCFGR2 |= (uint32_t)(RCC_GCFGR2_PREDV2_DIV5 | RCC_GCFGR2_PLL2MF8 |
  445. RCC_GCFGR2_PREDV1SEL_PLL2 | RCC_GCFGR2_PREDV1_DIV10);
  446. /* Enable PLL2 */
  447. RCC->GCCR |= RCC_GCCR_PLL2EN;
  448. /* Wait till PLL2 is ready */
  449. while ((RCC->GCCR & RCC_GCCR_PLL2STB) == 0) {
  450. }
  451. #else
  452. /* PLL configuration: PLLCLK = (HSE /2)* 9 = 36 MHz */
  453. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  454. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_HSE_DIV2 | RCC_GCFGR_PLLSEL_HSE | RCC_GCFGR_PLLMF9);
  455. #endif /* GD32F10X_CL */
  456. /* Enable PLL */
  457. RCC->GCCR |= RCC_GCCR_PLLEN;
  458. /* Wait till PLL is ready */
  459. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  460. }
  461. /* Select PLL as system clock source */
  462. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  463. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  464. /* Wait till PLL is used as system clock source */
  465. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  466. }
  467. } else {
  468. }
  469. }
  470. #elif defined SYSCLK_FREQ_48MHz
  471. /**
  472. * @brief Set System clock frequency to 48MHz and configure AHB, APB1, and APB2 prescalers.
  473. * @note This function should be used only after reset.
  474. * @param None
  475. * @retval None
  476. */
  477. static void SetSysClockTo48(void)
  478. {
  479. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  480. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  481. /* Enable HSE */
  482. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  483. /* Wait till HSE is ready and if Time out is reached exit */
  484. do {
  485. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  486. StartUpCounter++;
  487. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  488. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  489. HSEStatus = (uint32_t)0x01;
  490. } else {
  491. HSEStatus = (uint32_t)0x00;
  492. }
  493. if (HSEStatus == (uint32_t)0x01) {
  494. /* AHB = CK_SYS not divided */
  495. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  496. /* APB2 = AHB not divided */
  497. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  498. /* APB1 = AHB is divided 2 */
  499. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  500. #ifdef GD32F10X_CL
  501. /* Configure PLLs ------------------------------------------------------*/
  502. /* PLL configuration: PLLCLK = PREDIV1 * 6 = 48 MHz */
  503. RCC->GCFGR &= (uint32_t)~(RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF);
  504. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_PREDIV1 | RCC_GCFGR_PLLMF6);
  505. /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  506. /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
  507. RCC->GCFGR2 &= (uint32_t)~(RCC_GCFGR2_PREDV2 | RCC_GCFGR2_PLL2MF |
  508. RCC_GCFGR2_PREDV1 | RCC_GCFGR2_PREDV1SEL);
  509. RCC->GCFGR2 |= (uint32_t)(RCC_GCFGR2_PREDV2_DIV5 | RCC_GCFGR2_PLL2MF8 |
  510. RCC_GCFGR2_PREDV1SEL_PLL2 | RCC_GCFGR2_PREDV1_DIV5);
  511. /* Enable PLL2 */
  512. RCC->GCCR |= RCC_GCCR_PLL2EN;
  513. /* Wait till PLL2 is ready */
  514. while ((RCC->GCCR & RCC_GCCR_PLL2STB) == 0) {
  515. }
  516. #else
  517. /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */
  518. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  519. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_HSE | RCC_GCFGR_PLLSEL_HSE | RCC_GCFGR_PLLMF6);
  520. #endif /* GD32F10X_CL */
  521. /* Enable PLL */
  522. RCC->GCCR |= RCC_GCCR_PLLEN;
  523. /* Wait till PLL is ready */
  524. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  525. }
  526. /* Select PLL as system clock source */
  527. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  528. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  529. /* Wait till PLL is used as system clock source */
  530. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  531. }
  532. } else {
  533. }
  534. }
  535. #elif defined SYSCLK_FREQ_56MHz
  536. /**
  537. * @brief Set System clock frequency to 56MHz and configure AHB, APB1, and APB2 prescalers.
  538. * @note This function should be used only after reset.
  539. * @param None
  540. * @retval None
  541. */
  542. static void SetSysClockTo56(void)
  543. {
  544. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  545. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  546. /* Enable HSE */
  547. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  548. /* Wait till HSE is ready and if Time out is reached exit */
  549. do {
  550. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  551. StartUpCounter++;
  552. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  553. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  554. HSEStatus = (uint32_t)0x01;
  555. } else {
  556. HSEStatus = (uint32_t)0x00;
  557. }
  558. if (HSEStatus == (uint32_t)0x01) {
  559. /* AHB = CK_SYS not divided */
  560. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  561. /* APB2 = AHB not divided */
  562. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  563. /* APB1 = AHB is divided 2 */
  564. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  565. #ifdef GD32F10X_CL
  566. /* Configure PLLs ------------------------------------------------------*/
  567. /* PLL configuration: PLLCLK = PREDIV1 * 7 = 56 MHz */
  568. RCC->GCFGR &= (uint32_t)~(RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF);
  569. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_PREDIV1 | RCC_GCFGR_PLLMF7);
  570. /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  571. /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
  572. RCC->GCFGR2 &= (uint32_t)~(RCC_GCFGR2_PREDV2 | RCC_GCFGR2_PLL2MF |
  573. RCC_GCFGR2_PREDV1 | RCC_GCFGR2_PREDV1SEL);
  574. RCC->GCFGR2 |= (uint32_t)(RCC_GCFGR2_PREDV2_DIV5 | RCC_GCFGR2_PLL2MF8 |
  575. RCC_GCFGR2_PREDV1SEL_PLL2 | RCC_GCFGR2_PREDV1_DIV5);
  576. /* Enable PLL2 */
  577. RCC->GCCR |= RCC_GCCR_PLL2EN;
  578. /* Wait till PLL2 is ready */
  579. while ((RCC->GCCR & RCC_GCCR_PLL2STB) == 0) {
  580. }
  581. #else
  582. /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */
  583. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  584. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_HSE | RCC_GCFGR_PLLSEL_HSE | RCC_GCFGR_PLLMF7);
  585. #endif /* GD32F10X_CL */
  586. /* Enable PLL */
  587. RCC->GCCR |= RCC_GCCR_PLLEN;
  588. /* Wait till PLL is ready */
  589. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  590. }
  591. /* Select PLL as system clock source */
  592. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  593. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  594. /* Wait till PLL is used as system clock source */
  595. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  596. }
  597. } else {
  598. }
  599. }
  600. #elif defined SYSCLK_FREQ_72MHz
  601. /**
  602. * @brief Set System clock frequency to 72MHz and configure AHB, APB1, and APB2 prescalers.
  603. * @note This function should be used only after reset.
  604. * @param None
  605. * @retval None
  606. */
  607. static void SetSysClockTo72(void)
  608. {
  609. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  610. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  611. /* Enable HSE */
  612. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  613. /* Wait till HSE is ready and if Time out is reached exit */
  614. do {
  615. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  616. StartUpCounter++;
  617. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  618. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  619. HSEStatus = (uint32_t)0x01;
  620. } else {
  621. HSEStatus = (uint32_t)0x00;
  622. }
  623. if (HSEStatus == (uint32_t)0x01) {
  624. /* AHB = CK_SYS not divided */
  625. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  626. /* APB2 = AHB not divided */
  627. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  628. /* APB1 = AHB is divided 2 */
  629. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  630. #ifdef GD32F10X_CL
  631. /* Configure PLLs ------------------------------------------------------*/
  632. /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
  633. RCC->GCFGR &= (uint32_t)~(RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF);
  634. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_PREDIV1 | RCC_GCFGR_PLLMF9);
  635. /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  636. /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
  637. RCC->GCFGR2 &= (uint32_t)~(RCC_GCFGR2_PREDV2 | RCC_GCFGR2_PLL2MF |
  638. RCC_GCFGR2_PREDV1 | RCC_GCFGR2_PREDV1SEL);
  639. RCC->GCFGR2 |= (uint32_t)(RCC_GCFGR2_PREDV2_DIV5 | RCC_GCFGR2_PLL2MF8 |
  640. RCC_GCFGR2_PREDV1SEL_PLL2 | RCC_GCFGR2_PREDV1_DIV5);
  641. /* Enable PLL2 */
  642. RCC->GCCR |= RCC_GCCR_PLL2EN;
  643. /* Wait till PLL2 is ready */
  644. while ((RCC->GCCR & RCC_GCCR_PLL2STB) == 0) {
  645. }
  646. #else
  647. /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
  648. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  649. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_HSE | RCC_GCFGR_PLLSEL_HSE | RCC_GCFGR_PLLMF9);
  650. #endif /* GD32F10X_CL */
  651. /* Enable PLL */
  652. RCC->GCCR |= RCC_GCCR_PLLEN;
  653. /* Wait till PLL is ready */
  654. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  655. }
  656. /* Select PLL as system clock source */
  657. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  658. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  659. /* Wait till PLL is used as system clock source */
  660. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  661. }
  662. } else {
  663. }
  664. }
  665. #elif defined SYSCLK_FREQ_96MHz
  666. /**
  667. * @brief Set System clock frequency to 96MHz and configure AHB, APB1, and APB2 prescalers.
  668. * @note This function should be used only after reset.
  669. * @param None
  670. * @retval None
  671. */
  672. static void SetSysClockTo96(void)
  673. {
  674. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  675. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  676. /* Enable HSE */
  677. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  678. /* Wait till HSE is ready and if Time out is reached exit */
  679. do {
  680. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  681. StartUpCounter++;
  682. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  683. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  684. HSEStatus = (uint32_t)0x01;
  685. } else {
  686. HSEStatus = (uint32_t)0x00;
  687. }
  688. if (HSEStatus == (uint32_t)0x01) {
  689. /* AHB = CK_SYS not divided */
  690. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  691. /* APB2 = AHB not divided */
  692. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  693. /* APB1 = AHB is divided 2 */
  694. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  695. #ifdef GD32F10X_CL
  696. /* Configure PLLs ------------------------------------------------------*/
  697. /* PLL configuration: PLLCLK = PREDIV1 * 12 = 96 MHz */
  698. RCC->GCFGR &= (uint32_t)~(RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF);
  699. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_PREDIV1 | RCC_GCFGR_PLLMF12);
  700. /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  701. /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
  702. RCC->GCFGR2 &= (uint32_t)~(RCC_GCFGR2_PREDV2 | RCC_GCFGR2_PLL2MF |
  703. RCC_GCFGR2_PREDV1 | RCC_GCFGR2_PREDV1SEL);
  704. RCC->GCFGR2 |= (uint32_t)(RCC_GCFGR2_PREDV2_DIV5 | RCC_GCFGR2_PLL2MF8 |
  705. RCC_GCFGR2_PREDV1SEL_PLL2 | RCC_GCFGR2_PREDV1_DIV5);
  706. /* Enable PLL2 */
  707. RCC->GCCR |= RCC_GCCR_PLL2EN;
  708. /* Wait till PLL2 is ready */
  709. while ((RCC->GCCR & RCC_GCCR_PLL2STB) == 0) {
  710. }
  711. #else
  712. /* PLL configuration: PLLCLK = HSE * 12 = 96 MHz */
  713. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  714. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_HSE | RCC_GCFGR_PLLSEL_HSE | RCC_GCFGR_PLLMF12);
  715. #endif /* GD32F10X_CL */
  716. /* Enable PLL */
  717. RCC->GCCR |= RCC_GCCR_PLLEN;
  718. /* Wait till PLL is ready */
  719. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  720. }
  721. /* Select PLL as system clock source */
  722. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  723. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  724. /* Wait till PLL is used as system clock source */
  725. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  726. }
  727. } else {
  728. }
  729. }
  730. #elif defined SYSCLK_FREQ_108MHz
  731. /**
  732. * @brief Set System clock frequency to 108MHz and configure AHB, APB1, and APB2 prescalers.
  733. * @note This function should be used only after reset.
  734. * @param None
  735. * @retval None
  736. */
  737. static void SetSysClockTo108(void)
  738. {
  739. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  740. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  741. /* Enable HSE */
  742. RCC->GCCR |= ((uint32_t)RCC_GCCR_HSEEN);
  743. /* Wait till HSE is ready and if Time out is reached exit */
  744. do {
  745. HSEStatus = RCC->GCCR & RCC_GCCR_HSESTB;
  746. StartUpCounter++;
  747. } while ((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  748. if ((RCC->GCCR & RCC_GCCR_HSESTB) != RESET) {
  749. HSEStatus = (uint32_t)0x01;
  750. } else {
  751. HSEStatus = (uint32_t)0x00;
  752. }
  753. if (HSEStatus == (uint32_t)0x01) {
  754. /* AHB = CK_SYS not divided */
  755. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  756. /* APB2 = AHB not divided */
  757. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  758. /* APB1 = AHB is divided 2 */
  759. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  760. #ifdef GD32F10X_CL
  761. /* Configure PLLs ------------------------------------------------------*/
  762. /* PLL configuration: PLLCLK = PREDIV1 * 9 = 108 MHz */
  763. RCC->GCFGR &= (uint32_t)~(RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF);
  764. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_PREDIV1 | RCC_GCFGR_PLLSEL_PREDIV1 | RCC_GCFGR_PLLMF9);
  765. /* PLL2 configuration: PLL2CLK = (HSE / 5) * 12 = 60 MHz */
  766. /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 12 MHz */
  767. RCC->GCFGR2 &= (uint32_t)~(RCC_GCFGR2_PREDV2 | RCC_GCFGR2_PLL2MF |
  768. RCC_GCFGR2_PREDV1 | RCC_GCFGR2_PREDV1SEL);
  769. RCC->GCFGR2 |= (uint32_t)(RCC_GCFGR2_PREDV2_DIV5 | RCC_GCFGR2_PLL2MF12 |
  770. RCC_GCFGR2_PREDV1SEL_PLL2 | RCC_GCFGR2_PREDV1_DIV5);
  771. /* Enable PLL2 */
  772. RCC->GCCR |= RCC_GCCR_PLL2EN;
  773. /* Wait till PLL2 is ready */
  774. while ((RCC->GCCR & RCC_GCCR_PLL2STB) == 0) {
  775. }
  776. #else
  777. /* PLL configuration: PLLCLK = (HSE/2) * 27 = 108 MHz */
  778. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  779. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLPREDV_HSE_DIV2 | RCC_GCFGR_PLLSEL_HSE | RCC_GCFGR_PLLMF27);
  780. #endif /* GD32F10X_CL */
  781. /* Enable PLL */
  782. RCC->GCCR |= RCC_GCCR_PLLEN;
  783. /* Wait till PLL is ready */
  784. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  785. }
  786. /* Select PLL as system clock source */
  787. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  788. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  789. /* Wait till PLL is used as system clock source */
  790. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  791. }
  792. } else {
  793. }
  794. }
  795. #elif defined SYSCLK_FREQ_48MHz_HSI
  796. /**
  797. * @brief Set System clock frequency to 48MHz and configure AHB, APB1, and APB2 prescalers.
  798. * @note This function should be used only after reset.
  799. * @param None
  800. * @retval None
  801. */
  802. static void SetSysClockTo48HSI(void)
  803. {
  804. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  805. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  806. /* AHB = CK_SYS not divided */
  807. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  808. /* APB2 = AHB not divided */
  809. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  810. /* APB1 = AHB is divided 2 */
  811. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  812. /* Configure PLLs ------------------------------------------------------*/
  813. /* PLL configuration: PLLCLK = (HSI/2) * 12 = 48 MHz */
  814. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF));
  815. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_HSI_DIV2 | RCC_GCFGR_PLLMF12);
  816. /* Enable PLL */
  817. RCC->GCCR |= RCC_GCCR_PLLEN;
  818. /* Wait till PLL is ready */
  819. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  820. }
  821. /* Select PLL as system clock source */
  822. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  823. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  824. /* Wait till PLL is used as system clock source */
  825. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  826. }
  827. }
  828. #elif defined SYSCLK_FREQ_72MHz_HSI
  829. /**
  830. * @brief Set System clock frequency to 72MHz and configure AHB, APB1, and APB2 prescalers.
  831. * @note This function should be used only after reset.
  832. * @param None
  833. * @retval None
  834. */
  835. static void SetSysClockTo72HSI(void)
  836. {
  837. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  838. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  839. /* AHB = CK_SYS not divided */
  840. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  841. /* APB2 = AHB not divided */
  842. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  843. /* APB1 = AHB is divided 2 */
  844. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  845. /* Configure PLLs ------------------------------------------------------*/
  846. /* PLL configuration: PLLCLK = (HSI/2) * 18 = 72 MHz */
  847. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF));
  848. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_HSI_DIV2 | RCC_GCFGR_PLLMF18);
  849. /* Enable PLL */
  850. RCC->GCCR |= RCC_GCCR_PLLEN;
  851. /* Wait till PLL is ready */
  852. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  853. }
  854. /* Select PLL as system clock source */
  855. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  856. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  857. /* Wait till PLL is used as system clock source */
  858. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  859. }
  860. }
  861. #elif defined SYSCLK_FREQ_108MHz_HSI
  862. /**
  863. * @brief Set System clock frequency to 108MHz and configure AHB, APB1, and APB2 prescalers.
  864. * @note This function should be used only after reset.
  865. * @param None
  866. * @retval None
  867. */
  868. static void SetSysClockTo108HSI(void)
  869. {
  870. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  871. /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/
  872. /* AHB = CK_SYS not divided */
  873. RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  874. /* APB2 = AHB not divided */
  875. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  876. /* APB1 = AHB is divided 2 */
  877. RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;
  878. /* Configure PLLs ------------------------------------------------------*/
  879. /* PLL configuration: PLLCLK = (HSI/2) * 27 = 108 MHz */
  880. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  881. RCC->GCFGR |= (uint32_t)(RCC_GCFGR_PLLSEL_HSI_DIV2 | RCC_GCFGR_PLLMF27);
  882. /* Enable PLL */
  883. RCC->GCCR |= RCC_GCCR_PLLEN;
  884. /* Wait till PLL is ready */
  885. while ((RCC->GCCR & RCC_GCCR_PLLSTB) == 0) {
  886. }
  887. /* Select PLL as system clock source */
  888. RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  889. RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;
  890. /* Wait till PLL is used as system clock source */
  891. while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08) {
  892. }
  893. }
  894. #endif
  895. /**
  896. * @}
  897. */
  898. /**
  899. * @}
  900. */
  901. /**
  902. * @}
  903. */