1 /*
2 ** ###################################################################
3 **     Processors:          MIMXRT1011CAE4A
4 **                          MIMXRT1011DAE5A
5 **
6 **     Compilers:           Freescale C/C++ for Embedded ARM
7 **                          GNU C Compiler
8 **                          IAR ANSI C/C++ Compiler for ARM
9 **                          Keil ARM C/C++ Compiler
10 **                          MCUXpresso Compiler
11 **
12 **     Reference manual:    IMXRT1010RM Rev.1, 10/2021 | IMXRT1010SRM Rev.0
13 **     Version:             rev. 1.2, 2021-08-10
14 **     Build:               b210810
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-2021 NXP
23 **     All rights reserved.
24 **
25 **     SPDX-License-Identifier: BSD-3-Clause
26 **
27 **     http:                 www.nxp.com
28 **     mail:                 support@nxp.com
29 **
30 **     Revisions:
31 **     - rev. 0.1 (2019-02-14)
32 **         Initial version.
33 **     - rev. 1.0 (2019-08-01)
34 **         Rev.0 Header GA
35 **     - rev. 1.1 (2019-08-06)
36 **         Update header files to align with IMXRT1010RM Rev.B.
37 **     - rev. 1.2 (2021-08-10)
38 **         Update header files to align with IMXRT1010RM Rev.1.
39 **
40 ** ###################################################################
41 */
42 
43 /*!
44  * @file MIMXRT1011
45  * @version 1.2
46  * @date 2021-08-10
47  * @brief Device specific configuration file for MIMXRT1011 (implementation file)
48  *
49  * Provides a system configuration function and a global variable that contains
50  * the system frequency. It configures the device and initializes the oscillator
51  * (PLL) that is part of the microcontroller device.
52  */
53 
54 #include <stdint.h>
55 #include "fsl_device_registers.h"
56 
57 
58 
59 /* ----------------------------------------------------------------------------
60    -- Core clock
61    ---------------------------------------------------------------------------- */
62 
63 uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
64 
65 /* ----------------------------------------------------------------------------
66    -- SystemInit()
67    ---------------------------------------------------------------------------- */
68 
SystemInit(void)69 void SystemInit (void) {
70 #if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
71   SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2));    /* set CP10, CP11 Full Access */
72 #endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
73 
74 #if defined(__MCUXPRESSO)
75     extern uint32_t g_pfnVectors[];  // Vector table defined in startup code
76     SCB->VTOR = (uint32_t)g_pfnVectors;
77 #endif
78 
79 /* Disable Watchdog Power Down Counter */
80     WDOG1->WMCR &= ~(uint16_t) WDOG_WMCR_PDE_MASK;
81     WDOG2->WMCR &= ~(uint16_t) WDOG_WMCR_PDE_MASK;
82 
83 /* Watchdog disable */
84 
85 #if (DISABLE_WDOG)
86     if ((WDOG1->WCR & WDOG_WCR_WDE_MASK) != 0U)
87     {
88         WDOG1->WCR &= ~(uint16_t) WDOG_WCR_WDE_MASK;
89     }
90     if ((WDOG2->WCR & WDOG_WCR_WDE_MASK) != 0U)
91     {
92         WDOG2->WCR &= ~(uint16_t) WDOG_WCR_WDE_MASK;
93     }
94     if ((RTWDOG->CS & RTWDOG_CS_CMD32EN_MASK) != 0U)
95     {
96         RTWDOG->CNT = 0xD928C520U; /* 0xD928C520U is the update key */
97     }
98     else
99     {
100         RTWDOG->CNT = 0xC520U;
101         RTWDOG->CNT = 0xD928U;
102     }
103     RTWDOG->TOVAL = 0xFFFF;
104     RTWDOG->CS = (uint32_t) ((RTWDOG->CS) & ~RTWDOG_CS_EN_MASK) | RTWDOG_CS_UPDATE_MASK;
105 #endif /* (DISABLE_WDOG) */
106 
107     /* Disable Systick which might be enabled by bootrom */
108     if ((SysTick->CTRL & SysTick_CTRL_ENABLE_Msk) != 0U)
109     {
110         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
111     }
112 
113 /* Enable instruction and data caches */
114 #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT
115     if (SCB_CCR_IC_Msk != (SCB_CCR_IC_Msk & SCB->CCR)) {
116         SCB_EnableICache();
117     }
118 #endif
119 
120   SystemInitHook();
121 }
122 
123 /* ----------------------------------------------------------------------------
124    -- SystemCoreClockUpdate()
125    ---------------------------------------------------------------------------- */
126 
SystemCoreClockUpdate(void)127 void SystemCoreClockUpdate (void) {
128 
129     uint32_t freq;
130     uint32_t PLL2MainClock;
131     uint32_t PLL3MainClock;
132 
133     /* Check if system pll is bypassed */
134     if((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_BYPASS_MASK) != 0U)
135     {
136         PLL2MainClock = CPU_XTAL_CLK_HZ;
137     }
138     else
139     {
140         PLL2MainClock = (CPU_XTAL_CLK_HZ * (((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK) != 0U) ? 22U : 20U));
141     }
142     PLL2MainClock += (uint32_t)(((uint64_t)CPU_XTAL_CLK_HZ * ((uint64_t)(CCM_ANALOG->PLL_SYS_NUM))) / ((uint64_t)(CCM_ANALOG->PLL_SYS_DENOM)));
143 
144     /* Check if usb1 pll is bypassed */
145     if((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_BYPASS_MASK) != 0U)
146     {
147         PLL3MainClock = CPU_XTAL_CLK_HZ;
148     }
149     else
150     {
151         PLL3MainClock = (CPU_XTAL_CLK_HZ * (((CCM_ANALOG->PLL_USB1 & CCM_ANALOG_PLL_USB1_DIV_SELECT_MASK) != 0U) ? 22U : 20U));
152     }
153 
154     /* Periph_clk2_clk ---> Periph_clk */
155     if ((CCM->CBCDR & CCM_CBCDR_PERIPH_CLK_SEL_MASK) != 0U)
156     {
157         switch (CCM->CBCMR & CCM_CBCMR_PERIPH_CLK2_SEL_MASK)
158         {
159             /* Pll3_sw_clk ---> Periph_clk2_clk ---> Periph_clk ---> Core_clock */
160             case CCM_CBCMR_PERIPH_CLK2_SEL(0U):
161                 freq = PLL3MainClock;
162                 break;
163 
164             /* Osc_clk ---> Periph_clk2_clk ---> Periph_clk ---> Core_clock */
165             case CCM_CBCMR_PERIPH_CLK2_SEL(1U):
166                 freq = CPU_XTAL_CLK_HZ;
167                 break;
168 
169             /* Pll2_bypass_clk ---> Periph_clk2_clk ---> Periph_clk ---> Core_clock */
170             case CCM_CBCMR_PERIPH_CLK2_SEL(2U):
171                 freq = CPU_XTAL_CLK_HZ;
172                 break;
173 
174             case CCM_CBCMR_PERIPH_CLK2_SEL(3U):
175             default:
176                 freq = 0U;
177                 break;
178         }
179     }
180     /* Pre_Periph_clk ---> Periph_clk */
181     else
182     {
183         switch (CCM->CBCMR & CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK)
184         {
185             /* PLL2 ---> Pre_Periph_clk ---> Periph_clk ---> Core_clock */
186             case CCM_CBCMR_PRE_PERIPH_CLK_SEL(0U):
187                 freq = PLL2MainClock;
188                 break;
189 
190             /* PLL3 PFD3 ---> Pre_Periph_clk ---> Periph_clk ---> Core_clock */
191             case CCM_CBCMR_PRE_PERIPH_CLK_SEL(1U):
192                 freq = PLL3MainClock / ((CCM_ANALOG->PFD_480 & CCM_ANALOG_PFD_480_PFD3_FRAC_MASK) >> CCM_ANALOG_PFD_480_PFD3_FRAC_SHIFT) * 18U;
193                 break;
194 
195             /* PLL2 PFD3 ---> Pre_Periph_clk ---> Periph_clk ---> Core_clock */
196             case CCM_CBCMR_PRE_PERIPH_CLK_SEL(2U):
197                 freq = PLL2MainClock / ((CCM_ANALOG->PFD_528 & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK) >> CCM_ANALOG_PFD_528_PFD3_FRAC_SHIFT) * 18U;
198                 break;
199 
200             /* PLL6 ---> Pre_Periph_clk ---> Periph_clk ---> Core_clock */
201             case CCM_CBCMR_PRE_PERIPH_CLK_SEL(3U):
202                 freq = 500000000U;
203                 break;
204 
205             default:
206                 freq = 0U;
207                 break;
208         }
209     }
210 
211     SystemCoreClock = (freq / (((CCM->CBCDR & CCM_CBCDR_AHB_PODF_MASK) >> CCM_CBCDR_AHB_PODF_SHIFT) + 1U));
212 
213 }
214 
215 /* ----------------------------------------------------------------------------
216    -- SystemInitHook()
217    ---------------------------------------------------------------------------- */
218 
SystemInitHook(void)219 __attribute__ ((weak)) void SystemInitHook (void) {
220   /* Void implementation of the weak function. */
221 }
222