system_MK64F12.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /*
  2. ** ###################################################################
  3. ** Processor: MK64FN1M0VMD12
  4. ** Compilers: ARM Compiler
  5. ** Freescale C/C++ for Embedded ARM
  6. ** GNU C Compiler
  7. ** GNU C Compiler - CodeSourcery Sourcery G++
  8. ** IAR ANSI C/C++ Compiler for ARM
  9. **
  10. ** Reference manual: K64P144M120SF5RM, Rev.1, July 2013
  11. ** Version: rev. 2.1, 2013-10-29
  12. **
  13. ** Abstract:
  14. ** Provides a system configuration function and a global variable that
  15. ** contains the system frequency. It configures the device and initializes
  16. ** the oscillator (PLL) that is part of the microcontroller device.
  17. **
  18. ** Copyright: 2013 Freescale, Inc. All Rights Reserved.
  19. **
  20. ** http: www.freescale.com
  21. ** mail: support@freescale.com
  22. **
  23. ** Revisions:
  24. ** - rev. 1.0 (2013-08-12)
  25. ** Initial version.
  26. ** - rev. 2.0 (2013-10-29)
  27. ** Register accessor macros added to the memory map.
  28. ** Symbols for Processor Expert memory map compatibility added to the memory map.
  29. ** Startup file for gcc has been updated according to CMSIS 3.2.
  30. ** System initialization updated.
  31. ** MCG - registers updated.
  32. ** PORTA, PORTB, PORTC, PORTE - registers for digital filter removed.
  33. ** - rev. 2.1 (2013-10-29)
  34. ** Definition of BITBAND macros updated to support peripherals with 32-bit acces disabled.
  35. **
  36. ** ###################################################################
  37. */
  38. /*!
  39. * @file MK64F12
  40. * @version 2.1
  41. * @date 2013-10-29
  42. * @brief Device specific configuration file for MK64F12 (implementation file)
  43. *
  44. * Provides a system configuration function and a global variable that contains
  45. * the system frequency. It configures the device and initializes the oscillator
  46. * (PLL) that is part of the microcontroller device.
  47. */
  48. #include <stdint.h>
  49. #include "MK64F12.h"
  50. #define DISABLE_WDOG 1
  51. #ifndef CLOCK_SETUP
  52. #define CLOCK_SETUP 4
  53. #endif
  54. /* Predefined clock setups
  55. 0 ... Multipurpose Clock Generator (MCG) in FLL Engaged Internal (FEI) mode
  56. Default part configuration.
  57. Reference clock source for MCG module is the slow internal clock source 32.768kHz
  58. Core clock = 20.97MHz, BusClock = 20.97MHz
  59. 1 ... Multipurpose Clock Generator (MCG) in PLL Engaged External (PEE) mode
  60. Maximum achievable clock frequency configuration.
  61. Reference clock source for MCG module is an external clock source 50MHz
  62. Core clock = 120MHz, BusClock = 60MHz
  63. 2 ... Multipurpose Clock Generator (MCG) in Bypassed Low Power Internal (BLPI) mode
  64. Core clock/Bus clock derived directly from an fast internal clock 4MHz with no multiplication
  65. The clock settings is ready for Very Low Power Run mode.
  66. Core clock = 4MHz, BusClock = 4MHz
  67. 3 ... Multipurpose Clock Generator (MCG) in Bypassed Low Power External (BLPE) mode
  68. Core clock/Bus clock derived directly from the RTC oscillator clock source 32.768kHz
  69. The clock settings is ready for Very Low Power Run mode.
  70. Core clock = 32.768kHz, BusClock = 32.768kHz
  71. 4 ... Multipurpose Clock Generator (MCG) in PLL Engaged External (PEE) mode
  72. USB clock setup
  73. USB clock divider is set for USB to receive 48MHz input clock.
  74. Reference clock source for MCG module is an external clock source 50MHz
  75. USB clock divider is set for USB to receive 48MHz input clock.
  76. Core clock = 120MHz, BusClock = 60MHz
  77. */
  78. /*----------------------------------------------------------------------------
  79. Define clock source values
  80. *----------------------------------------------------------------------------*/
  81. #if (CLOCK_SETUP == 0)
  82. #define CPU_XTAL_CLK_HZ 50000000u /* Value of the external crystal or oscillator clock frequency in Hz */
  83. #define CPU_XTAL32k_CLK_HZ 32768u /* Value of the external 32k crystal or oscillator clock frequency in Hz */
  84. #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */
  85. #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */
  86. #define DEFAULT_SYSTEM_CLOCK 20485760u /* Default System clock value */
  87. #elif (CLOCK_SETUP == 1)
  88. #define CPU_XTAL_CLK_HZ 50000000u /* Value of the external crystal or oscillator clock frequency in Hz */
  89. #define CPU_XTAL32k_CLK_HZ 32768u /* Value of the external 32k crystal or oscillator clock frequency in Hz */
  90. #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */
  91. #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */
  92. #define DEFAULT_SYSTEM_CLOCK 120000000u /* Default System clock value */
  93. #elif (CLOCK_SETUP == 2)
  94. #define CPU_XTAL_CLK_HZ 50000000u /* Value of the external crystal or oscillator clock frequency in Hz */
  95. #define CPU_XTAL32k_CLK_HZ 32768u /* Value of the external 32k crystal or oscillator clock frequency in Hz */
  96. #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */
  97. #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */
  98. #define DEFAULT_SYSTEM_CLOCK 4000000u /* Default System clock value */
  99. #elif (CLOCK_SETUP == 3)
  100. #define CPU_XTAL_CLK_HZ 50000000u /* Value of the external crystal or oscillator clock frequency in Hz */
  101. #define CPU_XTAL32k_CLK_HZ 32768u /* Value of the external 32k crystal or oscillator clock frequency in Hz */
  102. #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */
  103. #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */
  104. #define DEFAULT_SYSTEM_CLOCK 32768u /* Default System clock value */
  105. #elif (CLOCK_SETUP == 4)
  106. #define CPU_XTAL_CLK_HZ 50000000u /* Value of the external crystal or oscillator clock frequency in Hz */
  107. #define CPU_XTAL32k_CLK_HZ 32768u /* Value of the external 32k crystal or oscillator clock frequency in Hz */
  108. #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */
  109. #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */
  110. #define DEFAULT_SYSTEM_CLOCK 120000000u /* Default System clock value */
  111. #endif /* (CLOCK_SETUP == 4) */
  112. /* ----------------------------------------------------------------------------
  113. -- Core clock
  114. ---------------------------------------------------------------------------- */
  115. uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
  116. /* ----------------------------------------------------------------------------
  117. -- SystemInit()
  118. ---------------------------------------------------------------------------- */
  119. void SystemInit (void) {
  120. #if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
  121. SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access */
  122. #endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
  123. #if (DISABLE_WDOG)
  124. /* Disable the WDOG module */
  125. /* WDOG->UNLOCK: WDOGUNLOCK=0xC520 */
  126. WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xC520); /* Key 1 */
  127. /* WDOG->UNLOCK: WDOGUNLOCK=0xD928 */
  128. WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xD928); /* Key 2 */
  129. /* WDOG->STCTRLH: ?=0,DISTESTWDOG=0,BYTESEL=0,TESTSEL=0,TESTWDOG=0,?=0,?=1,WAITEN=1,STOPEN=1,DBGEN=0,ALLOWUPDATE=1,WINEN=0,IRQRSTEN=0,CLKSRC=1,WDOGEN=0 */
  130. WDOG->STCTRLH = WDOG_STCTRLH_BYTESEL(0x00) |
  131. WDOG_STCTRLH_WAITEN_MASK |
  132. WDOG_STCTRLH_STOPEN_MASK |
  133. WDOG_STCTRLH_ALLOWUPDATE_MASK |
  134. WDOG_STCTRLH_CLKSRC_MASK |
  135. 0x0100U;
  136. #endif /* (DISABLE_WDOG) */
  137. /*
  138. * Release hold with ACKISO: Only has an effect if recovering from VLLSx.
  139. * if ACKISO is set you must clear ackiso before initializing the PLL
  140. * if osc enabled in low power modes - enable it first before ack
  141. */
  142. if (PMC->REGSC & PMC_REGSC_ACKISO_MASK)
  143. {
  144. PMC->REGSC |= PMC_REGSC_ACKISO_MASK;
  145. }
  146. #if (CLOCK_SETUP == 0)
  147. /* SIM->CLKDIV1: OUTDIV1=0,OUTDIV2=0,OUTDIV3=1,OUTDIV4=1,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0 */
  148. SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0x00) |
  149. SIM_CLKDIV1_OUTDIV2(0x00) |
  150. SIM_CLKDIV1_OUTDIV3(0x01) |
  151. SIM_CLKDIV1_OUTDIV4(0x01); /* Update system prescalers */
  152. /* SIM->SOPT2: PLLFLLSEL=0 */
  153. SIM->SOPT2 &= (uint32_t)~(uint32_t)(SIM_SOPT2_PLLFLLSEL_MASK); /* Select FLL as a clock source for various peripherals */
  154. /* SIM->SOPT1: OSC32KSEL=3 */
  155. SIM->SOPT1 |= SIM_SOPT1_OSC32KSEL(0x03); /* LPO 1kHz oscillator drives 32 kHz clock for various peripherals */
  156. /* Switch to FEI Mode */
  157. /* MCG->C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
  158. MCG->C1 = MCG_C1_CLKS(0x00) |
  159. MCG_C1_FRDIV(0x00) |
  160. MCG_C1_IREFS_MASK |
  161. MCG_C1_IRCLKEN_MASK;
  162. /* MCG->C2: LOCRE0=0,?=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=0 */
  163. MCG->C2 = MCG_C2_RANGE0(0x00);
  164. /* MCG->C4: DMX32=0,DRST_DRS=0 */
  165. MCG->C4 &= (uint8_t)~(uint8_t)((MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS(0x03)));
  166. /* OSC->CR: ERCLKEN=1,?=0,EREFSTEN=0,?=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  167. OSC->CR = OSC_CR_ERCLKEN_MASK;
  168. /* MCG->C7: OSCSEL=0 */
  169. MCG->C7 &= (uint8_t)~(uint8_t)(MCG_C7_OSCSEL_MASK);
  170. /* MCG->C5: ?=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */
  171. MCG->C5 = MCG_C5_PRDIV0(0x00);
  172. /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
  173. MCG->C6 = MCG_C6_VDIV0(0x00);
  174. while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
  175. }
  176. while((MCG->S & 0x0CU) != 0x00U) { /* Wait until output of the FLL is selected */
  177. }
  178. #elif (CLOCK_SETUP == 1) || (CLOCK_SETUP == 4)
  179. /* SIM->SCGC5: PORTA=1 */
  180. SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK; /* Enable clock gate for ports to enable pin routing */
  181. /* SIM->CLKDIV1: OUTDIV1=0,OUTDIV2=1,OUTDIV3=1,OUTDIV4=4,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0 */
  182. SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0x00) |
  183. SIM_CLKDIV1_OUTDIV2(0x01) |
  184. SIM_CLKDIV1_OUTDIV3(0x02) |
  185. SIM_CLKDIV1_OUTDIV4(0x04); /* Update system prescalers */
  186. /* SIM->SOPT2: PLLFLLSEL=1 */
  187. SIM->SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK; /* Select PLL as a clock source for various peripherals */
  188. /* SIM->SOPT1: OSC32KSEL=3 */
  189. SIM->SOPT1 |= SIM_SOPT1_OSC32KSEL(0x03); /* LPO 1kHz oscillator drives 32 kHz clock for various peripherals */
  190. /* PORTA->PCR[18]: ISF=0,MUX=0 */
  191. PORTA->PCR[18] &= (uint32_t)~(uint32_t)((PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x07)));
  192. /* Switch to FBE Mode */
  193. /* MCG->C2: LOCRE0=0,?=0,RANGE0=2,HGO0=0,EREFS0=0,LP=0,IRCS=0 */
  194. MCG->C2 = MCG_C2_RANGE0(0x02);
  195. /* OSC->CR: ERCLKEN=1,?=0,EREFSTEN=0,?=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  196. OSC->CR = OSC_CR_ERCLKEN_MASK;
  197. /* MCG->C7: OSCSEL=0 */
  198. MCG->C7 &= (uint8_t)~(uint8_t)(MCG_C7_OSCSEL_MASK);
  199. /* MCG->C1: CLKS=2,FRDIV=5,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  200. MCG->C1 = (MCG_C1_CLKS(0x02) | MCG_C1_FRDIV(0x07) | MCG_C1_IRCLKEN_MASK);
  201. /* MCG->C4: DMX32=0,DRST_DRS=0 */
  202. MCG->C4 &= (uint8_t)~(uint8_t)((MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS(0x03)));
  203. /* MCG->C5: ?=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0x13 */
  204. MCG->C5 = MCG_C5_PRDIV0(0x13);
  205. /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0x18 */
  206. MCG->C6 = MCG_C6_VDIV0(0x18);
  207. while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the source of the FLL reference clock is the external reference clock. */
  208. }
  209. while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */
  210. }
  211. /* Switch to PBE Mode */
  212. /* MCG->C6: LOLIE0=0,PLLS=1,CME0=0,VDIV0=0x18 */
  213. MCG->C6 = (MCG_C6_PLLS_MASK | MCG_C6_VDIV0(0x18));
  214. while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */
  215. }
  216. while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) { /* Wait until locked */
  217. }
  218. /* Switch to PEE Mode */
  219. /* MCG->C1: CLKS=0,FRDIV=5,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  220. MCG->C1 = (MCG_C1_CLKS(0x00) | MCG_C1_FRDIV(0x05) | MCG_C1_IRCLKEN_MASK);
  221. while((MCG->S & 0x0CU) != 0x0CU) { /* Wait until output of the PLL is selected */
  222. }
  223. #if (CLOCK_SETUP == 4)
  224. /* Set USB input clock to 48MHz */
  225. /* SIM->CLKDIV2: USBDIV=4,USBFRAC=1 */
  226. SIM->CLKDIV2 = (uint32_t)((SIM->CLKDIV2 & (uint32_t)~(uint32_t)(
  227. SIM_CLKDIV2_USBDIV(0x03)
  228. )) | (uint32_t)(
  229. SIM_CLKDIV2_USBDIV(0x04) |
  230. SIM_CLKDIV2_USBFRAC_MASK
  231. ));
  232. #endif
  233. #elif (CLOCK_SETUP == 2)
  234. /* SIM->CLKDIV1: OUTDIV1=0,OUTDIV2=0,OUTDIV3=0,OUTDIV4=4,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0 */
  235. SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0x00) |
  236. SIM_CLKDIV1_OUTDIV2(0x00) |
  237. SIM_CLKDIV1_OUTDIV3(0x00) |
  238. SIM_CLKDIV1_OUTDIV4(0x04); /* Update system prescalers */
  239. /* SIM->SOPT2: PLLFLLSEL=0 */
  240. SIM->SOPT2 &= (uint32_t)~(uint32_t)(SIM_SOPT2_PLLFLLSEL_MASK); /* Select FLL as a clock source for various peripherals */
  241. /* SIM->SOPT1: OSC32KSEL=3 */
  242. SIM->SOPT1 |= SIM_SOPT1_OSC32KSEL(0x03); /* LPO 1kHz oscillator drives 32 kHz clock for various peripherals */
  243. /* MCG->SC: FCRDIV=0 */
  244. MCG->SC &= (uint8_t)~(uint8_t)(MCG_SC_FCRDIV(0x07));
  245. /* Switch to FBI Mode */
  246. /* MCG->C1: CLKS=1,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
  247. MCG->C1 = MCG_C1_CLKS(0x01) |
  248. MCG_C1_FRDIV(0x00) |
  249. MCG_C1_IREFS_MASK |
  250. MCG_C1_IRCLKEN_MASK;
  251. /* MCG->C2: LOCRE0=0,?=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=1 */
  252. MCG->C2 = (MCG_C2_RANGE0(0x00) | MCG_C2_IRCS_MASK);
  253. /* MCG->C4: DMX32=0,DRST_DRS=0 */
  254. MCG->C4 &= (uint8_t)~(uint8_t)((MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS(0x03)));
  255. /* OSC->CR: ERCLKEN=1,?=0,EREFSTEN=0,?=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  256. OSC->CR = OSC_CR_ERCLKEN_MASK;
  257. /* MCG->C7: OSCSEL=0 */
  258. MCG->C7 &= (uint8_t)~(uint8_t)(MCG_C7_OSCSEL_MASK);
  259. /* MCG->C5: ?=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */
  260. MCG->C5 = MCG_C5_PRDIV0(0x00);
  261. /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
  262. MCG->C6 = MCG_C6_VDIV0(0x00);
  263. while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
  264. }
  265. while((MCG->S & 0x0CU) != 0x04U) { /* Wait until internal reference clock is selected as MCG output */
  266. }
  267. /* Switch to BLPI Mode */
  268. /* MCG->C2: LOCRE0=0,?=0,RANGE0=0,HGO0=0,EREFS0=0,LP=1,IRCS=1 */
  269. MCG->C2 = (MCG_C2_RANGE0(0x00) | MCG_C2_LP_MASK | MCG_C2_IRCS_MASK);
  270. while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
  271. }
  272. while((MCG->S & MCG_S_IRCST_MASK) == 0x00U) { /* Check that the fast external reference clock is selected. */
  273. }
  274. #elif (CLOCK_SETUP == 3)
  275. /* SIM->SCGC6: RTC=1 */
  276. SIM->SCGC6 |= SIM_SCGC6_RTC_MASK;
  277. if ((RTC->CR & RTC_CR_OSCE_MASK) == 0u) { /* Only if the OSCILLATOR is not already enabled */
  278. /* RTC->CR: SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  279. RTC->CR &= (uint32_t)~(uint32_t)(
  280. RTC_CR_SC2P_MASK |
  281. RTC_CR_SC4P_MASK |
  282. RTC_CR_SC8P_MASK |
  283. RTC_CR_SC16P_MASK
  284. );
  285. /* RTC->CR: OSCE=1 */
  286. RTC->CR |= RTC_CR_OSCE_MASK;
  287. /* RTC->CR: CLKO=0 */
  288. RTC->CR &= (uint32_t)~(uint32_t)(RTC_CR_CLKO_MASK);
  289. }
  290. /* SIM->CLKDIV1: OUTDIV1=0,OUTDIV2=0,OUTDIV3=0,OUTDIV4=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0,?=0 */
  291. SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0x00) |
  292. SIM_CLKDIV1_OUTDIV2(0x00) |
  293. SIM_CLKDIV1_OUTDIV3(0x00) |
  294. SIM_CLKDIV1_OUTDIV4(0x00); /* Update system prescalers */
  295. /* SIM->SOPT1: OSC32KSEL=2 */
  296. SIM->SOPT1 = (uint32_t)((SIM->SOPT1 & (uint32_t)~(uint32_t)(
  297. SIM_SOPT1_OSC32KSEL(0x01)
  298. )) | (uint32_t)(
  299. SIM_SOPT1_OSC32KSEL(0x02)
  300. )); /* System oscillator drives 32 kHz clock for various peripherals */
  301. /* Switch to FBE Mode */
  302. /* MCG->C2: LOCRE0=0,?=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=0 */
  303. MCG->C2 = MCG_C2_RANGE0(0x00);
  304. /* OSC->CR: ERCLKEN=1,?=0,EREFSTEN=0,?=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  305. OSC->CR = OSC_CR_ERCLKEN_MASK;
  306. /* MCG->C7: OSCSEL=1 */
  307. MCG->C7 |= MCG_C7_OSCSEL_MASK;
  308. /* MCG->C1: CLKS=2,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  309. MCG->C1 = (MCG_C1_CLKS(0x02) | MCG_C1_FRDIV(0x00) | MCG_C1_IRCLKEN_MASK);
  310. /* MCG->C4: DMX32=0,DRST_DRS=0 */
  311. MCG->C4 &= (uint8_t)~(uint8_t)((MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS(0x03)));
  312. /* MCG->C5: ?=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */
  313. MCG->C5 = MCG_C5_PRDIV0(0x00);
  314. /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
  315. MCG->C6 = MCG_C6_VDIV0(0x00);
  316. while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the source of the FLL reference clock is the external reference clock. */
  317. }
  318. while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */
  319. }
  320. /* Switch to BLPE Mode */
  321. /* MCG->C2: LOCRE0=0,?=0,RANGE0=0,HGO0=0,EREFS0=0,LP=1,IRCS=0 */
  322. MCG->C2 = (MCG_C2_RANGE0(0x00) | MCG_C2_LP_MASK);
  323. while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */
  324. }
  325. #endif
  326. }
  327. /* ----------------------------------------------------------------------------
  328. -- SystemCoreClockUpdate()
  329. ---------------------------------------------------------------------------- */
  330. void SystemCoreClockUpdate (void) {
  331. uint32_t MCGOUTClock; /* Variable to store output clock frequency of the MCG module */
  332. uint8_t Divider;
  333. if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x0u) {
  334. /* Output of FLL or PLL is selected */
  335. if ((MCG->C6 & MCG_C6_PLLS_MASK) == 0x0u) {
  336. /* FLL is selected */
  337. if ((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u) {
  338. /* External reference clock is selected */
  339. if ((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x0u) {
  340. MCGOUTClock = CPU_XTAL_CLK_HZ; /* System oscillator drives MCG clock */
  341. } else { /* (!((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x0u)) */
  342. MCGOUTClock = CPU_XTAL32k_CLK_HZ; /* RTC 32 kHz oscillator drives MCG clock */
  343. } /* (!((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x0u)) */
  344. Divider = (uint8_t)(1u << ((MCG->C1 & MCG_C1_FRDIV_MASK) >> MCG_C1_FRDIV_SHIFT));
  345. MCGOUTClock = (MCGOUTClock / Divider); /* Calculate the divided FLL reference clock */
  346. if ((MCG->C2 & MCG_C2_RANGE0_MASK) != 0x0u) {
  347. MCGOUTClock /= 32u; /* If high range is enabled, additional 32 divider is active */
  348. } /* ((MCG->C2 & MCG_C2_RANGE0_MASK) != 0x0u) */
  349. } else { /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u)) */
  350. MCGOUTClock = CPU_INT_SLOW_CLK_HZ; /* The slow internal reference clock is selected */
  351. } /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u)) */
  352. /* Select correct multiplier to calculate the MCG output clock */
  353. switch (MCG->C4 & (MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS_MASK)) {
  354. case 0x0u:
  355. MCGOUTClock *= 640u;
  356. break;
  357. case 0x20u:
  358. MCGOUTClock *= 1280u;
  359. break;
  360. case 0x40u:
  361. MCGOUTClock *= 1920u;
  362. break;
  363. case 0x60u:
  364. MCGOUTClock *= 2560u;
  365. break;
  366. case 0x80u:
  367. MCGOUTClock *= 732u;
  368. break;
  369. case 0xA0u:
  370. MCGOUTClock *= 1464u;
  371. break;
  372. case 0xC0u:
  373. MCGOUTClock *= 2197u;
  374. break;
  375. case 0xE0u:
  376. MCGOUTClock *= 2929u;
  377. break;
  378. default:
  379. break;
  380. }
  381. } else { /* (!((MCG->C6 & MCG_C6_PLLS_MASK) == 0x0u)) */
  382. /* PLL is selected */
  383. Divider = (1u + (MCG->C5 & MCG_C5_PRDIV0_MASK));
  384. MCGOUTClock = (uint32_t)(CPU_XTAL_CLK_HZ / Divider); /* Calculate the PLL reference clock */
  385. Divider = ((MCG->C6 & MCG_C6_VDIV0_MASK) + 24u);
  386. MCGOUTClock *= Divider; /* Calculate the MCG output clock */
  387. } /* (!((MCG->C6 & MCG_C6_PLLS_MASK) == 0x0u)) */
  388. } else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x40u) {
  389. /* Internal reference clock is selected */
  390. if ((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u) {
  391. MCGOUTClock = CPU_INT_SLOW_CLK_HZ; /* Slow internal reference clock selected */
  392. } else { /* (!((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u)) */
  393. MCGOUTClock = CPU_INT_FAST_CLK_HZ / (1 << ((MCG->SC & MCG_SC_FCRDIV_MASK) >> MCG_SC_FCRDIV_SHIFT)); /* Fast internal reference clock selected */
  394. } /* (!((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u)) */
  395. } else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u) {
  396. /* External reference clock is selected */
  397. if ((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x0u) {
  398. MCGOUTClock = CPU_XTAL_CLK_HZ; /* System oscillator drives MCG clock */
  399. } else { /* (!((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x0u)) */
  400. MCGOUTClock = CPU_XTAL32k_CLK_HZ; /* RTC 32 kHz oscillator drives MCG clock */
  401. } /* (!((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x0u)) */
  402. } else { /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u)) */
  403. /* Reserved value */
  404. return;
  405. } /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u)) */
  406. SystemCoreClock = (MCGOUTClock / (1u + ((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV1_MASK) >> SIM_CLKDIV1_OUTDIV1_SHIFT)));
  407. }