1 /*
2 ** ###################################################################
3 **     Compilers:           Keil ARM C/C++ Compiler
4 **                          Freescale C/C++ for Embedded ARM
5 **                          GNU C Compiler
6 **                          GNU C Compiler - CodeSourcery Sourcery G++
7 **                          IAR ANSI C/C++ Compiler for ARM
8 **
9 **     Reference manual:    MKW40Z160RM, Rev. 1.1, 4/2015
10 **     Version:             rev. 1.2, 2015-05-07
11 **     Build:               b150513
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 (c) 2015 Freescale Semiconductor, Inc.
19 **     All rights reserved.
20 **
21 **     Redistribution and use in source and binary forms, with or without modification,
22 **     are permitted provided that the following conditions are met:
23 **
24 **     o Redistributions of source code must retain the above copyright notice, this list
25 **       of conditions and the following disclaimer.
26 **
27 **     o Redistributions in binary form must reproduce the above copyright notice, this
28 **       list of conditions and the following disclaimer in the documentation and/or
29 **       other materials provided with the distribution.
30 **
31 **     o Neither the name of Freescale Semiconductor, Inc. nor the names of its
32 **       contributors may be used to endorse or promote products derived from this
33 **       software without specific prior written permission.
34 **
35 **     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
36 **     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
37 **     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 **     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
39 **     ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
40 **     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
41 **     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
42 **     ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43 **     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
44 **     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 **
46 **     http:                 www.freescale.com
47 **     mail:                 support@freescale.com
48 **
49 **     Revisions:
50 **     - rev. 1.0 (2014-07-17)
51 **         Initial version.
52 **     - rev. 1.1 (2015-03-05)
53 **         Update with reference manual rev 1.0
54 **     - rev. 1.2 (2015-05-07)
55 **         Update with reference manual rev 1.1
56 **
57 ** ###################################################################
58 */
59 
60 /*!
61  * @file MKW40Z4
62  * @version 1.2
63  * @date 2015-05-07
64  * @brief Device specific configuration file for MKW40Z4 (header file)
65  *
66  * Provides a system configuration function and a global variable that contains
67  * the system frequency. It configures the device and initializes the oscillator
68  * (PLL) that is part of the microcontroller device.
69  */
70 
71 #ifndef SYSTEM_MKW40Z4_H_
72 #define SYSTEM_MKW40Z4_H_                        /**< Symbol preventing repeated inclusion */
73 
74 #ifdef __cplusplus
75 extern "C" {
76 #endif
77 
78 #include <stdint.h>
79 
80 
81 #ifndef DISABLE_WDOG
82   #define DISABLE_WDOG                 1
83 #endif
84 
85 /* MCG mode constants */
86 
87 #define MCG_MODE_FEI                   0U
88 #define MCG_MODE_FBI                   1U
89 #define MCG_MODE_BLPI                  2U
90 #define MCG_MODE_FEE                   3U
91 #define MCG_MODE_FBE                   4U
92 #define MCG_MODE_BLPE                  5U
93 
94 /* Predefined clock setups
95    To select a specific clock setup, define symbol CLOCK_SETUP with a selected value.
96    E.g.: #define CLOCK_SETUP           0
97 
98    0 ... Default part configuration
99          Multipurpose Clock Generator (MCG) in FEI mode.
100          Reference clock source for MCG module: Slow internal reference clock
101          Core clock = 20.97152MHz
102          Bus clock  = 20.97152MHz
103    1 ... Maximum achievable clock frequency configuration
104          Multipurpose Clock Generator (MCG) in FEE mode.
105          Reference clock source for MCG module: System oscillator reference clock
106          Core clock = 75MHz
107          Bus clock  = 25MHz
108    2 ... Chip internally clocked, ready for Very Low Power Run mode
109          Multipurpose Clock Generator (MCG) in BLPI mode.
110          Reference clock source for MCG module: Fast internal reference clock
111          Core clock = 4MHz
112          Bus clock  = 0.8MHz
113    3 ... Chip externally clocked, ready for Very Low Power Run mode
114          Multipurpose Clock Generator (MCG) in BLPE mode.
115          Reference clock source for MCG module: System oscillator reference clock
116          Core clock = 3.333333333333MHz
117          Bus clock  = 0.833333333333MHz
118    4 ... Chip externally clocked
119          Multipurpose Clock Generator (MCG) in BLPE mode.
120          Reference clock source for MCG module: System oscillator reference clock
121          Core clock = 32MHz
122          Bus clock  = 16MHz
123 */
124 
125 /* Define clock source values */
126 
127 #define CPU_XTAL_CLK_HZ                32000000u           /* Value of the external crystal or oscillator clock frequency in Hz */
128 #define CPU_XTAL32k_CLK_HZ             32768u              /* Value of the external 32k crystal or oscillator clock frequency in Hz */
129 #define CPU_INT_SLOW_CLK_HZ            32768u              /* Value of the slow internal oscillator clock frequency in Hz  */
130 #define CPU_INT_FAST_CLK_HZ            4000000u            /* Value of the fast internal oscillator clock frequency in Hz  */
131 
132 /* RF oscillator setting */
133 #define SYSTEM_RSIM_CONTROL_VALUE      0xC00100U           /* Enable RF oscillator in Run/Wait mode */
134 
135 /* Low power mode enable */
136 
137 /* SMC_PMPROT: ?=0,?=0,AVLP=1,?=0,?=0,?=0,AVLLS=1,?=0 */
138 #define SYSTEM_SMC_PMPROT_VALUE        (SMC_PMPROT_AVLP_MASK | SMC_PMPROT_ALLS_MASK | SMC_PMPROT_AVLLS_MASK) /* Mask of allowed low power modes used to initialize power modes protection register */
139 
140 /* Internal reference clock trim */
141 
142 /* #undef SLOW_TRIM_ADDRESS */                             /* Slow oscillator not trimmed. Commented out for MISRA compliance. */
143 /* #undef SLOW_FINE_TRIM_ADDRESS */                        /* Slow oscillator not trimmed. Commented out for MISRA compliance. */
144 /* #undef FAST_TRIM_ADDRESS */                             /* Fast oscillator not trimmed. Commented out for MISRA compliance. */
145 /* #undef FAST_FINE_TRIM_ADDRESS */                        /* Fast oscillator not trimmed. Commented out for MISRA compliance. */
146 
147 /* System clock */
148 
149 #ifdef CLOCK_SETUP
150 #if (CLOCK_SETUP == 0)
151   #define DEFAULT_SYSTEM_CLOCK          20971520UL         /* Default System clock value */
152   #define MCG_MODE                      MCG_MODE_FEI       /* Clock generator mode */
153   /* MCG_C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
154   #define SYSTEM_MCG_C1_VALUE           0x06U              /* MCG_C1 */
155   /* MCG_C2: LOCRE0=0,FCFTRIM=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */
156   #define SYSTEM_MCG_C2_VALUE           0x24U              /* MCG_C2 */
157   /* MCG_C4: DMX32=0,DRST_DRS=0,FCTRIM=0,SCFTRIM=0 */
158   #define SYSTEM_MCG_C4_VALUE           0x00U              /* MCG_C4 */
159   /* MCG_C6: CME=0 */
160   #define SYSTEM_MCG_C6_VALUE           0x00U              /* MCG_C6 */
161   /* MCG_SC: ATME=0,ATMS=0,ATMF=0,FLTPRSRV=0,FCRDIV=0,LOCS0=0 */
162   #define SYSTEM_MCG_SC_VALUE           0x00U              /* MCG_SC */
163   /* MCG_C7: OSCSEL=0 */
164   #define SYSTEM_MCG_C7_VALUE           0x00U              /* MCG_C7 */
165   /* SIM_SOPT1: OSC32KSEL=3 */
166   #define SYSTEM_SIM_SOPT1_VALUE        0x000C0000UL       /* SIM_SOPT1 */
167   /* SIM_SOPT2: TPMSRC=0 */
168   #define SYSTEM_SIM_SOPT2_VALUE        0x00UL             /* SIM_SOPT2 */
169   /* SIM_CLKDIV1: OUTDIV1=0,OUTDIV4=0 */
170   #define SYSTEM_SIM_CLKDIV1_VALUE      0x00UL             /* SIM_CLKDIV1 */
171 #elif (CLOCK_SETUP == 1)
172   #define DEFAULT_SYSTEM_CLOCK          47972352UL         /* Default System clock value */
173   #define MCG_MODE                      MCG_MODE_FEI       /* Clock generator mode */
174   /* MCG_C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
175   #define SYSTEM_MCG_C1_VALUE           0x06U              /* MCG_C1 */
176   /* MCG_C2: LOCRE0=0,FCFTRIM=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */
177   #define SYSTEM_MCG_C2_VALUE           0x24U              /* MCG_C2 */
178   /* MCG_C4: DMX32=1,DRST_DRS=1,FCTRIM=0,SCFTRIM=0 */
179   #define SYSTEM_MCG_C4_VALUE           0xA0U              /* MCG_C4 */
180   /* MCG_C6: CME=0 */
181   #define SYSTEM_MCG_C6_VALUE           0x00U              /* MCG_C6 */
182   /* MCG_SC: ATME=0,ATMS=0,ATMF=0,FLTPRSRV=0,FCRDIV=0,LOCS0=0 */
183   #define SYSTEM_MCG_SC_VALUE           0x00U              /* MCG_SC */
184   /* MCG_C7: OSCSEL=0 */
185   #define SYSTEM_MCG_C7_VALUE           0x00U              /* MCG_C7 */
186   /* OSC0_CR: ERCLKEN=1,EREFSTEN=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
187   #define SYSTEM_SIM_SOPT1_VALUE        0x000C0000UL       /* SIM_SOPT1 */
188   /* SIM_SOPT2: TPMSRC=0 */
189   #define SYSTEM_SIM_SOPT2_VALUE        0x00UL             /* SIM_SOPT2 */
190   /* SIM_CLKDIV1: OUTDIV1=0,OUTDIV4=1 */
191   #define SYSTEM_SIM_CLKDIV1_VALUE      0x00010000UL       /* SIM_CLKDIV1 */
192 #elif (CLOCK_SETUP == 2)
193   #define DEFAULT_SYSTEM_CLOCK          4000000UL          /* Default System clock value */
194   #define MCG_MODE                      MCG_MODE_BLPI      /* Clock generator mode */
195   /* MCG_C1: CLKS=1,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
196   #define SYSTEM_MCG_C1_VALUE           0x46U              /* MCG_C1 */
197   /* MCG_C2: LOCRE0=0,FCFTRIM=0,RANGE0=2,HGO0=0,EREFS0=1,LP=1,IRCS=1 */
198   #define SYSTEM_MCG_C2_VALUE           0x27U              /* MCG_C2 */
199   /* MCG_C4: DMX32=0,DRST_DRS=0,FCTRIM=0,SCFTRIM=0 */
200   #define SYSTEM_MCG_C4_VALUE           0x00U              /* MCG_C4 */
201   /* MCG_C6: CME=0 */
202   #define SYSTEM_MCG_C6_VALUE           0x00U              /* MCG_C6 */
203   /* MCG_SC: ATME=0,ATMS=0,ATMF=0,FLTPRSRV=0,FCRDIV=0,LOCS0=0 */
204   #define SYSTEM_MCG_SC_VALUE           0x00U              /* MCG_SC */
205   /* MCG_C7: OSCSEL=0 */
206   #define SYSTEM_MCG_C7_VALUE           0x00U              /* MCG_C7 */
207   /* SIM_SOPT1: OSC32KSEL=3 */
208   #define SYSTEM_SIM_SOPT1_VALUE        0x000C0000UL       /* SIM_SOPT1 */
209   /* SIM_SOPT2: TPMSRC=0 */
210   #define SYSTEM_SIM_SOPT2_VALUE        0x00UL             /* SIM_SOPT2 */
211   /* SIM_CLKDIV1: OUTDIV1=0,OUTDIV4=4 */
212   #define SYSTEM_SIM_CLKDIV1_VALUE      0x00040000UL       /* SIM_CLKDIV1 */
213 #elif (CLOCK_SETUP == 3)
214   #define DEFAULT_SYSTEM_CLOCK          4000000UL          /* Default System clock value */
215   #define MCG_MODE                      MCG_MODE_BLPE      /* Clock generator mode */
216   /* MCG_C1: CLKS=2,FRDIV=5,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
217   #define SYSTEM_MCG_C1_VALUE           0xAAU              /* MCG_C1 */
218   /* MCG_C2: LOCRE0=0,FCFTRIM=0,RANGE0=2,HGO0=0,EREFS0=1,LP=1,IRCS=1 */
219   #define SYSTEM_MCG_C2_VALUE           0x27U              /* MCG_C2 */
220   /* MCG_C4: DMX32=0,DRST_DRS=0,FCTRIM=0,SCFTRIM=0 */
221   #define SYSTEM_MCG_C4_VALUE           0x00U              /* MCG_C4 */
222   /* MCG_C6: CME=0 */
223   #define SYSTEM_MCG_C6_VALUE           0x00U              /* MCG_C6 */
224   /* MCG_SC: ATME=0,ATMS=0,ATMF=0,FLTPRSRV=0,FCRDIV=0,LOCS0=0 */
225   #define SYSTEM_MCG_SC_VALUE           0x00U              /* MCG_SC */
226   /* MCG_C7: OSCSEL=0 */
227   #define SYSTEM_MCG_C7_VALUE           0x00U              /* MCG_C7 */
228   /* SIM_SOPT1: OSC32KSEL=3 */
229   #define SYSTEM_SIM_SOPT1_VALUE        0x000C0000UL       /* SIM_SOPT1 */
230   /* SIM_SOPT2: TPMSRC=0 */
231   #define SYSTEM_SIM_SOPT2_VALUE        0x00UL             /* SIM_SOPT2 */
232   /* SIM_CLKDIV1: OUTDIV1=7,OUTDIV4=3 */
233   #define SYSTEM_SIM_CLKDIV1_VALUE      0x70030000UL       /* SIM_CLKDIV1 */
234 #elif (CLOCK_SETUP == 4)
235   #define DEFAULT_SYSTEM_CLOCK         32000000UL          /* Default System clock value */
236   #define MCG_MODE                      MCG_MODE_BLPE      /* Clock generator mode */
237   /* MCG_C1: CLKS=2,FRDIV=5,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
238   #define SYSTEM_MCG_C1_VALUE           0xAAU              /* MCG_C1 */
239   /* MCG_C2: LOCRE0=0,FCFTRIM=0,RANGE0=2,HGO0=0,EREFS0=1,LP=1,IRCS=1 */
240   #define SYSTEM_MCG_C2_VALUE           0x27U              /* MCG_C2 */
241   /* MCG_C4: DMX32=0,DRST_DRS=0,FCTRIM=0,SCFTRIM=0 */
242   #define SYSTEM_MCG_C4_VALUE           0x00U              /* MCG_C4 */
243   /* MCG_C6: CME=0 */
244   #define SYSTEM_MCG_C6_VALUE           0x00U              /* MCG_C6 */
245   /* MCG_SC: ATME=0,ATMS=0,ATMF=0,FLTPRSRV=0,FCRDIV=0,LOCS0=0 */
246   #define SYSTEM_MCG_SC_VALUE           0x00U              /* MCG_SC */
247   /* MCG_C7: OSCSEL=0 */
248   #define SYSTEM_MCG_C7_VALUE           0x00U              /* MCG_C7 */
249   /* SIM_SOPT1: OSC32KSEL=3 */
250   #define SYSTEM_SIM_SOPT1_VALUE        0x000C0000UL       /* SIM_SOPT1 */
251   /* SIM_SOPT2: TPMSRC=0 */
252   #define SYSTEM_SIM_SOPT2_VALUE        0x00UL             /* SIM_SOPT2 */
253   /* SIM_CLKDIV1: OUTDIV1=7,OUTDIV4=3 */
254   #define SYSTEM_SIM_CLKDIV1_VALUE      0x00010000UL       /* SIM_CLKDIV1 */
255 #endif
256 #else
257   #define DEFAULT_SYSTEM_CLOCK         20971520U           /* Default System clock value */
258 #endif
259 
260 
261 /**
262  * @brief System clock frequency (core clock)
263  *
264  * The system clock frequency supplied to the SysTick timer and the processor
265  * core clock. This variable can be used by the user application to setup the
266  * SysTick timer or configure other parameters. It may also be used by debugger to
267  * query the frequency of the debug timer or configure the trace clock speed
268  * SystemCoreClock is initialized with a correct predefined value.
269  */
270 extern uint32_t SystemCoreClock;
271 
272 /**
273  * @brief Setup the microcontroller system.
274  *
275  * Typically this function configures the oscillator (PLL) that is part of the
276  * microcontroller device. For systems with variable clock speed it also updates
277  * the variable SystemCoreClock. SystemInit is called from startup_device file.
278  */
279 void SystemInit (void);
280 
281 /**
282  * @brief Updates the SystemCoreClock variable.
283  *
284  * It must be called whenever the core clock is changed during program
285  * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates
286  * the current core clock.
287  */
288 void SystemCoreClockUpdate (void);
289 
290 #ifdef __cplusplus
291 }
292 #endif
293 
294 #endif  /* #if !defined(SYSTEM_MKW40Z4_H_) */
295