]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_MB9B500_IAR_Keil/Fujitu_source/system_mb9bf50x.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / CORTEX_MB9B500_IAR_Keil / Fujitu_source / system_mb9bf50x.c
1 /************************************************************************/\r
2 /*               (C) Fujitsu Semiconductor Europe GmbH (FSEU)           */\r
3 /*                                                                      */\r
4 /* The following software deliverable is intended for and must only be  */\r
5 /* used for reference and in an evaluation laboratory environment.      */\r
6 /* It is provided on an as-is basis without charge and is subject to    */\r
7 /* alterations.                                                         */\r
8 /* It is the user's obligation to fully test the software in its        */\r
9 /* environment and to ensure proper functionality, qualification and    */\r
10 /* compliance with component specifications.                            */\r
11 /*                                                                      */\r
12 /* In the event the software deliverable includes the use of open       */\r
13 /* source components, the provisions of the governing open source       */\r
14 /* license agreement shall apply with respect to such software          */\r
15 /* deliverable.                                                         */\r
16 /* FSEU does not warrant that the deliverables do not infringe any      */\r
17 /* third party intellectual property right (IPR). In the event that     */\r
18 /* the deliverables infringe a third party IPR it is the sole           */\r
19 /* responsibility of the customer to obtain necessary licenses to       */\r
20 /* continue the usage of the deliverable.                               */\r
21 /*                                                                      */\r
22 /* To the maximum extent permitted by applicable law FSEU disclaims all */\r
23 /* warranties, whether express or implied, in particular, but not       */\r
24 /* limited to, warranties of merchantability and fitness for a          */\r
25 /* particular purpose for which the deliverable is not designated.      */\r
26 /*                                                                      */\r
27 /* To the maximum extent permitted by applicable law, FSEU's liability  */\r
28 /* is restricted to intentional misconduct and gross negligence.        */\r
29 /* FSEU is not liable for consequential damages.                        */\r
30 /*                                                                      */\r
31 /* (V1.5)                                                               */\r
32 /************************************************************************/\r
33 \r
34 #include <stdint.h>\r
35 #include "mb9bf506n.h"\r
36 \r
37 /*--------------------- Clock Configuration ----------------------------------*/\r
38 //\r
39 // <e0> Clock Configuration\r
40 //   <h> System Clock Configuration\r
41 //     <o1.1>    SCM_CTL.MOSCE: Main clock oscillation enable\r
42 //     <o2.0..3> CSW_TMR.MOWT: Main clock stabilization wait time\r
43 //           <i> Default: ~ 500 ns\r
44 //                     < 0=> ~ 500 ns \r
45 //                     < 1=> ~ 8 us\r
46 //                     < 2=> ~ 16 us\r
47 //                     < 3=> ~ 32 us\r
48 //                     < 4=> ~ 64 us\r
49 //                     < 5=> ~ 128 us\r
50 //                     < 6=> ~ 256 us\r
51 //                     < 7=> ~ 512 us\r
52 //                     < 8=> ~ 1.0 ms\r
53 //                     < 9=> ~ 2.0 ms\r
54 //                     <10=> ~ 4.0 ms\r
55 //                     <11=> ~ 8.0 ms\r
56 //                     <12=> ~ 33.0 ms\r
57 //                     <13=> ~ 131 ms\r
58 //                     <14=> ~ 524 ms\r
59 //                     <15=> ~ 2.0 s\r
60 //     <o1.3>    SCM_CTL.SOSCE: Sub clock oscillation enable\r
61 //     <o2.4..6> CSW_TMR.SOWT: SOWT: Sub clock stabilization wait time\r
62 //           <i> Default: ~ 31.19 ms\r
63 //                     <0=> ~ 31.19 ms \r
64 //                     <1=> ~ 62.44 ms\r
65 //                     <2=> ~ 0.125 s\r
66 //                     <3=> ~ 0.25 s\r
67 //                     <4=> ~ 0.50 s\r
68 //                     <5=> ~ 1.00 s\r
69 //                     <6=> ~ 2.00 s\r
70 //                     <7=> ~ 4.00 s\r
71 //     <e1.4>    SCM_CTL.PLLE: PLL oscillation enable\r
72 //           <i> fPLLO Max = 120MHz, CLKPLL Min = 60MHz\r
73 //           <i> CLKPLL = (CLKMO / PLLK) * PLLN\r
74 //       <o4.4..7> PLL_CTL1.PLLK: PLL input clock frequency division\r
75 //                     <1-16><#-1>\r
76 //       <o5.0..4> PLL_CTL1.PLLN: PLL feedback frequency division\r
77 //                     <1-32><#-1>\r
78 //       <o4.0..3> PLL_CTL1.PLLM: PLL VCO clock frequency division\r
79 //                     <1-16><#-1>\r
80 //       <o3.0..2> PSW_TMR.POWT: PLL clock stabilization wait time  \r
81 //           <i> Default: ~ 128 us\r
82 //                     <0=> ~ 128 us \r
83 //                     <1=> ~ 256 us\r
84 //                     <2=> ~ 512 us\r
85 //                     <3=> ~ 1.02 ms\r
86 //                     <4=> ~ 2.05 ms\r
87 //                     <5=> ~ 4.10 ms\r
88 //                     <6=> ~ 8.20 ms\r
89 //                     <7=> ~ 16.40 ms\r
90 //     </e>\r
91 //     <o1.5..7> SCM_CTL.RCS: Master clock switch control\r
92 //           <i> Default: Master Clock = CLKHC\r
93 //                     <0=> Master Clock = CLKHC \r
94 //                     <1=> Master Clock = CLKMO\r
95 //                     <2=> Master Clock = CLKPLL\r
96 //                     <4=> Master Clock = CLKLC\r
97 //                     <5=> Master Clock = CLKSO\r
98 //   </h>\r
99 //\r
100 //   <h> Base Clock Prescaler\r
101 //     <o6.0..2> BSC_PSR.BSR: Base clock frequency division \r
102 //           <i> Default: HCLK = Master Clock\r
103 //           <i> HCLK Max = 80MHz\r
104 //                     <0=> HCLK = Master Clock\r
105 //                     <1=> HCLK = Master Clock / 2\r
106 //                     <2=> HCLK = Master Clock / 3\r
107 //                     <3=> HCLK = Master Clock / 4\r
108 //                     <4=> HCLK = Master Clock / 6\r
109 //                     <5=> HCLK = Master Clock / 8\r
110 //                     <6=> HCLK = Master Clock / 16\r
111 //   </h>\r
112 //\r
113 //   <h> APB0 Prescaler\r
114 //     <o7.0..1> APBC0_PSR.APBC0: APB0 bus clock frequency division \r
115 //           <i> PCLK0 Max = 40MHz\r
116 //           <i> Default: PCLK0 = HCLK\r
117 //                     <0=> PCLK0 = HCLK\r
118 //                     <1=> PCLK0 = HCLK / 2\r
119 //                     <2=> PCLK0 = HCLK / 4\r
120 //                     <3=> PCLK0 = HCLK / 8\r
121 //   </h>\r
122 //\r
123 //   <h> APB1 Prescaler\r
124 //     <o8.0..1> APBC1_PSR.APBC1: APB1 bus clock frequency \r
125 //           <i> PCLK1 Max = 40MHz\r
126 //           <i> Default: PCLK1 = HCLK\r
127 //                     <0=> PCLK1 = HCLK\r
128 //                     <1=> PCLK1 = HCLK / 2\r
129 //                     <2=> PCLK1 = HCLK / 4\r
130 //                     <3=> PCLK1 = HCLK / 8\r
131 //     <o8.7>    APBC1_PSR.APBC1EN: APB1 clock enable\r
132 //   </h>\r
133 //\r
134 //   <h> APB2 Prescaler\r
135 //     <o9.0..1> APBC2_PSR.APBC2: APB2 bus clock frequency \r
136 //           <i> PCLK2 Max = 40MHz\r
137 //           <i> Default: PCLK2 = HCLK\r
138 //                     <0=> PCLK2 = HCLK\r
139 //                     <1=> PCLK2 = HCLK / 2\r
140 //                     <2=> PCLK2 = HCLK / 4\r
141 //                     <3=> PCLK2 = HCLK / 8\r
142 //     <o9.7>    APBC2_PSR.APBC2EN: APB2 clock enable\r
143 //   </h>\r
144 //\r
145 //   <h> SW Watchdog Clock Prescaler\r
146 //     <o10.0..1>SWC_PSR.SWDS: Software watchdog clock frequency division \r
147 //           <i> Default: SWDGOGCLK = PCLK0\r
148 //                     <0=> SWDGOGCLK = PCLK0\r
149 //                     <1=> SWDGOGCLK = PCLK0 / 2\r
150 //                     <2=> SWDGOGCLK = PCLK0 / 4\r
151 //                     <3=> SWDGOGCLK = PCLK0 / 8\r
152 //   </h>\r
153 //\r
154 //   <h> Trace Clock Prescaler\r
155 //     <o11.0>   TTC_PSR.TTC: Trace clock frequency division \r
156 //           <i> Default: TPIUCLK = HCLK\r
157 //                     <0=> TPIUCLK = HCLK\r
158 //                     <1=> TPIUCLK = HCLK / 2\r
159 //   </h>\r
160 //\r
161 // </e>\r
162 \r
163 #define CLOCK_SETUP           1\r
164 #define SCM_CTL_Val           0x00000052\r
165 #define CSW_TMR_Val           0x0000005C\r
166 #define PSW_TMR_Val           0x00000000\r
167 #define PLL_CTL1_Val          0x00000000\r
168 #define PLL_CTL2_Val          0x00000013\r
169 #define BSC_PSR_Val           0x00000000\r
170 #define APBC0_PSR_Val         0x00000001\r
171 #define APBC1_PSR_Val         0x00000082\r
172 #define APBC2_PSR_Val         0x00000081\r
173 #define SWC_PSR_Val           0x00000003\r
174 #define TTC_PSR_Val           0x00000000\r
175 \r
176 /*--------------------- WatchDog Configuration -------------------------------*/\r
177 //\r
178 // <o0.0>  HW Watchdog disable \r
179 \r
180 #define HWWD_DISABLE          0x00000001\r
181 \r
182 /*\r
183 //-------- <<< end of configuration section >>> ------------------------------\r
184 */\r
185 \r
186 /*----------------------------------------------------------------------------\r
187   Check the register settings\r
188  *----------------------------------------------------------------------------*/\r
189 #define CHECK_RANGE(val, min, max)                ((val < min) || (val > max))\r
190 #define CHECK_RSVD(val, mask)                     (val & mask)\r
191 \r
192 /* Clock Configuration -------------------------------------------------------*/\r
193 #if (CHECK_RSVD((SCM_CTL_Val),    ~0x000000FA))\r
194    #error "SCM_CTL: Invalid values of reserved bits!"\r
195 #endif\r
196 \r
197 #if ((SCM_CTL_Val & 0xE0) == 0x40) && ((SCM_CTL_Val & 0x10) != 0x10)\r
198    #error "SCM_CTL: CLKPLL is selected but PLL is not enabled!"\r
199 #endif\r
200 \r
201 #if (CHECK_RSVD((CSW_TMR_Val),    ~0x0000007F))\r
202    #error "CSW_TMR: Invalid values of reserved bits!"\r
203 #endif\r
204 \r
205 #if ((SCM_CTL_Val & 0x10))       /* if PLL is used */\r
206   #if (CHECK_RSVD((PSW_TMR_val),  ~0x00000007))\r
207      #error "PSW_TMR: Invalid values of reserved bits!"\r
208   #endif\r
209 \r
210   #if (CHECK_RSVD((PLL_CTL1_Val), ~0x000000FF))\r
211      #error "PLL_CTL1: Invalid values of reserved bits!"\r
212   #endif\r
213 \r
214   #if (CHECK_RSVD((PLL_CTL2_Val), ~0x0000001F))\r
215      #error "PLL_CTL2: Invalid values of reserved bits!"\r
216   #endif\r
217 #endif\r
218 \r
219 #if (CHECK_RSVD((BSC_PSR_Val),    ~0x00000007))\r
220    #error "BSC_PSR: Invalid values of reserved bits!"\r
221 #endif\r
222 \r
223 #if (CHECK_RSVD((APBC0_PSR_Val),  ~0x00000003))\r
224    #error "APBC0_PSR: Invalid values of reserved bits!"\r
225 #endif\r
226 \r
227 #if (CHECK_RSVD((APBC1_PSR_Val),  ~0x00000083))\r
228    #error "APBC1_PSR: Invalid values of reserved bits!"\r
229 #endif\r
230 \r
231 #if (CHECK_RSVD((APBC2_PSR_Val),  ~0x00000083))\r
232    #error "APBC2_PSR: Invalid values of reserved bits!"\r
233 #endif\r
234 \r
235 #if (CHECK_RSVD((SWC_PSR_Val),    ~0x00000003))\r
236    #error "SWC_PSR: Invalid values of reserved bits!"\r
237 #endif\r
238 \r
239 #if (CHECK_RSVD((TTC_PSR_Val),    ~0x00000001))\r
240    #error "TTC_PSR: Invalid values of reserved bits!"\r
241 #endif\r
242 \r
243 \r
244 /*----------------------------------------------------------------------------\r
245   DEFINES\r
246  *----------------------------------------------------------------------------*/\r
247     \r
248 /*----------------------------------------------------------------------------\r
249   Define clocks\r
250  *----------------------------------------------------------------------------*/\r
251 #define __CLKMO        ( 4000000UL)         /* External   4MHz Crystal        */\r
252 #define __CLKSO        (   32768UL)         /* External  32KHz Crystal        */\r
253 #define __CLKHC        ( 4000000UL)         /* Internal   4MHz RC Oscillator  */\r
254 #define __CLKLC        (  100000UL)         /* Internal 100KHz RC Oscillator  */\r
255 \r
256 \r
257 /* CLKPLL = (CLKMO / PLLK) * PLLN  */\r
258 #define __PLLK         (((PLL_CTL1_Val >> 4) & 0x0F) + 1)\r
259 #define __PLLN         (((PLL_CTL2_Val     ) & 0x1F) + 1)\r
260 #define __PLLCLK       ((__CLKMO  * __PLLN) / __PLLK)\r
261 \r
262 /* Determine core clock frequency according to settings */\r
263 #if   (((SCM_CTL_Val >> 5) & 0x07) == 0)\r
264     #define __MASTERCLK     (__CLKHC)\r
265 #elif (((SCM_CTL_Val >> 5) & 0x07) == 1)\r
266     #define __MASTERCLK     (__CLKMO)\r
267 #elif (((SCM_CTL_Val >> 5) & 0x07) == 2)\r
268     #define __MASTERCLK     (__PLLCLK)\r
269 #elif (((SCM_CTL_Val >> 5) & 0x07) == 4)\r
270     #define __MASTERCLK     (__CLKLC)\r
271 #elif (((SCM_CTL_Val >> 5) & 0x07) == 5)\r
272     #define __MASTERCLK     (__CLKSO)\r
273 #else\r
274     #define __MASTERCLK     (0UL)\r
275 #endif\r
276 \r
277 #if   ((BSC_PSR_Val & 0x07) == 0)\r
278     #define __HCLK         (__MASTERCLK / 1)\r
279 #elif ((BSC_PSR_Val & 0x07) == 1)\r
280     #define __HCLK         (__MASTERCLK / 2)\r
281 #elif ((BSC_PSR_Val & 0x07) == 2)\r
282     #define __HCLK         (__MASTERCLK / 3)\r
283 #elif ((BSC_PSR_Val & 0x07) == 3)\r
284     #define __HCLK         (__MASTERCLK / 4)\r
285 #elif ((BSC_PSR_Val & 0x07) == 4)\r
286     #define __HCLK         (__MASTERCLK / 6)\r
287 #elif ((BSC_PSR_Val & 0x07) == 5)\r
288     #define __HCLK         (__MASTERCLK / 8)\r
289 #elif ((BSC_PSR_Val & 0x07) == 6)\r
290     #define __HCLK         (__MASTERCLK /16)\r
291 #else\r
292     #define __HCLK         (0UL)\r
293 #endif\r
294 \r
295 \r
296 \r
297 /*----------------------------------------------------------------------------\r
298   Clock Variable definitions\r
299  *----------------------------------------------------------------------------*/\r
300 uint32_t SystemCoreClock = __HCLK;    /*!< System Clock Frequency (Core Clock)*/\r
301 \r
302 \r
303 /**\r
304  * Retrieve the system core clock\r
305  *\r
306  * @param  none\r
307  * @return none\r
308  *\r
309  * @brief  retrieve system core clock from register settings.\r
310  */\r
311 void SystemCoreClockUpdate (void) {\r
312   uint32_t masterClk;\r
313   uint32_t u32RegisterRead;\r
314 \r
315   switch ((FM3_CRG->SCM_CTL >> 5) & 0x07) {\r
316     case 0:                                 /* internal High-speed Cr osc.    */\r
317       masterClk = __CLKHC;\r
318       break;\r
319 \r
320     case 1:                                 /* external main osc.             */\r
321       masterClk = __CLKMO;\r
322       break;\r
323 \r
324     case 2:                                 /* PLL clock                      */\r
325       u32RegisterRead = (__CLKMO  * (((FM3_CRG->PLL_CTL2) & 0x1F) + 1));\r
326       masterClk = (u32RegisterRead / (((FM3_CRG->PLL_CTL1 >> 4) & 0x0F) + 1));\r
327       break;\r
328 \r
329     case 4:                                 /* internal Low-speed CR osc.     */\r
330       masterClk = __CLKLC;\r
331       break;\r
332 \r
333     case 5:                                 /* external Sub osc.              */\r
334       masterClk = __CLKSO;\r
335       break;\r
336 \r
337     default:\r
338       masterClk = 0Ul;\r
339       break;\r
340   }\r
341 \r
342   switch (FM3_CRG->BSC_PSR & 0x07) {\r
343     case 0:\r
344       SystemCoreClock = masterClk;\r
345       break;\r
346 \r
347     case 1:\r
348       SystemCoreClock = masterClk / 2;\r
349       break;\r
350 \r
351     case 2:\r
352       SystemCoreClock = masterClk / 3;\r
353       break;\r
354 \r
355     case 3:\r
356       SystemCoreClock = masterClk / 4;\r
357       break;\r
358 \r
359     case 4:\r
360       SystemCoreClock = masterClk / 6;\r
361       break;\r
362 \r
363     case 5:\r
364       SystemCoreClock = masterClk /8;\r
365       break;\r
366 \r
367     case 6:\r
368       SystemCoreClock = masterClk /16;\r
369       break;\r
370 \r
371     default:\r
372       SystemCoreClock = 0Ul;\r
373       break;\r
374   }\r
375 \r
376 }\r
377 \r
378 /*\r
379  *  Set CR Trimming Data\r
380  *\r
381  * @param  none\r
382  * @return none\r
383  *\r
384  * @brief  Update CR trimming with Flash\r
385  *         trimming data.\r
386  */\r
387 static void CrtrimSet(void)\r
388 {\r
389     /* CR Trimming Data  */\r
390     if( 0x000003FF != (FM3_FLASH_IF->CRTRMM & 0x000003FF) )\r
391     {\r
392             /* UnLock (MCR_FTRM) */\r
393         FM3_CRTRIM->MCR_RLR = 0x1ACCE554;\r
394             /* Set MCR_FTRM */\r
395         FM3_CRTRIM->MCR_FTRM = FM3_FLASH_IF->CRTRMM;\r
396             /* Lock (MCR_FTRM) */\r
397         FM3_CRTRIM->MCR_RLR = 0x00000000;\r
398     }\r
399 }\r
400 \r
401 /**\r
402  * Initialize the system\r
403  *\r
404  * @param  none\r
405  * @return none\r
406  *\r
407  * @brief  Setup the microcontroller system.\r
408  *         Initialize the System.\r
409  */\r
410 void SystemInit (void) {\r
411 \r
412   uint32_t u32RegisterRead;\r
413   \r
414 #if (HWWD_DISABLE)                                   /* HW Watchdog Disable */\r
415   FM3_HWWDT->WDG_LCK = 0x1ACCE551;                     /* HW Watchdog Unlock */\r
416   FM3_HWWDT->WDG_LCK = 0xE5331AAE;\r
417   FM3_HWWDT->WDG_CTL = 0;                              /* HW Watchdog stop */\r
418 #endif\r
419 \r
420 #if (CLOCK_SETUP)                                    /* Clock Setup */\r
421   FM3_CRG->BSC_PSR   = BSC_PSR_Val;                /* set System Clock presacaler */\r
422   FM3_CRG->APBC0_PSR = APBC0_PSR_Val;              /* set APB0 presacaler */\r
423   FM3_CRG->APBC1_PSR = APBC1_PSR_Val;              /* set APB1 presacaler */\r
424   FM3_CRG->APBC2_PSR = APBC2_PSR_Val;              /* set APB2 presacaler */\r
425   FM3_CRG->SWC_PSR   = SWC_PSR_Val | (1UL << 7);   /* set SW Watchdog presacaler */\r
426   FM3_CRG->TTC_PSR   = TTC_PSR_Val;                /* set Trace Clock presacaler */\r
427 \r
428   FM3_CRG->CSW_TMR   = CSW_TMR_Val;                /* set oscillation stabilization wait time */\r
429   if (SCM_CTL_Val & (1UL << 1)) {                    /* Main clock oscillator enabled ? */\r
430     FM3_CRG->SCM_CTL |= (1UL << 1);                /* enable main oscillator */ \r
431     while (!(FM3_CRG->SCM_STR & (1UL << 1)));      /* wait for Main clock oscillation stable */\r
432   }\r
433   if (SCM_CTL_Val & (1UL << 3)) {                    /* Sub clock oscillator enabled ? */\r
434     FM3_CRG->SCM_CTL |= (1UL << 3);                /* enable sub oscillator */ \r
435     while (!(FM3_CRG->SCM_STR & (1UL << 3)));      /* wait for Sub clock oscillation stable */\r
436   }\r
437 \r
438   FM3_CRG->PSW_TMR   = PSW_TMR_Val;                /* set PLL stabilization wait time */\r
439   FM3_CRG->PLL_CTL1  = PLL_CTL1_Val;               /* set PLLM and PLLK */\r
440   FM3_CRG->PLL_CTL2  = PLL_CTL2_Val;               /* set PLLN          */\r
441   if (SCM_CTL_Val & (1UL << 4)) {                    /* PLL enabled ? */\r
442     FM3_CRG->SCM_CTL  |= (1UL << 4);               /* enable PLL */ \r
443     while (!(FM3_CRG->SCM_STR & (1UL << 4)));      /* wait for PLL stable */\r
444   }\r
445 \r
446   FM3_CRG->SCM_CTL  |= (SCM_CTL_Val & 0xE0);       /* Set Master Clock switch */ \r
447   do\r
448   {\r
449     u32RegisterRead = (FM3_CRG->SCM_CTL & 0xE0);\r
450   }while ((FM3_CRG->SCM_STR & 0xE0) != u32RegisterRead);\r
451 #endif\r
452   CrtrimSet();\r
453 }\r
454 \r
455 \r
456 \r