system_ch32f20x.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : system_ch32f20x.c
  3. * Author : WCH
  4. * Version : V1.0.0
  5. * Date : 2021/08/08
  6. * Description : CH32F20x Device Peripheral Access Layer System Source File.
  7. * For HSE = 8Mhz
  8. *********************************************************************************/
  9. #include "ch32f20x.h"
  10. /*
  11. * Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after
  12. * reset the HSI is used as SYSCLK source).
  13. * If none of the define below is enabled, the HSI is used as System clock source.
  14. */
  15. // #define SYSCLK_FREQ_HSE HSE_VALUE
  16. /* #define SYSCLK_FREQ_24MHz 24000000 */
  17. //#define SYSCLK_FREQ_48MHz 48000000
  18. /* #define SYSCLK_FREQ_56MHz 56000000 */
  19. #define SYSCLK_FREQ_72MHz 72000000
  20. //#define SYSCLK_FREQ_96MHz 96000000
  21. //#define SYSCLK_FREQ_120MHz 120000000
  22. //#define SYSCLK_FREQ_144MHz 144000000
  23. /* Clock Definitions */
  24. #ifdef SYSCLK_FREQ_HSE
  25. uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /* System Clock Frequency (Core Clock) */
  26. #elif defined SYSCLK_FREQ_24MHz
  27. uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /* System Clock Frequency (Core Clock) */
  28. #elif defined SYSCLK_FREQ_48MHz
  29. uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /* System Clock Frequency (Core Clock) */
  30. #elif defined SYSCLK_FREQ_56MHz
  31. uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /* System Clock Frequency (Core Clock) */
  32. #elif defined SYSCLK_FREQ_72MHz
  33. uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /* System Clock Frequency (Core Clock) */
  34. #elif defined SYSCLK_FREQ_96MHz
  35. uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz; /* System Clock Frequency (Core Clock) */
  36. #elif defined SYSCLK_FREQ_120MHz
  37. uint32_t SystemCoreClock = SYSCLK_FREQ_120MHz; /* System Clock Frequency (Core Clock) */
  38. #elif defined SYSCLK_FREQ_144MHz
  39. uint32_t SystemCoreClock = SYSCLK_FREQ_144MHz; /* System Clock Frequency (Core Clock) */
  40. #else /* HSI Selected as System Clock source */
  41. uint32_t SystemCoreClock = HSI_VALUE; /* System Clock Frequency (Core Clock) */
  42. #endif
  43. __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  44. /* system_private_function_proto_types */
  45. static void SetSysClock(void);
  46. #ifdef SYSCLK_FREQ_HSE
  47. static void SetSysClockToHSE(void);
  48. #elif defined SYSCLK_FREQ_24MHz
  49. static void SetSysClockTo24(void);
  50. #elif defined SYSCLK_FREQ_48MHz
  51. static void SetSysClockTo48(void);
  52. #elif defined SYSCLK_FREQ_56MHz
  53. static void SetSysClockTo56(void);
  54. #elif defined SYSCLK_FREQ_72MHz
  55. static void SetSysClockTo72(void);
  56. #elif defined SYSCLK_FREQ_96MHz
  57. static void SetSysClockTo96(void);
  58. #elif defined SYSCLK_FREQ_120MHz
  59. static void SetSysClockTo120(void);
  60. #elif defined SYSCLK_FREQ_144MHz
  61. static void SetSysClockTo144(void);
  62. #endif
  63. /******************************************************************************************
  64. * Function Name : SystemInit
  65. * Description : Setup the microcontroller system Initialize the Embedded Flash Interface,
  66. * the PLL and update the SystemCoreClock variable.
  67. * Input : None
  68. * Return : None
  69. *******************************************************************************************/
  70. void SystemInit (void)
  71. {
  72. RCC->CTLR |= (uint32_t)0x00000001;
  73. RCC->CFGR0 &= (uint32_t)0xF8FF0000;
  74. RCC->CTLR &= (uint32_t)0xFEF6FFFF;
  75. RCC->CTLR &= (uint32_t)0xFFFBFFFF;
  76. RCC->CFGR0 &= (uint32_t)0xFF80FFFF;
  77. RCC->INTR = 0x009F0000;
  78. SetSysClock();
  79. }
  80. /******************************************************************************************
  81. * Function Name : SystemCoreClockUpdate
  82. * Description : Update SystemCoreClock variable according to Clock Register Values.
  83. * Input : None
  84. * Return : None
  85. *******************************************************************************************/
  86. void SystemCoreClockUpdate (void)
  87. {
  88. uint32_t tmp = 0, pllmull = 0, pllsource = 0, Pll_6_5 = 0;
  89. tmp = RCC->CFGR0 & RCC_SWS;
  90. switch (tmp)
  91. {
  92. case 0x00:
  93. SystemCoreClock = HSI_VALUE;
  94. break;
  95. case 0x04:
  96. SystemCoreClock = HSE_VALUE;
  97. break;
  98. case 0x08:
  99. pllmull = RCC->CFGR0 & RCC_PLLMULL;
  100. pllsource = RCC->CFGR0 & RCC_PLLSRC;
  101. pllmull = ( pllmull >> 18) + 2;
  102. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){ /* for other CH32F20x */
  103. if(pllmull == 17) pllmull = 18;
  104. }
  105. else{ /* for CH32F207 */
  106. if(pllmull == 2) pllmull = 18;
  107. if(pllmull == 15){
  108. pllmull = 13; /* *6.5 */
  109. Pll_6_5 = 1;
  110. }
  111. if(pllmull == 16) pllmull = 15;
  112. if(pllmull == 17) pllmull = 16;
  113. }
  114. if (pllsource == 0x00)
  115. {
  116. SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
  117. }
  118. else
  119. {
  120. if ((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET)
  121. {
  122. SystemCoreClock = (HSE_VALUE >> 1) * pllmull;
  123. }
  124. else
  125. {
  126. SystemCoreClock = HSE_VALUE * pllmull;
  127. }
  128. }
  129. if(Pll_6_5 == 1) SystemCoreClock = (SystemCoreClock / 2);
  130. break;
  131. default:
  132. SystemCoreClock = HSI_VALUE;
  133. break;
  134. }
  135. tmp = AHBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)];
  136. SystemCoreClock >>= tmp;
  137. }
  138. /******************************************************************************************
  139. * Function Name : SetSysClock
  140. * Description : Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
  141. * Input : None
  142. * Return : None
  143. *******************************************************************************************/
  144. static void SetSysClock(void)
  145. {
  146. #ifdef SYSCLK_FREQ_HSE
  147. SetSysClockToHSE();
  148. #elif defined SYSCLK_FREQ_24MHz
  149. SetSysClockTo24();
  150. #elif defined SYSCLK_FREQ_48MHz
  151. SetSysClockTo48();
  152. #elif defined SYSCLK_FREQ_56MHz
  153. SetSysClockTo56();
  154. #elif defined SYSCLK_FREQ_72MHz
  155. SetSysClockTo72();
  156. #elif defined SYSCLK_FREQ_96MHz
  157. SetSysClockTo96();
  158. #elif defined SYSCLK_FREQ_120MHz
  159. SetSysClockTo120();
  160. #elif defined SYSCLK_FREQ_144MHz
  161. SetSysClockTo144();
  162. #endif
  163. /* If none of the define above is enabled, the HSI is used as System clock
  164. * source (default after reset)
  165. */
  166. }
  167. #ifdef SYSCLK_FREQ_HSE
  168. /******************************************************************************************
  169. * Function Name : SetSysClockToHSE
  170. * Description : Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers.
  171. * Input : None
  172. * Return : None
  173. *******************************************************************************************/
  174. static void SetSysClockToHSE(void)
  175. {
  176. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  177. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  178. /* Wait till HSE is ready and if Time out is reached exit */
  179. do
  180. {
  181. HSEStatus = RCC->CTLR & RCC_HSERDY;
  182. StartUpCounter++;
  183. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  184. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  185. {
  186. HSEStatus = (uint32_t)0x01;
  187. }
  188. else
  189. {
  190. HSEStatus = (uint32_t)0x00;
  191. }
  192. if (HSEStatus == (uint32_t)0x01)
  193. {
  194. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  195. /* Flash 0 wait state */
  196. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  197. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_0;
  198. /* HCLK = SYSCLK */
  199. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  200. /* PCLK2 = HCLK */
  201. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  202. /* PCLK1 = HCLK */
  203. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;
  204. /* Select HSE as system clock source */
  205. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  206. RCC->CFGR0 |= (uint32_t)RCC_SW_HSE;
  207. /* Wait till HSE is used as system clock source */
  208. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04)
  209. {
  210. }
  211. }
  212. else
  213. {
  214. /* If HSE fails to start-up, the application will have wrong clock
  215. * configuration. User can add here some code to deal with this error
  216. */
  217. }
  218. }
  219. #elif defined SYSCLK_FREQ_24MHz
  220. /******************************************************************************************
  221. * Function Name : SetSysClockTo24
  222. * Description : Sets System clock frequency to 24MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  223. * Input : None
  224. * Return : None
  225. *******************************************************************************************/
  226. static void SetSysClockTo24(void)
  227. {
  228. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  229. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  230. /* Wait till HSE is ready and if Time out is reached exit */
  231. do
  232. {
  233. HSEStatus = RCC->CTLR & RCC_HSERDY;
  234. StartUpCounter++;
  235. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  236. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  237. {
  238. HSEStatus = (uint32_t)0x01;
  239. }
  240. else
  241. {
  242. HSEStatus = (uint32_t)0x00;
  243. }
  244. if (HSEStatus == (uint32_t)0x01)
  245. {
  246. /* Enable Prefetch Buffer */
  247. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  248. /* Flash 0 wait state */
  249. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  250. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_0;
  251. /* HCLK = SYSCLK */
  252. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  253. /* PCLK2 = HCLK */
  254. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  255. /* PCLK1 = HCLK */
  256. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;
  257. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
  258. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){
  259. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL3);
  260. }
  261. else{
  262. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL3_EXTEN);
  263. }
  264. /* Enable PLL */
  265. RCC->CTLR |= RCC_PLLON;
  266. /* Wait till PLL is ready */
  267. while((RCC->CTLR & RCC_PLLRDY) == 0)
  268. {
  269. }
  270. /* Select PLL as system clock source */
  271. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  272. RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
  273. /* Wait till PLL is used as system clock source */
  274. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
  275. {
  276. }
  277. }
  278. else
  279. {
  280. /* If HSE fails to start-up, the application will have wrong clock
  281. * configuration. User can add here some code to deal with this error
  282. */
  283. }
  284. }
  285. #elif defined SYSCLK_FREQ_48MHz
  286. /******************************************************************************************
  287. * Function Name : SetSysClockTo48
  288. * Description : Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  289. * Input : None
  290. * Return : None
  291. *******************************************************************************************/
  292. static void SetSysClockTo48(void)
  293. {
  294. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  295. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  296. /* Wait till HSE is ready and if Time out is reached exit */
  297. do
  298. {
  299. HSEStatus = RCC->CTLR & RCC_HSERDY;
  300. StartUpCounter++;
  301. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  302. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  303. {
  304. HSEStatus = (uint32_t)0x01;
  305. }
  306. else
  307. {
  308. HSEStatus = (uint32_t)0x00;
  309. }
  310. if (HSEStatus == (uint32_t)0x01)
  311. {
  312. /* Enable Prefetch Buffer */
  313. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  314. /* Flash 1 wait state */
  315. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  316. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_1;
  317. /* HCLK = SYSCLK */
  318. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  319. /* PCLK2 = HCLK */
  320. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  321. /* PCLK1 = HCLK */
  322. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
  323. /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */
  324. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
  325. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){
  326. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6);
  327. }
  328. else{
  329. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6_EXTEN);
  330. }
  331. /* Enable PLL */
  332. RCC->CTLR |= RCC_PLLON;
  333. /* Wait till PLL is ready */
  334. while((RCC->CTLR & RCC_PLLRDY) == 0)
  335. {
  336. }
  337. /* Select PLL as system clock source */
  338. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  339. RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
  340. /* Wait till PLL is used as system clock source */
  341. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
  342. {
  343. }
  344. }
  345. else
  346. {
  347. /*
  348. * If HSE fails to start-up, the application will have wrong clock
  349. * configuration. User can add here some code to deal with this error
  350. */
  351. }
  352. }
  353. #elif defined SYSCLK_FREQ_56MHz
  354. /******************************************************************************************
  355. * Function Name : SetSysClockTo56
  356. * Description : Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  357. * Input : None
  358. * Return : None
  359. *******************************************************************************************/
  360. static void SetSysClockTo56(void)
  361. {
  362. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  363. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  364. /* Wait till HSE is ready and if Time out is reached exit */
  365. do
  366. {
  367. HSEStatus = RCC->CTLR & RCC_HSERDY;
  368. StartUpCounter++;
  369. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  370. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  371. {
  372. HSEStatus = (uint32_t)0x01;
  373. }
  374. else
  375. {
  376. HSEStatus = (uint32_t)0x00;
  377. }
  378. if (HSEStatus == (uint32_t)0x01)
  379. {
  380. /* Enable Prefetch Buffer */
  381. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  382. /* Flash 2 wait state */
  383. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  384. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
  385. /* HCLK = SYSCLK */
  386. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  387. /* PCLK2 = HCLK */
  388. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  389. /* PCLK1 = HCLK */
  390. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
  391. /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */
  392. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
  393. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){
  394. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7);
  395. }
  396. else{
  397. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7_EXTEN);
  398. }
  399. /* Enable PLL */
  400. RCC->CTLR |= RCC_PLLON;
  401. /* Wait till PLL is ready */
  402. while((RCC->CTLR & RCC_PLLRDY) == 0)
  403. {
  404. }
  405. /* Select PLL as system clock source */
  406. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  407. RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
  408. /* Wait till PLL is used as system clock source */
  409. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
  410. {
  411. }
  412. }
  413. else
  414. {
  415. /*
  416. * If HSE fails to start-up, the application will have wrong clock
  417. * configuration. User can add here some code to deal with this error
  418. */
  419. }
  420. }
  421. #elif defined SYSCLK_FREQ_72MHz
  422. /******************************************************************************************
  423. * Function Name : SetSysClockTo72
  424. * Description : Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  425. * Input : None
  426. * Return : None
  427. *******************************************************************************************/
  428. static void SetSysClockTo72(void)
  429. {
  430. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  431. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  432. /* Wait till HSE is ready and if Time out is reached exit */
  433. do
  434. {
  435. HSEStatus = RCC->CTLR & RCC_HSERDY;
  436. StartUpCounter++;
  437. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  438. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  439. {
  440. HSEStatus = (uint32_t)0x01;
  441. }
  442. else
  443. {
  444. HSEStatus = (uint32_t)0x00;
  445. }
  446. if (HSEStatus == (uint32_t)0x01)
  447. {
  448. /* Enable Prefetch Buffer */
  449. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  450. /* Flash 2 wait state */
  451. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  452. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
  453. /* HCLK = SYSCLK */
  454. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  455. /* PCLK2 = HCLK */
  456. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  457. /* PCLK1 = HCLK */
  458. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
  459. /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
  460. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
  461. RCC_PLLMULL));
  462. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){
  463. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9);
  464. }
  465. else{
  466. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9_EXTEN);
  467. }
  468. /* Enable PLL */
  469. RCC->CTLR |= RCC_PLLON;
  470. /* Wait till PLL is ready */
  471. while((RCC->CTLR & RCC_PLLRDY) == 0)
  472. {
  473. }
  474. /* Select PLL as system clock source */
  475. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  476. RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
  477. /* Wait till PLL is used as system clock source */
  478. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
  479. {
  480. }
  481. }
  482. else
  483. {
  484. /*
  485. * If HSE fails to start-up, the application will have wrong clock
  486. * configuration. User can add here some code to deal with this error
  487. */
  488. }
  489. }
  490. #elif defined SYSCLK_FREQ_96MHz
  491. /******************************************************************************************
  492. * Function Name : SetSysClockTo96
  493. * Description : Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  494. * Input : None
  495. * Return : None
  496. *******************************************************************************************/
  497. static void SetSysClockTo96(void)
  498. {
  499. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  500. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  501. /* Wait till HSE is ready and if Time out is reached exit */
  502. do
  503. {
  504. HSEStatus = RCC->CTLR & RCC_HSERDY;
  505. StartUpCounter++;
  506. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  507. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  508. {
  509. HSEStatus = (uint32_t)0x01;
  510. }
  511. else
  512. {
  513. HSEStatus = (uint32_t)0x00;
  514. }
  515. if (HSEStatus == (uint32_t)0x01)
  516. {
  517. /* Enable Prefetch Buffer */
  518. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  519. /* Flash 2 wait state */
  520. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  521. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
  522. /* HCLK = SYSCLK */
  523. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  524. /* PCLK2 = HCLK */
  525. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  526. /* PCLK1 = HCLK */
  527. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
  528. /* PLL configuration: PLLCLK = HSE * 12 = 96 MHz */
  529. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
  530. RCC_PLLMULL));
  531. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){
  532. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12);
  533. }
  534. else{
  535. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12_EXTEN);
  536. }
  537. /* Enable PLL */
  538. RCC->CTLR |= RCC_PLLON;
  539. /* Wait till PLL is ready */
  540. while((RCC->CTLR & RCC_PLLRDY) == 0)
  541. {
  542. }
  543. /* Select PLL as system clock source */
  544. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  545. RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
  546. /* Wait till PLL is used as system clock source */
  547. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
  548. {
  549. }
  550. }
  551. else
  552. {
  553. /*
  554. * If HSE fails to start-up, the application will have wrong clock
  555. * configuration. User can add here some code to deal with this error
  556. */
  557. }
  558. }
  559. #elif defined SYSCLK_FREQ_120MHz
  560. /******************************************************************************************
  561. * Function Name : SetSysClockTo120
  562. * Description : Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  563. * Input : None
  564. * Return : None
  565. *******************************************************************************************/
  566. static void SetSysClockTo120(void)
  567. {
  568. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  569. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  570. /* Wait till HSE is ready and if Time out is reached exit */
  571. do
  572. {
  573. HSEStatus = RCC->CTLR & RCC_HSERDY;
  574. StartUpCounter++;
  575. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  576. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  577. {
  578. HSEStatus = (uint32_t)0x01;
  579. }
  580. else
  581. {
  582. HSEStatus = (uint32_t)0x00;
  583. }
  584. if (HSEStatus == (uint32_t)0x01)
  585. {
  586. /* Enable Prefetch Buffer */
  587. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  588. /* Flash 2 wait state */
  589. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  590. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
  591. /* HCLK = SYSCLK */
  592. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  593. /* PCLK2 = HCLK */
  594. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  595. /* PCLK1 = HCLK */
  596. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
  597. /* PLL configuration: PLLCLK = HSE * 15 = 120 MHz */
  598. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
  599. RCC_PLLMULL));
  600. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){
  601. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15);
  602. }
  603. else{
  604. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15_EXTEN);
  605. }
  606. /* Enable PLL */
  607. RCC->CTLR |= RCC_PLLON;
  608. /* Wait till PLL is ready */
  609. while((RCC->CTLR & RCC_PLLRDY) == 0)
  610. {
  611. }
  612. /* Select PLL as system clock source */
  613. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  614. RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
  615. /* Wait till PLL is used as system clock source */
  616. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
  617. {
  618. }
  619. }
  620. else
  621. {
  622. /*
  623. * If HSE fails to start-up, the application will have wrong clock
  624. * configuration. User can add here some code to deal with this error
  625. */
  626. }
  627. }
  628. #elif defined SYSCLK_FREQ_144MHz
  629. /******************************************************************************************
  630. * Function Name : SetSysClockTo144
  631. * Description : Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  632. * Input : None
  633. * Return : None
  634. *******************************************************************************************/
  635. static void SetSysClockTo144(void)
  636. {
  637. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  638. RCC->CTLR |= ((uint32_t)RCC_HSEON);
  639. /* Wait till HSE is ready and if Time out is reached exit */
  640. do
  641. {
  642. HSEStatus = RCC->CTLR & RCC_HSERDY;
  643. StartUpCounter++;
  644. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  645. if ((RCC->CTLR & RCC_HSERDY) != RESET)
  646. {
  647. HSEStatus = (uint32_t)0x01;
  648. }
  649. else
  650. {
  651. HSEStatus = (uint32_t)0x00;
  652. }
  653. if (HSEStatus == (uint32_t)0x01)
  654. {
  655. /* Enable Prefetch Buffer */
  656. FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
  657. /* Flash 2 wait state */
  658. FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
  659. FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
  660. /* HCLK = SYSCLK */
  661. RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
  662. /* PCLK2 = HCLK */
  663. RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
  664. /* PCLK1 = HCLK */
  665. RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
  666. /* PLL configuration: PLLCLK = HSE * 18 = 144 MHz */
  667. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
  668. RCC_PLLMULL));
  669. if(((*(uint32_t*)0x1FFFF70C) & (1<<14)) != (1<<14)){
  670. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18);
  671. }
  672. else{
  673. RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18_EXTEN);
  674. }
  675. /* Enable PLL */
  676. RCC->CTLR |= RCC_PLLON;
  677. /* Wait till PLL is ready */
  678. while((RCC->CTLR & RCC_PLLRDY) == 0)
  679. {
  680. }
  681. /* Select PLL as system clock source */
  682. RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
  683. RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
  684. /* Wait till PLL is used as system clock source */
  685. while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
  686. {
  687. }
  688. }
  689. else
  690. {
  691. /*
  692. * If HSE fails to start-up, the application will have wrong clock
  693. * configuration. User can add here some code to deal with this error
  694. */
  695. }
  696. }
  697. #endif