clock_config.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. /*
  2. * Copyright 2017 NXP
  3. * All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-3-Clause
  6. */
  7. /*
  8. * How to setup clock using clock driver functions:
  9. *
  10. * 1. Call CLOCK_InitXXX() to configure corresponding SCG clock source.
  11. * Note: The clock could not be set when it is being used as system clock.
  12. * In default out of reset, the CPU is clocked from FIRC(IRC48M),
  13. * so before setting FIRC, change to use another avaliable clock source.
  14. *
  15. * 2. Call CLOCK_SetXtal0Freq() to set XTAL0 frequency based on board settings.
  16. *
  17. * 3. Call CLOCK_SetXxxModeSysClkConfig() to set SCG mode for Xxx run mode.
  18. * Wait until the system clock source is changed to target source.
  19. *
  20. * 4. If power mode change is needed, call SMC_SetPowerModeProtection() to allow
  21. * corresponding power mode and SMC_SetPowerModeXxx() to change to Xxx mode.
  22. * Supported run mode and clock restrictions could be found in Reference Manual.
  23. */
  24. /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
  25. !!GlobalInfo
  26. product: Clocks v3.0
  27. processor: RV32M1
  28. package_id: RV32M1
  29. mcu_data: ksdk2_0
  30. processor_version: 0.0.0
  31. board: RV32M1_VEGA
  32. * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
  33. #include "fsl_msmc.h"
  34. #include "clock_config.h"
  35. /*******************************************************************************
  36. * Definitions
  37. ******************************************************************************/
  38. #define SCG_LPFLL_DISABLE 0U /*!< LPFLL clock disabled */
  39. #define SCG_SOSC_DISABLE 0U /*!< System OSC disabled */
  40. /*******************************************************************************
  41. * Variables
  42. ******************************************************************************/
  43. /* System clock frequency. */
  44. extern uint32_t SystemCoreClock;
  45. /*******************************************************************************
  46. * Code
  47. ******************************************************************************/
  48. #ifndef SDK_SECONDARY_CORE
  49. /*FUNCTION**********************************************************************
  50. *
  51. * Function Name : CLOCK_CONFIG_FircSafeConfig
  52. * Description : This function is used to safely configure FIRC clock.
  53. * In default out of reset, the CPU is clocked from FIRC(IRC48M).
  54. * Before setting FIRC, change to use SIRC as system clock,
  55. * then configure FIRC.
  56. * Param fircConfig : FIRC configuration.
  57. *
  58. *END**************************************************************************/
  59. static void CLOCK_CONFIG_FircSafeConfig(const scg_firc_config_t *fircConfig)
  60. {
  61. scg_sys_clk_config_t curConfig;
  62. const scg_sirc_config_t scgSircConfig = {.enableMode = kSCG_SircEnable,
  63. .div1 = kSCG_AsyncClkDisable,
  64. .div2 = kSCG_AsyncClkDivBy2,
  65. .range = kSCG_SircRangeHigh};
  66. scg_sys_clk_config_t sysClkSafeConfigSource = {
  67. .divSlow = kSCG_SysClkDivBy4, /* Slow clock divider. */
  68. .divCore = kSCG_SysClkDivBy1, /* Core clock divider. */
  69. .src = kSCG_SysClkSrcSirc /* System clock source. */
  70. };
  71. /* Init Sirc */
  72. CLOCK_InitSirc(&scgSircConfig);
  73. /* Change to use SIRC as system clock source to prepare to change FIRCCFG register */
  74. CLOCK_SetRunModeSysClkConfig(&sysClkSafeConfigSource);
  75. /* Wait for clock source switch finished */
  76. do
  77. {
  78. CLOCK_GetCurSysClkConfig(&curConfig);
  79. } while (curConfig.src != sysClkSafeConfigSource.src);
  80. /* Init Firc */
  81. CLOCK_InitFirc(fircConfig);
  82. }
  83. #endif
  84. /*******************************************************************************
  85. ************************ BOARD_InitBootClocks function ************************
  86. ******************************************************************************/
  87. void BOARD_InitBootClocks(void)
  88. {
  89. BOARD_BootClockRUN();
  90. }
  91. /*******************************************************************************
  92. ********************** Configuration BOARD_BootClockRUN ***********************
  93. ******************************************************************************/
  94. /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
  95. !!Configuration
  96. name: BOARD_BootClockRUN
  97. called_from_default_init: true
  98. outputs:
  99. - {id: Bus_clock.outFreq, value: 48 MHz}
  100. - {id: Core_clock.outFreq, value: 48 MHz}
  101. - {id: FIRCDIV1_CLK.outFreq, value: 48 MHz}
  102. - {id: FIRCDIV2_CLK.outFreq, value: 48 MHz}
  103. - {id: FIRCDIV3_CLK.outFreq, value: 48 MHz}
  104. - {id: LPO_CLK.outFreq, value: 1 kHz}
  105. - {id: Platform_clock.outFreq, value: 48 MHz}
  106. - {id: SIRCDIV3_CLK.outFreq, value: 8 MHz}
  107. - {id: Slow_clock.outFreq, value: 24 MHz}
  108. - {id: System_clock.outFreq, value: 48 MHz}
  109. settings:
  110. - {id: SCG.FIRCDIV1.scale, value: '1', locked: true}
  111. - {id: SCG.FIRCDIV2.scale, value: '1', locked: true}
  112. - {id: SCG.FIRCDIV3.scale, value: '1', locked: true}
  113. - {id: SCG.LPFLLDIV1.scale, value: '1', locked: true}
  114. - {id: SCG.LPFLLDIV3.scale, value: '0', locked: true}
  115. - {id: SCG.SIRCDIV1.scale, value: '0', locked: true}
  116. - {id: SCG.SIRCDIV3.scale, value: '1', locked: true}
  117. * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
  118. /*******************************************************************************
  119. * Variables for BOARD_BootClockRUN configuration
  120. ******************************************************************************/
  121. const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockRUN =
  122. {
  123. .divSlow = kSCG_SysClkDivBy2, /* Slow Clock Divider: divided by 2 */
  124. .divBus = kSCG_SysClkDivBy1, /* Bus Clock Divider: divided by 1 */
  125. .divExt = kSCG_SysClkDivBy1, /* External Clock Divider: divided by 1 */
  126. .divCore = kSCG_SysClkDivBy1, /* Core Clock Divider: divided by 1 */
  127. .src = kSCG_SysClkSrcFirc, /* Fast IRC is selected as System Clock Source */
  128. };
  129. const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockRUN =
  130. {
  131. .freq = 0U, /* System Oscillator frequency: 0Hz */
  132. .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */
  133. .enableMode = SCG_SOSC_DISABLE, /* System OSC disabled */
  134. .div1 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 1: Clock output is disabled */
  135. .div2 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 2: Clock output is disabled */
  136. .div3 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 3: Clock output is disabled */
  137. };
  138. const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockRUN =
  139. {
  140. .enableMode = kSCG_SircEnable | kSCG_SircEnableInLowPower,/* Enable SIRC clock, Enable SIRC in low power mode */
  141. .div1 = kSCG_AsyncClkDisable, /* Slow IRC Clock Divider 1: Clock output is disabled */
  142. .div2 = kSCG_AsyncClkDisable, /* Slow IRC Clock Divider 2: Clock output is disabled */
  143. .div3 = kSCG_AsyncClkDivBy1, /* Slow IRC Clock Divider 3: divided by 1 */
  144. .range = kSCG_SircRangeHigh, /* Slow IRC high range clock (8 MHz) */
  145. };
  146. const scg_firc_config_t g_scgFircConfig_BOARD_BootClockRUN =
  147. {
  148. .enableMode = kSCG_FircEnable, /* Enable FIRC clock */
  149. .div1 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 1: divided by 1 */
  150. .div2 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 2: divided by 1 */
  151. .div3 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 3: divided by 1 */
  152. .range = kSCG_FircRange48M, /* Fast IRC is trimmed to 48MHz */
  153. .trimConfig = NULL,
  154. };
  155. const scg_lpfll_config_t g_scgLpFllConfig_BOARD_BootClockRUN =
  156. {
  157. .enableMode = SCG_LPFLL_DISABLE, /* LPFLL clock disabled */
  158. .div1 = kSCG_AsyncClkDivBy1, /* Low Power FLL Clock Divider 1: divided by 1 */
  159. .div2 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 2: Clock output is disabled */
  160. .div3 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 3: Clock output is disabled */
  161. .range = kSCG_LpFllRange48M, /* LPFLL is trimmed to 48MHz */
  162. .trimConfig = NULL,
  163. };
  164. /*******************************************************************************
  165. * Code for BOARD_BootClockRUN configuration
  166. ******************************************************************************/
  167. void BOARD_BootClockRUN(void)
  168. {
  169. #ifndef SDK_SECONDARY_CORE
  170. scg_sys_clk_config_t curConfig;
  171. /* Init FIRC */
  172. CLOCK_CONFIG_FircSafeConfig(&g_scgFircConfig_BOARD_BootClockRUN);
  173. /* Set SCG to FIRC mode. */
  174. CLOCK_SetRunModeSysClkConfig(&g_sysClkConfig_BOARD_BootClockRUN);
  175. /* Wait for clock source switch finished */
  176. do
  177. {
  178. CLOCK_GetCurSysClkConfig(&curConfig);
  179. } while (curConfig.src != g_sysClkConfig_BOARD_BootClockRUN.src);
  180. /* Init SIRC */
  181. CLOCK_InitSirc(&g_scgSircConfig_BOARD_BootClockRUN);
  182. /* Init LPFLL */
  183. CLOCK_InitLpFll(&g_scgLpFllConfig_BOARD_BootClockRUN);
  184. /* Set SystemCoreClock variable. */
  185. SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
  186. #endif
  187. }
  188. /*******************************************************************************
  189. ********************* Configuration BOARD_BootClockHSRUN **********************
  190. ******************************************************************************/
  191. /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
  192. !!Configuration
  193. name: BOARD_BootClockHSRUN
  194. outputs:
  195. - {id: Bus_clock.outFreq, value: 72 MHz}
  196. - {id: Core_clock.outFreq, value: 72 MHz}
  197. - {id: FIRCDIV1_CLK.outFreq, value: 48 MHz}
  198. - {id: FIRCDIV2_CLK.outFreq, value: 48 MHz}
  199. - {id: FIRCDIV3_CLK.outFreq, value: 48 MHz}
  200. - {id: LPO_CLK.outFreq, value: 1 kHz}
  201. - {id: Platform_clock.outFreq, value: 72 MHz}
  202. - {id: SIRCDIV3_CLK.outFreq, value: 8 MHz}
  203. - {id: Slow_clock.outFreq, value: 8 MHz}
  204. - {id: System_clock.outFreq, value: 72 MHz}
  205. settings:
  206. - {id: SCGMode, value: LPFLL}
  207. - {id: powerMode, value: HSRUN}
  208. - {id: SCG.DIVCORE.scale, value: '1', locked: true}
  209. - {id: SCG.DIVSLOW.scale, value: '9'}
  210. - {id: SCG.FIRCDIV1.scale, value: '1', locked: true}
  211. - {id: SCG.FIRCDIV2.scale, value: '1', locked: true}
  212. - {id: SCG.FIRCDIV3.scale, value: '1', locked: true}
  213. - {id: SCG.LPFLLDIV1.scale, value: '0', locked: true}
  214. - {id: SCG.LPFLL_mul.scale, value: '36', locked: true}
  215. - {id: SCG.SCSSEL.sel, value: SCG.LPFLL}
  216. - {id: SCG.SIRCDIV3.scale, value: '1', locked: true}
  217. - {id: SCG.TRIMDIV.scale, value: '24'}
  218. - {id: SCG.TRIMSRCSEL.sel, value: SCG.FIRC}
  219. - {id: 'SCG::RCCR[SCS].bitField', value: '5'}
  220. - {id: SCG_LPFLLCSR_LPFLLEN_CFG, value: Enabled}
  221. * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
  222. /*******************************************************************************
  223. * Variables for BOARD_BootClockHSRUN configuration
  224. ******************************************************************************/
  225. const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockHSRUN =
  226. {
  227. .divSlow = kSCG_SysClkDivBy9, /* Slow Clock Divider: divided by 9 */
  228. .divBus = kSCG_SysClkDivBy1, /* Bus Clock Divider: divided by 1 */
  229. .divExt = kSCG_SysClkDivBy1, /* External Clock Divider: divided by 1 */
  230. .divCore = kSCG_SysClkDivBy1, /* Core Clock Divider: divided by 1 */
  231. .src = kSCG_SysClkSrcLpFll, /* Low power FLL is selected as System Clock Source */
  232. };
  233. const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockHSRUN =
  234. {
  235. .freq = 0U, /* System Oscillator frequency: 0Hz */
  236. .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */
  237. .enableMode = SCG_SOSC_DISABLE, /* System OSC disabled */
  238. .div1 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 1: Clock output is disabled */
  239. .div2 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 2: Clock output is disabled */
  240. .div3 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 3: Clock output is disabled */
  241. };
  242. const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockHSRUN =
  243. {
  244. .enableMode = kSCG_SircEnable | kSCG_SircEnableInLowPower,/* Enable SIRC clock, Enable SIRC in low power mode */
  245. .div1 = kSCG_AsyncClkDisable, /* Slow IRC Clock Divider 1: Clock output is disabled */
  246. .div2 = kSCG_AsyncClkDisable, /* Slow IRC Clock Divider 2: Clock output is disabled */
  247. .div3 = kSCG_AsyncClkDivBy1, /* Slow IRC Clock Divider 3: divided by 1 */
  248. .range = kSCG_SircRangeHigh, /* Slow IRC high range clock (8 MHz) */
  249. };
  250. const scg_firc_config_t g_scgFircConfig_BOARD_BootClockHSRUN =
  251. {
  252. .enableMode = kSCG_FircEnable, /* Enable FIRC clock */
  253. .div1 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 1: divided by 1 */
  254. .div2 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 2: divided by 1 */
  255. .div3 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 3: divided by 1 */
  256. .range = kSCG_FircRange48M, /* Fast IRC is trimmed to 48MHz */
  257. .trimConfig = NULL,
  258. };
  259. const scg_lpfll_config_t g_scgLpFllConfig_BOARD_BootClockHSRUN =
  260. {
  261. .enableMode = kSCG_LpFllEnable, /* Enable LPFLL clock */
  262. .div1 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 1: Clock output is disabled */
  263. .div2 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 2: Clock output is disabled */
  264. .div3 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 3: Clock output is disabled */
  265. .range = kSCG_LpFllRange72M, /* LPFLL is trimmed to 72MHz */
  266. .trimConfig = NULL,
  267. };
  268. /*******************************************************************************
  269. * Code for BOARD_BootClockHSRUN configuration
  270. ******************************************************************************/
  271. void BOARD_BootClockHSRUN(void)
  272. {
  273. #ifndef SDK_SECONDARY_CORE
  274. scg_sys_clk_config_t curConfig;
  275. /* Init FIRC */
  276. CLOCK_CONFIG_FircSafeConfig(&g_scgFircConfig_BOARD_BootClockHSRUN);
  277. /* Init LPFLL */
  278. CLOCK_InitLpFll(&g_scgLpFllConfig_BOARD_BootClockHSRUN);
  279. #if defined(CPU_RV32M1_cm4) || defined(CPU_RV32M1_ri5cy)
  280. /* Set HSRUN power mode */
  281. SMC_SetPowerModeProtection(SMC0, kSMC_AllowPowerModeAll);
  282. SMC_SetPowerModeHsrun(SMC0);
  283. while (SMC_GetPowerModeState(SMC0) != kSMC_PowerStateHsrun)
  284. {
  285. }
  286. #elif defined(CPU_RV32M1_cm0plus) || defined(CPU_RV32M1_zero_riscy)
  287. SMC_SetPowerModeProtection(SMC1, kSMC_AllowPowerModeAll);
  288. SMC_SetPowerModeHsrun(SMC1);
  289. while (SMC_GetPowerModeState(SMC1) != kSMC_PowerStateHsrun)
  290. {
  291. }
  292. #endif
  293. /* Set SCG to LPFLL mode. */
  294. CLOCK_SetHsrunModeSysClkConfig(&g_sysClkConfig_BOARD_BootClockHSRUN);
  295. /* Wait for clock source switch finished */
  296. do
  297. {
  298. CLOCK_GetCurSysClkConfig(&curConfig);
  299. } while (curConfig.src != g_sysClkConfig_BOARD_BootClockHSRUN.src);
  300. /* Init SIRC */
  301. CLOCK_InitSirc(&g_scgSircConfig_BOARD_BootClockHSRUN);
  302. /* Set SystemCoreClock variable. */
  303. SystemCoreClock = BOARD_BOOTCLOCKHSRUN_CORE_CLOCK;
  304. #endif
  305. }
  306. /*******************************************************************************
  307. ********************* Configuration BOARD_BootClockVLPR ***********************
  308. ******************************************************************************/
  309. /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
  310. !!Configuration
  311. name: BOARD_BootClockVLPR
  312. outputs:
  313. - {id: Bus_clock.outFreq, value: 2 MHz}
  314. - {id: Core_clock.outFreq, value: 4 MHz}
  315. - {id: LPO_CLK.outFreq, value: 1 kHz}
  316. - {id: Platform_clock.outFreq, value: 4 MHz}
  317. - {id: SIRCDIV1_CLK.outFreq, value: 8 MHz}
  318. - {id: SIRCDIV2_CLK.outFreq, value: 8 MHz}
  319. - {id: SIRCDIV3_CLK.outFreq, value: 8 MHz}
  320. - {id: Slow_clock.outFreq, value: 4000/9 kHz}
  321. - {id: System_clock.outFreq, value: 4 MHz}
  322. settings:
  323. - {id: SCGMode, value: SIRC}
  324. - {id: powerMode, value: VLPR}
  325. - {id: SCG.DIVBUS.scale, value: '2', locked: true}
  326. - {id: SCG.DIVCORE.scale, value: '2', locked: true}
  327. - {id: SCG.DIVSLOW.scale, value: '9'}
  328. - {id: SCG.FIRCDIV1.scale, value: '1'}
  329. - {id: SCG.SCSSEL.sel, value: SCG.SIRC}
  330. - {id: SCG.SIRCDIV1.scale, value: '1', locked: true}
  331. - {id: SCG.SIRCDIV2.scale, value: '1', locked: true}
  332. - {id: SCG.SIRCDIV3.scale, value: '1', locked: true}
  333. * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
  334. /*******************************************************************************
  335. * Variables for BOARD_BootClockVLPR configuration
  336. ******************************************************************************/
  337. const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockVLPR =
  338. {
  339. .divSlow = kSCG_SysClkDivBy9, /* Slow Clock Divider: divided by 9 */
  340. .divBus = kSCG_SysClkDivBy2, /* Bus Clock Divider: divided by 2 */
  341. .divExt = kSCG_SysClkDivBy1, /* External Clock Divider: divided by 1 */
  342. .divCore = kSCG_SysClkDivBy2, /* Core Clock Divider: divided by 2 */
  343. .src = kSCG_SysClkSrcSirc, /* Slow IRC is selected as System Clock Source */
  344. };
  345. const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockVLPR =
  346. {
  347. .freq = 0U, /* System Oscillator frequency: 0Hz */
  348. .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */
  349. .enableMode = SCG_SOSC_DISABLE, /* System OSC disabled */
  350. .div1 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 1: Clock output is disabled */
  351. .div2 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 2: Clock output is disabled */
  352. .div3 = kSCG_AsyncClkDisable, /* System OSC Clock Divider 3: Clock output is disabled */
  353. };
  354. const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockVLPR =
  355. {
  356. .enableMode = kSCG_SircEnable | kSCG_SircEnableInLowPower,/* Enable SIRC clock, Enable SIRC in low power mode */
  357. .div1 = kSCG_AsyncClkDivBy1, /* Slow IRC Clock Divider 1: divided by 1 */
  358. .div2 = kSCG_AsyncClkDivBy1, /* Slow IRC Clock Divider 2: divided by 1 */
  359. .div3 = kSCG_AsyncClkDivBy1, /* Slow IRC Clock Divider 3: divided by 1 */
  360. .range = kSCG_SircRangeHigh, /* Slow IRC high range clock (8 MHz) */
  361. };
  362. const scg_firc_config_t g_scgFircConfig_BOARD_BootClockVLPR =
  363. {
  364. .enableMode = kSCG_FircEnable, /* Enable FIRC clock */
  365. .div1 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 1: divided by 1 */
  366. .div2 = kSCG_AsyncClkDisable, /* Fast IRC Clock Divider 2: Clock output is disabled */
  367. .div3 = kSCG_AsyncClkDisable, /* Fast IRC Clock Divider 3: Clock output is disabled */
  368. .range = kSCG_FircRange48M, /* Fast IRC is trimmed to 48MHz */
  369. .trimConfig = NULL,
  370. };
  371. const scg_lpfll_config_t g_scgLpFllConfig_BOARD_BootClockVLPR =
  372. {
  373. .enableMode = SCG_LPFLL_DISABLE, /* LPFLL clock disabled */
  374. .div1 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 1: Clock output is disabled */
  375. .div2 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 2: Clock output is disabled */
  376. .div3 = kSCG_AsyncClkDisable, /* Low Power FLL Clock Divider 3: Clock output is disabled */
  377. .range = kSCG_LpFllRange48M, /* LPFLL is trimmed to 48MHz */
  378. .trimConfig = NULL,
  379. };
  380. /*******************************************************************************
  381. * Code for BOARD_BootClockVLPR configuration
  382. ******************************************************************************/
  383. void BOARD_BootClockVLPR(void)
  384. {
  385. #ifndef SDK_SECONDARY_CORE
  386. scg_sys_clk_config_t curConfig;
  387. /* Init SIRC */
  388. CLOCK_InitSirc(&g_scgSircConfig_BOARD_BootClockVLPR);
  389. /* Set SCG to SIRC mode. */
  390. CLOCK_SetVlprModeSysClkConfig(&g_sysClkConfig_BOARD_BootClockVLPR);
  391. /* Init FIRC */
  392. CLOCK_InitFirc(&g_scgFircConfig_BOARD_BootClockVLPR);
  393. /* Init LPFLL */
  394. CLOCK_InitLpFll(&g_scgLpFllConfig_BOARD_BootClockVLPR);
  395. #if defined(CPU_RV32M1_cm4) || defined(CPU_RV32M1_ri5cy)
  396. /* Set VLPR power mode. */
  397. SMC_SetPowerModeProtection(SMC0, kSMC_AllowPowerModeAll);
  398. SMC_SetPowerModeVlpr(SMC0);
  399. while (SMC_GetPowerModeState(SMC0) != kSMC_PowerStateVlpr)
  400. {
  401. }
  402. #elif defined(CPU_RV32M1_cm0plus) || defined(CPU_RV32M1_zero_riscy)
  403. /* Set VLPR power mode. */
  404. SMC_SetPowerModeProtection(SMC1, kSMC_AllowPowerModeAll);
  405. SMC_SetPowerModeVlpr(SMC1);
  406. while (SMC_GetPowerModeState(SMC1) != kSMC_PowerStateVlpr)
  407. {
  408. }
  409. #endif
  410. /* Wait for clock source switch finished */
  411. do
  412. {
  413. CLOCK_GetCurSysClkConfig(&curConfig);
  414. } while (curConfig.src != g_sysClkConfig_BOARD_BootClockVLPR.src);
  415. /* Set SystemCoreClock variable. */
  416. SystemCoreClock = BOARD_BOOTCLOCKVLPR_CORE_CLOCK;
  417. #endif
  418. }