]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/Keil_Specific/system_XMC1100.c
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS / Demo / CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC / Keil_Specific / system_XMC1100.c
1 /******************************************************************************\r
2  * @file     system_XMC1100.c\r
3  * @brief    Device specific initialization for the XMC1100-Series according \r
4  * to CMSIS\r
5  * @version  V1.4\r
6  * @date     01 Feb 2013\r
7  *\r
8  * @note\r
9  * Copyright (C) 2012-2013 Infineon Technologies AG. All rights reserved.\r
10 \r
11  *\r
12  * @par\r
13  * Infineon Technologies AG (Infineon) is supplying this software for use with \r
14  * Infineon\92s microcontrollers.\r
15  *   \r
16  * This file can be freely distributed within development tools that are \r
17  * supporting such microcontrollers.\r
18  *  \r
19  *\r
20  * @par\r
21  * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
22  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
23  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
24  * INFINEON SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,\r
25  * OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
26  *\r
27  ******************************************************************************/\r
28 /*\r
29  * *************************** Change history ********************************\r
30  * V1.2, 13 Dec 2012, PKB : Created change history table\r
31  * V1.3, 20 Dec 2012, PKB : Fixed SystemCoreClock computation\r
32  * V1.3, 01 Feb 2013, PKB : SCU_CLOCK -> SCU_CLK\r
33  */\r
34 \r
35 #include "system_XMC1100.h"\r
36 #include <XMC1100.h>\r
37 \r
38 /*---------------------------------------------------------------------------\r
39  Extern definitions \r
40  *--------------------------------------------------------------------------*/\r
41 extern uint32_t AllowClkInitByStartup(void);\r
42 \r
43 /*----------------------------------------------------------------------------\r
44   Clock Global defines\r
45  *----------------------------------------------------------------------------*/\r
46 #define DCO_DCLK                  64000000UL\r
47 #define DCO_DCLK_MULTIPLIER       16384000UL\r
48 #define DCO_DCLK_DIVIDER          9UL\r
49 #define MCLK_MHZ                  32000000UL\r
50 #define KHZ_MULTIPLIER            1000UL\r
51 #define FRACBITS                  8UL\r
52 /*----------------------------------------------------------------------------\r
53   Clock Variable definitions\r
54  *----------------------------------------------------------------------------*/\r
55 /*!< System Clock Frequency (Core Clock) (MCLK on TIMM1) */\r
56 uint32_t SystemCoreClock;\r
57 \r
58 /*----------------------------------------------------------------------------\r
59   Fixed point math definitions\r
60  *----------------------------------------------------------------------------*/\r
61 typedef int32_t Q_24_8;\r
62 typedef int32_t Q_15_0;\r
63 \r
64 /**\r
65   * @brief  Setup the microcontroller system.\r
66   * @param  None\r
67   * @retval None\r
68   */\r
69 void SystemInit(void)\r
70 {    \r
71 \r
72   /*\r
73    * Clock tree setup by CMSIS routines is allowed only in the absence of DAVE\r
74    * Clock app.\r
75    */ \r
76   if(AllowClkInitByStartup()){ \r
77   /* Do not change default values of IDIV,FDIV and RTCCLKSEL */\r
78   /* ====== Default configuration ======= */\r
79   /*\r
80    * MCLK    = DCO_DCLK\r
81    * PCLK    = MCLK\r
82    * RTC CLK = Standby clock\r
83    */\r
84   }\r
85 }\r
86 \r
87 /**\r
88   * @brief  Update SystemCoreClock according to Clock Register Values\r
89   * @note   -  \r
90   * @param  None\r
91   * @retval None\r
92   */\r
93 void SystemCoreClockUpdate(void)\r
94 {\r
95   uint32_t IDIV, FDIV, CLKCR, Clock;\r
96 \r
97   CLKCR = SCU_CLK -> CLKCR;\r
98   IDIV = (CLKCR & SCU_CLK_CLKCR_IDIV_Msk) >> SCU_CLK_CLKCR_IDIV_Pos;\r
99   FDIV = (CLKCR & SCU_CLK_CLKCR_FDIV_Msk) >> SCU_CLK_CLKCR_FDIV_Pos;\r
100   \r
101   if(IDIV)\r
102   {\r
103     /* Divider is enabled and used */\r
104     if(0 == FDIV)\r
105      {\r
106        /* No fractional divider, so MCLK = DCO_Clk / (2 * IDIV) */\r
107        Clock = MCLK_MHZ / IDIV;\r
108      }\r
109     else\r
110      {\r
111        /* Both integer and fractional divider must be considered */\r
112        /* 1. IDIV + FDIV/256 */\r
113        Q_24_8 FDiv_IDiv_Sum = (IDIV << FRACBITS) + FDIV;  \r
114 \r
115        /* 2. Fixed point division Q24.8 / Q9.8 = Q15.0 */\r
116        Q_15_0 ClockVal = (DCO_DCLK_MULTIPLIER << FRACBITS)/ FDiv_IDiv_Sum;\r
117        Clock = ((uint32_t)ClockVal) * KHZ_MULTIPLIER;\r
118        Clock = Clock >> DCO_DCLK_DIVIDER;\r
119      }\r
120   }\r
121   else\r
122   {\r
123     /* Divider bypassed. Simply divide DCO_DCLK by 2 */\r
124     Clock = MCLK_MHZ;\r
125   }\r
126 \r
127   /* Finally with the math class over, update SystemCoreClock */\r
128   SystemCoreClock = Clock;  \r
129 }\r
130 \r