system_MCIMX6Y2.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. /*
  2. ** ###################################################################
  3. ** Processors: MCIMX6Y2CVM05
  4. ** MCIMX6Y2CVM08
  5. ** MCIMX6Y2DVM05
  6. ** MCIMX6Y2DVM09
  7. **
  8. ** Compilers: Keil ARM C/C++ Compiler
  9. ** GNU C Compiler
  10. ** IAR ANSI C/C++ Compiler for ARM
  11. **
  12. ** Reference manual: IMX6ULLRM, Rev. 1, Feb. 2017
  13. ** Version: rev. 3.0, 2017-02-28
  14. ** Build: b170410
  15. **
  16. ** Abstract:
  17. ** Provides a system configuration function and a global variable that
  18. ** contains the system frequency. It configures the device and initializes
  19. ** the oscillator (PLL) that is part of the microcontroller device.
  20. **
  21. ** Copyright 2016 Freescale Semiconductor, Inc.
  22. ** Copyright 2016-2017 NXP
  23. ** Redistribution and use in source and binary forms, with or without modification,
  24. ** are permitted provided that the following conditions are met:
  25. **
  26. ** o Redistributions of source code must retain the above copyright notice, this list
  27. ** of conditions and the following disclaimer.
  28. **
  29. ** o Redistributions in binary form must reproduce the above copyright notice, this
  30. ** list of conditions and the following disclaimer in the documentation and/or
  31. ** other materials provided with the distribution.
  32. **
  33. ** o Neither the name of the copyright holder nor the names of its
  34. ** contributors may be used to endorse or promote products derived from this
  35. ** software without specific prior written permission.
  36. **
  37. ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  38. ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  39. ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  40. ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  41. ** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  42. ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  43. ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  44. ** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  45. ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  46. ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  47. **
  48. ** http: www.nxp.com
  49. ** mail: support@nxp.com
  50. **
  51. ** Revisions:
  52. ** - rev. 1.0 (2015-12-18)
  53. ** Initial version.
  54. ** - rev. 2.0 (2016-08-02)
  55. ** Rev.B Header GA
  56. ** - rev. 3.0 (2017-02-28)
  57. ** Rev.1 Header GA
  58. **
  59. ** ###################################################################
  60. */
  61. /*!
  62. * @file MCIMX6Y2
  63. * @version 3.0
  64. * @date 2017-02-28
  65. * @brief Device specific configuration file for MCIMX6Y2 (implementation file)
  66. *
  67. * Provides a system configuration function and a global variable that contains
  68. * the system frequency. It configures the device and initializes the oscillator
  69. * (PLL) that is part of the microcontroller device.
  70. */
  71. #include <stdint.h>
  72. #include "fsl_device_registers.h"
  73. /* Transaction Drivers Handler Declaration */
  74. extern void CAN1_DriverIRQHandler (uint32_t giccIar, void *userParam);
  75. extern void CAN2_DriverIRQHandler (uint32_t giccIar, void *userParam);
  76. extern void ECSPI1_DriverIRQHandler (uint32_t giccIar, void *userParam);
  77. extern void ECSPI2_DriverIRQHandler (uint32_t giccIar, void *userParam);
  78. extern void ECSPI3_DriverIRQHandler (uint32_t giccIar, void *userParam);
  79. extern void ECSPI4_DriverIRQHandler (uint32_t giccIar, void *userParam);
  80. extern void ENET1_DriverIRQHandler (uint32_t giccIar, void *userParam);
  81. extern void ENET1_Driver1588IRQHandler (uint32_t giccIar, void *userParam);
  82. extern void ENET2_DriverIRQHandler (uint32_t giccIar, void *userParam);
  83. extern void ENET2_Driver1588IRQHandler (uint32_t giccIar, void *userParam);
  84. extern void I2C1_DriverIRQHandler (uint32_t giccIar, void *userParam);
  85. extern void I2C2_DriverIRQHandler (uint32_t giccIar, void *userParam);
  86. extern void I2C3_DriverIRQHandler (uint32_t giccIar, void *userParam);
  87. extern void I2C4_DriverIRQHandler (uint32_t giccIar, void *userParam);
  88. extern void I2S1_DriverIRQHandler (uint32_t giccIar, void *userParam);
  89. extern void I2S2_DriverIRQHandler (uint32_t giccIar, void *userParam);
  90. extern void I2S3_Tx_DriverIRQHandler (uint32_t giccIar, void *userParam);
  91. extern void I2S3_Rx_DriverIRQHandler (uint32_t giccIar, void *userParam);
  92. extern void UART1_DriverIRQHandler (uint32_t giccIar, void *userParam);
  93. extern void UART2_DriverIRQHandler (uint32_t giccIar, void *userParam);
  94. extern void UART3_DriverIRQHandler (uint32_t giccIar, void *userParam);
  95. extern void UART4_DriverIRQHandler (uint32_t giccIar, void *userParam);
  96. extern void UART5_DriverIRQHandler (uint32_t giccIar, void *userParam);
  97. extern void UART6_DriverIRQHandler (uint32_t giccIar, void *userParam);
  98. extern void UART7_DriverIRQHandler (uint32_t giccIar, void *userParam);
  99. extern void UART8_DriverIRQHandler (uint32_t giccIar, void *userParam);
  100. extern void USDHC1_DriverIRQHandler (uint32_t giccIar, void *userParam);
  101. extern void USDHC2_DriverIRQHandler (uint32_t giccIar, void *userParam);
  102. extern void SDMA_DriverIRQHandler (uint32_t giccIar, void *userParam);
  103. #if defined(__IAR_SYSTEMS_ICC__)
  104. #pragma weak CAN1_DriverIRQHandler=defaultIrqHandler
  105. #pragma weak CAN2_DriverIRQHandler=defaultIrqHandler
  106. #pragma weak ECSPI1_DriverIRQHandler=defaultIrqHandler
  107. #pragma weak ECSPI2_DriverIRQHandler=defaultIrqHandler
  108. #pragma weak ECSPI3_DriverIRQHandler=defaultIrqHandler
  109. #pragma weak ECSPI4_DriverIRQHandler=defaultIrqHandler
  110. #pragma weak ENET1_DriverIRQHandler=defaultIrqHandler
  111. #pragma weak ENET2_DriverIRQHandler=defaultIrqHandler
  112. #pragma weak ENET1_Driver1588IRQHandler=defaultIrqHandler
  113. #pragma weak ENET2_Driver1588IRQHandler=defaultIrqHandler
  114. #pragma weak I2C1_DriverIRQHandler=defaultIrqHandler
  115. #pragma weak I2C2_DriverIRQHandler=defaultIrqHandler
  116. #pragma weak I2C3_DriverIRQHandler=defaultIrqHandler
  117. #pragma weak I2C4_DriverIRQHandler=defaultIrqHandler
  118. #pragma weak I2S1_DriverIRQHandler=defaultIrqHandler
  119. #pragma weak I2S2_DriverIRQHandler=defaultIrqHandler
  120. #pragma weak I2S3_Tx_DriverIRQHandler=defaultIrqHandler
  121. #pragma weak I2S3_Rx_DriverIRQHandler=defaultIrqHandler
  122. #pragma weak UART1_DriverIRQHandler=defaultIrqHandler
  123. #pragma weak UART2_DriverIRQHandler=defaultIrqHandler
  124. #pragma weak UART3_DriverIRQHandler=defaultIrqHandler
  125. #pragma weak UART4_DriverIRQHandler=defaultIrqHandler
  126. #pragma weak UART5_DriverIRQHandler=defaultIrqHandler
  127. #pragma weak UART6_DriverIRQHandler=defaultIrqHandler
  128. #pragma weak UART7_DriverIRQHandler=defaultIrqHandler
  129. #pragma weak UART8_DriverIRQHandler=defaultIrqHandler
  130. #pragma weak USDHC1_DriverIRQHandler=defaultIrqHandler
  131. #pragma weak USDHC2_DriverIRQHandler=defaultIrqHandler
  132. #pragma weak SDMA_DriverIRQHandler=defaultIrqHandler
  133. #elif defined(__GNUC__)
  134. void CAN1_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  135. void CAN2_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  136. void ECSPI1_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  137. void ECSPI2_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  138. void ECSPI3_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  139. void ECSPI4_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  140. void ENET1_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  141. void ENET2_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  142. void ENET1_Driver1588IRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  143. void ENET2_Driver1588IRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  144. void I2C1_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  145. void I2C2_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  146. void I2C3_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  147. void I2C4_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  148. void I2S1_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  149. void I2S2_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  150. void I2S3_Tx_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  151. void I2S3_Rx_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  152. void UART1_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  153. void UART2_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  154. void UART3_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  155. void UART4_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  156. void UART5_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  157. void UART6_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  158. void UART7_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  159. void UART8_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  160. void USDHC1_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  161. void USDHC2_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  162. void SDMA_DriverIRQHandler() __attribute__((weak, alias("defaultIrqHandler")));
  163. #else
  164. #error Not supported compiler type
  165. #endif
  166. extern uint32_t __VECTOR_TABLE[];
  167. /* Local irq table and nesting level value */
  168. static sys_irq_handle_t irqTable[NUMBER_OF_INT_VECTORS];
  169. static uint32_t irqNesting;
  170. /* Local IRQ functions */
  171. static void defaultIrqHandler (uint32_t giccIar, void *userParam) {
  172. while(1) {
  173. }
  174. }
  175. /* ----------------------------------------------------------------------------
  176. -- Core clock
  177. ---------------------------------------------------------------------------- */
  178. uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
  179. /* ----------------------------------------------------------------------------
  180. -- SystemInit()
  181. ---------------------------------------------------------------------------- */
  182. void SystemInit (void) {
  183. uint32_t sctlr;
  184. uint32_t actlr;
  185. #if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
  186. uint32_t cpacr;
  187. uint32_t fpexc;
  188. #endif
  189. L1C_InvalidateInstructionCacheAll();
  190. L1C_InvalidateDataCacheAll();
  191. actlr = __get_ACTLR();
  192. actlr = (actlr | ACTLR_SMP_Msk); /* Change to SMP mode before enable DCache */
  193. __set_ACTLR(actlr);
  194. sctlr = __get_SCTLR();
  195. sctlr = (sctlr & ~(SCTLR_V_Msk | /* Use low vector */
  196. SCTLR_A_Msk | /* Disable alignment fault checking */
  197. SCTLR_M_Msk)) /* Disable MMU */
  198. | (SCTLR_I_Msk | /* Enable ICache */
  199. SCTLR_Z_Msk | /* Enable Prediction */
  200. SCTLR_CP15BEN_Msk | /* Enable CP15 barrier operations */
  201. SCTLR_C_Msk); /* Enable DCache */
  202. __set_SCTLR(sctlr);
  203. /* Set vector base address */
  204. GIC_Init();
  205. __set_VBAR((uint32_t)__VECTOR_TABLE);
  206. #if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
  207. cpacr = __get_CPACR();
  208. /* Enable NEON and FPU */
  209. cpacr = (cpacr & ~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))
  210. | (3UL << CPACR_cp10_Pos) | (3UL << CPACR_cp11_Pos);
  211. __set_CPACR(cpacr);
  212. fpexc = __get_FPEXC();
  213. fpexc |= 0x40000000UL; /* Enable NEON and FPU */
  214. __set_FPEXC(fpexc);
  215. #endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
  216. }
  217. /* ----------------------------------------------------------------------------
  218. -- SystemCoreClockUpdate()
  219. ---------------------------------------------------------------------------- */
  220. void SystemCoreClockUpdate (void) {
  221. /* i.MX6ULL systemCoreClockUpdate */
  222. uint32_t PLL1SWClock;
  223. uint32_t PLL2MainClock;
  224. if (CCM->CCSR & CCM_CCSR_PLL1_SW_CLK_SEL_MASK)
  225. {
  226. if (CCM->CCSR & CCM_CCSR_STEP_SEL_MASK)
  227. {
  228. /* Get SYS PLL clock*/
  229. if (CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK)
  230. {
  231. PLL2MainClock = (24000000UL * 22UL + (uint64_t)(24000000UL) * (uint64_t)(CCM_ANALOG->PLL_SYS_NUM) / (uint64_t)(CCM_ANALOG->PLL_SYS_DENOM));
  232. }
  233. else
  234. {
  235. PLL2MainClock = (24000000UL * 20UL + (uint64_t)(24000000UL) * (uint64_t)(CCM_ANALOG->PLL_SYS_NUM) / (uint64_t)(CCM_ANALOG->PLL_SYS_DENOM));
  236. }
  237. if (CCM->CCSR & CCM_CCSR_SECONDARY_CLK_SEL_MASK)
  238. {
  239. /* PLL2 ---> Secondary_clk ---> Step Clock ---> CPU Clock */
  240. PLL1SWClock = PLL2MainClock;
  241. }
  242. else
  243. {
  244. /* PLL2 PFD2 ---> Secondary_clk ---> Step Clock ---> CPU Clock */
  245. PLL1SWClock = ((uint64_t)PLL2MainClock * 18) / ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD2_FRAC_SHIFT);
  246. }
  247. }
  248. else
  249. {
  250. /* Osc_clk (24M) ---> Step Clock ---> CPU Clock */
  251. PLL1SWClock = 24000000UL;
  252. }
  253. }
  254. else
  255. {
  256. /* ARM PLL ---> CPU Clock */
  257. PLL1SWClock = 24000000UL;
  258. PLL1SWClock = ( PLL1SWClock * (CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK) >> CCM_ANALOG_PLL_ARM_DIV_SELECT_SHIFT) >> 1UL;
  259. }
  260. SystemCoreClock = PLL1SWClock / (((CCM->CACRR & CCM_CACRR_ARM_PODF_MASK) >> CCM_CACRR_ARM_PODF_SHIFT) + 1UL);
  261. }
  262. /* ----------------------------------------------------------------------------
  263. -- SystemInitIrqTable()
  264. ---------------------------------------------------------------------------- */
  265. void SystemInitIrqTable (void) {
  266. uint32_t i;
  267. /* First set all handler to default */
  268. for (i = 0; i < NUMBER_OF_INT_VECTORS; i++) {
  269. SystemInstallIrqHandler((IRQn_Type)i, defaultIrqHandler, NULL);
  270. }
  271. /* Then set transaction drivers handler */
  272. /* FlexCAN transaction drivers handler */
  273. SystemInstallIrqHandler(CAN1_IRQn, CAN1_DriverIRQHandler, NULL);
  274. SystemInstallIrqHandler(CAN2_IRQn, CAN2_DriverIRQHandler, NULL);
  275. /* ECSPI transaction drivers handler */
  276. SystemInstallIrqHandler(eCSPI1_IRQn, ECSPI1_DriverIRQHandler, NULL);
  277. SystemInstallIrqHandler(eCSPI2_IRQn, ECSPI2_DriverIRQHandler, NULL);
  278. SystemInstallIrqHandler(eCSPI3_IRQn, ECSPI3_DriverIRQHandler, NULL);
  279. SystemInstallIrqHandler(eCSPI4_IRQn, ECSPI4_DriverIRQHandler, NULL);
  280. /* ENET transaction drivers handler */
  281. SystemInstallIrqHandler(ENET1_IRQn, ENET1_DriverIRQHandler, NULL);
  282. SystemInstallIrqHandler(ENET1_1588_IRQn, ENET1_Driver1588IRQHandler, NULL);
  283. SystemInstallIrqHandler(ENET2_IRQn, ENET2_DriverIRQHandler, NULL);
  284. SystemInstallIrqHandler(ENET2_1588_IRQn, ENET2_Driver1588IRQHandler, NULL);
  285. /* I2C transaction drivers handler */
  286. SystemInstallIrqHandler(I2C1_IRQn, I2C1_DriverIRQHandler, NULL);
  287. SystemInstallIrqHandler(I2C2_IRQn, I2C2_DriverIRQHandler, NULL);
  288. SystemInstallIrqHandler(I2C3_IRQn, I2C3_DriverIRQHandler, NULL);
  289. SystemInstallIrqHandler(I2C4_IRQn, I2C4_DriverIRQHandler, NULL);
  290. /* I2S transaction drivers handler */
  291. SystemInstallIrqHandler(SAI1_IRQn, I2S1_DriverIRQHandler, NULL);
  292. SystemInstallIrqHandler(SAI2_IRQn, I2S2_DriverIRQHandler, NULL);
  293. SystemInstallIrqHandler(SAI3_TX_IRQn, I2S3_Tx_DriverIRQHandler, NULL);
  294. SystemInstallIrqHandler(SAI3_RX_IRQn, I2S3_Rx_DriverIRQHandler, NULL);
  295. /* UART transaction drivers handler */
  296. SystemInstallIrqHandler(UART1_IRQn, UART1_DriverIRQHandler, NULL);
  297. SystemInstallIrqHandler(UART2_IRQn, UART2_DriverIRQHandler, NULL);
  298. SystemInstallIrqHandler(UART3_IRQn, UART3_DriverIRQHandler, NULL);
  299. SystemInstallIrqHandler(UART4_IRQn, UART4_DriverIRQHandler, NULL);
  300. SystemInstallIrqHandler(UART5_IRQn, UART5_DriverIRQHandler, NULL);
  301. SystemInstallIrqHandler(UART6_IRQn, UART6_DriverIRQHandler, NULL);
  302. SystemInstallIrqHandler(UART7_IRQn, UART7_DriverIRQHandler, NULL);
  303. SystemInstallIrqHandler(UART8_IRQn, UART8_DriverIRQHandler, NULL);
  304. /* USDHC transaction drivers handler */
  305. SystemInstallIrqHandler(USDHC1_IRQn, USDHC1_DriverIRQHandler, NULL);
  306. SystemInstallIrqHandler(USDHC2_IRQn, USDHC2_DriverIRQHandler, NULL);
  307. /* SDMA transaction driver handler */
  308. SystemInstallIrqHandler(SDMA_IRQn, SDMA_DriverIRQHandler, NULL);
  309. }
  310. /* ----------------------------------------------------------------------------
  311. -- SystemInstallIrqHandler()
  312. ---------------------------------------------------------------------------- */
  313. void SystemInstallIrqHandler(IRQn_Type irq, system_irq_handler_t handler, void *userParam) {
  314. irqTable[irq].irqHandler = handler;
  315. irqTable[irq].userParam = userParam;
  316. }
  317. /* ----------------------------------------------------------------------------
  318. -- SystemIrqHandler()
  319. ---------------------------------------------------------------------------- */
  320. #if defined(__IAR_SYSTEMS_ICC__)
  321. #pragma weak SystemIrqHandler
  322. void SystemIrqHandler(uint32_t giccIar) {
  323. #elif defined(__GNUC__)
  324. __attribute__((weak)) void SystemIrqHandler(uint32_t giccIar) {
  325. #else
  326. #error Not supported compiler type
  327. #endif
  328. uint32_t intNum = giccIar & 0x3FFUL;
  329. /* Spurious interrupt ID or Wrong interrupt number */
  330. if ((intNum == 1023) || (intNum >= NUMBER_OF_INT_VECTORS))
  331. {
  332. return;
  333. }
  334. irqNesting++;
  335. __enable_irq(); /* Support nesting interrupt */
  336. /* Now call the real irq handler for intNum */
  337. irqTable[intNum].irqHandler(giccIar, irqTable[intNum].userParam);
  338. __disable_irq();
  339. irqNesting--;
  340. }
  341. uint32_t SystemGetIRQNestingLevel(void)
  342. {
  343. return irqNesting;
  344. }
  345. /* Leverage GPT1 to provide Systick */
  346. void SystemSetupSystick(uint32_t tickRateHz, void *tickHandler, uint32_t intPriority)
  347. {
  348. uint32_t clockFreq;
  349. uint32_t spllTmp;
  350. /* Install IRQ handler for GPT1 */
  351. SystemInstallIrqHandler(GPT1_IRQn, (system_irq_handler_t)(uint32_t)tickHandler, NULL);
  352. /* Enable Systick all the time */
  353. CCM->CCGR1 |= CCM_CCGR1_CG10_MASK | CCM_CCGR1_CG11_MASK;
  354. GPT1->CR = GPT_CR_SWR_MASK;
  355. /* Wait reset finished. */
  356. while (GPT1->CR == GPT_CR_SWR_MASK)
  357. {
  358. }
  359. /* Use peripheral clock source IPG */
  360. GPT1->CR = GPT_CR_WAITEN_MASK | GPT_CR_STOPEN_MASK | GPT_CR_DOZEEN_MASK |
  361. GPT_CR_DBGEN_MASK | GPT_CR_ENMOD_MASK | GPT_CR_CLKSRC(1UL);
  362. /* Set clock divider to 1 */
  363. GPT1->PR = 0;
  364. /* Get IPG clock*/
  365. /* Periph_clk2_clk ---> Periph_clk */
  366. if (CCM->CBCDR & CCM_CBCDR_PERIPH_CLK_SEL_MASK)
  367. {
  368. switch (CCM->CBCMR & CCM_CBCMR_PERIPH_CLK2_SEL_MASK)
  369. {
  370. /* Pll3_sw_clk ---> Periph_clk2_clk ---> Periph_clk */
  371. case CCM_CBCMR_PERIPH_CLK2_SEL(0U):
  372. clockFreq = (24000000UL * ((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_DIV_SELECT_MASK) ? 22U : 20U));
  373. break;
  374. /* Osc_clk ---> Periph_clk2_clk ---> Periph_clk */
  375. case CCM_CBCMR_PERIPH_CLK2_SEL(1U):
  376. clockFreq = 24000000UL;
  377. break;
  378. case CCM_CBCMR_PERIPH_CLK2_SEL(2U):
  379. case CCM_CBCMR_PERIPH_CLK2_SEL(3U):
  380. default:
  381. clockFreq = 0U;
  382. break;
  383. }
  384. clockFreq /= (((CCM->CBCDR & CCM_CBCDR_PERIPH_CLK2_PODF_MASK) >> CCM_CBCDR_PERIPH_CLK2_PODF_SHIFT) + 1U);
  385. }
  386. /* Pll2_main_clk ---> Periph_clk */
  387. else
  388. {
  389. /* Get SYS PLL clock*/
  390. if (CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK)
  391. {
  392. spllTmp = (24000000UL * 22UL + (uint64_t)(24000000UL) * (uint64_t)(CCM_ANALOG->PLL_SYS_NUM) / (uint64_t)(CCM_ANALOG->PLL_SYS_DENOM));
  393. }
  394. else
  395. {
  396. spllTmp = (24000000UL * 20UL + (uint64_t)(24000000UL) * (uint64_t)(CCM_ANALOG->PLL_SYS_NUM) / (uint64_t)(CCM_ANALOG->PLL_SYS_DENOM));
  397. }
  398. switch (CCM->CBCMR & CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK)
  399. {
  400. /* PLL2 ---> Pll2_main_clk ---> Periph_clk */
  401. case CCM_CBCMR_PRE_PERIPH_CLK_SEL(0U):
  402. clockFreq = spllTmp;
  403. break;
  404. /* PLL2 PFD2 ---> Pll2_main_clk ---> Periph_clk */
  405. case CCM_CBCMR_PRE_PERIPH_CLK_SEL(1U):
  406. clockFreq = ((uint64_t)spllTmp * 18) / ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD2_FRAC_SHIFT);
  407. break;
  408. /* PLL2 PFD0 ---> Pll2_main_clk ---> Periph_clk */
  409. case CCM_CBCMR_PRE_PERIPH_CLK_SEL(2U):
  410. clockFreq = ((uint64_t)spllTmp * 18) / ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD0_FRAC_SHIFT);
  411. break;
  412. /* PLL2 PFD2 divided(/2) ---> Pll2_main_clk ---> Periph_clk */
  413. case CCM_CBCMR_PRE_PERIPH_CLK_SEL(3U):
  414. clockFreq = ((((uint64_t)spllTmp * 18) / ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD2_FRAC_SHIFT)) >> 1U);
  415. break;
  416. default:
  417. clockFreq = 0U;
  418. break;
  419. }
  420. }
  421. clockFreq /= (((CCM->CBCDR & CCM_CBCDR_AHB_PODF_MASK) >> CCM_CBCDR_AHB_PODF_SHIFT) + 1U);
  422. clockFreq /= (((CCM->CBCDR & CCM_CBCDR_IPG_PODF_MASK) >> CCM_CBCDR_IPG_PODF_SHIFT) + 1U);
  423. /* Set timeout value and enable interrupt */
  424. GPT1->OCR[0] = clockFreq / tickRateHz - 1UL;
  425. GPT1->IR = GPT_IR_OF1IE_MASK;
  426. /* Set interrupt priority */
  427. GIC_SetPriority(GPT1_IRQn, intPriority);
  428. /* Enable IRQ */
  429. GIC_EnableIRQ(GPT1_IRQn);
  430. /* Start GPT counter */
  431. GPT1->CR |= GPT_CR_EN_MASK;
  432. }
  433. void SystemClearSystickFlag(void)
  434. {
  435. GPT1->SR = GPT_SR_OF1_MASK;
  436. }