1 /******************************************************************************
\r
2 * @file system_XMC1100.c
\r
3 * @brief Device specific initialization for the XMC1100-Series according
\r
9 * Copyright (C) 2012-2013 Infineon Technologies AG. All rights reserved.
\r
13 * Infineon Technologies AG (Infineon) is supplying this software for use with
\r
14 * Infineon
\92s microcontrollers.
\r
16 * This file can be freely distributed within development tools that are
\r
17 * supporting such microcontrollers.
\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
27 ******************************************************************************/
\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
35 #include "system_XMC1100.h"
\r
36 #include <XMC1100.h>
\r
38 /*---------------------------------------------------------------------------
\r
40 *--------------------------------------------------------------------------*/
\r
41 extern uint32_t AllowClkInitByStartup(void);
\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
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
65 * @brief Setup the microcontroller system.
\r
69 void SystemInit(void)
\r
73 * Clock tree setup by CMSIS routines is allowed only in the absence of DAVE
\r
76 if(AllowClkInitByStartup()){
\r
77 /* Do not change default values of IDIV,FDIV and RTCCLKSEL */
\r
78 /* ====== Default configuration ======= */
\r
82 * RTC CLK = Standby clock
\r
88 * @brief Update SystemCoreClock according to Clock Register Values
\r
93 void SystemCoreClockUpdate(void)
\r
95 uint32_t IDIV, FDIV, CLKCR, Clock;
\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
103 /* Divider is enabled and used */
\r
106 /* No fractional divider, so MCLK = DCO_Clk / (2 * IDIV) */
\r
107 Clock = MCLK_MHZ / IDIV;
\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
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
123 /* Divider bypassed. Simply divide DCO_DCLK by 2 */
\r
127 /* Finally with the math class over, update SystemCoreClock */
\r
128 SystemCoreClock = Clock;
\r