29
29
#define __REFOCLK_H 128000
30
30
#define __SYSCLK 5000000
31
31
32
- // We currently do not support a DCO frequency of 1.5MHz, because the SMCLK
33
- // should be at least at 3MHz because of the uTicker, which needs 1MHz.
34
- // SMCLK is typically the half of MCLK. The longest PWM periods depend on
35
- // SMCLK: Timer A is only 16 bit and has a maximum pre-scaler of 64, so the
36
- // longest PWM period is:
37
- // With SMCLK = 3MHz, the maximum period is 1.39s.
38
- // With SMCLK = 24MHz, the maximum period is (only) 174.8ms
39
-
32
+ // Configuration items in targets.json
40
33
#define DCO_1500kHz 0
41
34
#define DCO_3MHz 1
42
35
#define DCO_6MHz 2
101
94
#elif (MBED_CONF_TARGET_MCLK_SELECT == REFO )
102
95
#define __MASTER_CLOCK (__REFOCLK_L / MCLK_DIVIDER)
103
96
#elif (MBED_CONF_TARGET_MCLK_SELECT == DCO )
104
- #define __MASTER_CLOCK ( (3000000 << ( MBED_CONF_TARGET_DCO_RSEL-1) ) / MCLK_DIVIDER)
97
+ #define __MASTER_CLOCK ( (1500000 << MBED_CONF_TARGET_DCO_RSEL) / MCLK_DIVIDER)
105
98
#elif (MBED_CONF_TARGET_MCLK_SELECT == MOD )
106
99
#define __MASTER_CLOCK (__MODCLK / MCLK_DIVIDER)
107
100
#elif (MBED_CONF_TARGET_MCLK_SELECT == HFXT )
118
111
#elif (MBED_CONF_TARGET_MCLK_SELECT == REFO )
119
112
#define __SUBSYS_CLOCK (__REFOCLK_L / SMCLK_DIVIDER)
120
113
#elif (MBED_CONF_TARGET_MCLK_SELECT == DCO )
121
- #define __SUBSYS_CLOCK ( (3000000 << ( MBED_CONF_TARGET_DCO_RSEL-1) ) / SMCLK_DIVIDER)
114
+ #define __SUBSYS_CLOCK ((1500000 << MBED_CONF_TARGET_DCO_RSEL) / SMCLK_DIVIDER)
122
115
#elif (MBED_CONF_TARGET_MCLK_SELECT == MOD )
123
116
#define __SUBSYS_CLOCK (__MODCLK / SMCLK_DIVIDER)
124
117
#elif (MBED_CONF_TARGET_MCLK_SELECT == HFXT )
127
120
#error No SMCLK source defined (MBED_CONF_TARGET_SMCLK_SELECT)
128
121
#endif
129
122
130
- // global clock variables
123
+ // Global clock variables
131
124
uint32_t SystemCoreClock = __MASTER_CLOCK ; // the value of MCLK in Hz
132
125
uint32_t SubsystemMasterClock = __SUBSYS_CLOCK ; // the value of SMCLK in Hz
133
126
127
+ // Global xtal frequencies. If the xtal oscillators are enabled
128
+ // during run-time, the frequencies have to be set here so that
129
+ // SystemCoreClockUpdate can use them.
130
+ uint32_t HfxtFrequency = 0 ;
131
+ uint32_t LfxtFrequency = 0 ;
132
+
134
133
//
135
134
// Initialize the system
136
135
//
@@ -144,7 +143,8 @@ uint32_t SubsystemMasterClock = __SUBSYS_CLOCK; // the value of SMCLK in Hz
144
143
// 2. Enables all SRAM banks
145
144
// 3. Sets up power regulator and VCORE
146
145
// 4. Enable Flash wait states if needed and read buffering
147
- // 5. Change MCLK/SMCLK to desired frequency
146
+ // 5. Enable HFXT and/or LFXT if needed
147
+ // 6. Configure the Clock System (CS)
148
148
//
149
149
void SystemInit (void )
150
150
{
@@ -153,9 +153,6 @@ void SystemInit(void)
153
153
// Enable all SRAM banks
154
154
SYSCTL -> SRAM_BANKEN = SYSCTL_SRAM_BANKEN_BNK7_EN ;
155
155
156
- // Unlock CS module
157
- CS -> KEY = CS_KEY_VAL ;
158
-
159
156
#if (__MASTER_CLOCK >= 48000000 )
160
157
// Switches to DCDC VCORE1
161
158
while ((PCM -> CTL1 & PCM_CTL1_PMR_BUSY ));
@@ -164,21 +161,26 @@ void SystemInit(void)
164
161
// 1 flash wait states (BANK0 VCORE1 max is 16 MHz,
165
162
// BANK1 VCORE1 max is 32 MHz)
166
163
FLCTL -> BANK0_RDCTL = FLCTL_BANK0_RDCTL_WAIT_1 | FLCTL_BANK0_RDCTL_BUFD
167
- | FLCTL_BANK0_RDCTL_BUFI ;
164
+ | FLCTL_BANK0_RDCTL_BUFI ;
168
165
FLCTL -> BANK1_RDCTL = FLCTL_BANK1_RDCTL_WAIT_1 | FLCTL_BANK1_RDCTL_BUFD
169
- | FLCTL_BANK1_RDCTL_BUFI ;
166
+ | FLCTL_BANK1_RDCTL_BUFI ;
170
167
#elif (__MASTER_CLOCK >= 24000000 )
171
168
// Switches to DCDC VCORE0
172
169
while ((PCM -> CTL1 & PCM_CTL1_PMR_BUSY ));
173
170
PCM -> CTL0 = PCM_CTL0_KEY_VAL | PCM_CTL0_AMR__AM_DCDC_VCORE0 ;
174
171
while ((PCM -> CTL1 & PCM_CTL1_PMR_BUSY ));
175
172
// Enable read buffering and 1 flash wait state (BANK0 VCORE0 max is 12 MHz)
176
173
FLCTL -> BANK0_RDCTL = FLCTL_BANK0_RDCTL_WAIT_1 | FLCTL_BANK0_RDCTL_BUFD
177
- | FLCTL_BANK0_RDCTL_BUFI ;
174
+ | FLCTL_BANK0_RDCTL_BUFI ;
178
175
#endif
179
176
180
- #if ((MBED_CONF_TARGET_MCLK_SELECT == HFXT ) || (MBED_CONF_TARGET_SMCLK_SELECT == HFXT ))
181
- // initialize PJ.2 and PJ.3 for HFXT
177
+ // Unlock CS module
178
+ CS -> KEY = CS_KEY_VAL ;
179
+
180
+ #ifdef MBED_CONF_TARGET_HFXT_HZ
181
+ HfxtFrequency = MBED_CONF_TARGET_HFXT_HZ ;
182
+ // Enable the HFXT crystal oscillator.
183
+ // Initialize PJ for HFXT
182
184
PJ -> SEL0 |= BIT3 ;
183
185
PJ -> SEL1 &= ~BIT3 ;
184
186
CS -> CTL2 |= CS_CTL2_HFXT_EN | HFXT_FREQ ;
@@ -188,20 +190,12 @@ void SystemInit(void)
188
190
}
189
191
#endif
190
192
191
- // Set CTL0 and CTL1
192
- CS -> CTL0 = (MBED_CONF_TARGET_DCO_RSEL << CS_CTL0_DCORSEL_OFS ) |
193
- (MBED_CONF_TARGET_DCO_TUNE & 0x3ff );
194
- CS -> CTL1 = MBED_CONF_TARGET_MCLK_SELECT << CS_CTL1_SELM_OFS |
195
- MBED_CONF_TARGET_MCLK_DIV << CS_CTL1_DIVM_OFS |
196
- MBED_CONF_TARGET_SMCLK_SELECT << CS_CTL1_SELS_OFS |
197
- MBED_CONF_TARGET_SMCLK_DIV << CS_CTL1_DIVS_OFS ;
198
-
199
193
#ifdef MBED_CONF_TARGET_LFXT_HZ
200
- // Configure the 32768Hz source. If the LFXT is not
194
+ LfxtFrequency = MBED_CONF_TARGET_LFXT_HZ ;
195
+ // Enable the LFXT crystal oscillator. If the LFXT is not
201
196
// available, the system will switch automatically to
202
- // REFOCLK with 32768Hz mode (less precision...)
203
-
204
- // initialize PJ.0 and PJ.1 for LFXT
197
+ // REFOCLK with 32768Hz mode (less precision...).
198
+ // Initialize PJ for LFXT
205
199
PJ -> SEL0 |= BIT0 ;
206
200
PJ -> SEL1 &= ~BIT0 ;
207
201
// Enable LFXT
@@ -212,9 +206,18 @@ void SystemInit(void)
212
206
}
213
207
#endif
214
208
209
+ // Set CTL0 and CTL1
210
+ CS -> CTL0 = (MBED_CONF_TARGET_DCO_RSEL << CS_CTL0_DCORSEL_OFS ) |
211
+ (MBED_CONF_TARGET_DCO_TUNE & 0x3ff );
212
+ CS -> CTL1 = MBED_CONF_TARGET_MCLK_SELECT << CS_CTL1_SELM_OFS |
213
+ MBED_CONF_TARGET_MCLK_DIV << CS_CTL1_DIVM_OFS |
214
+ MBED_CONF_TARGET_SMCLK_SELECT << CS_CTL1_SELS_OFS |
215
+ MBED_CONF_TARGET_SMCLK_DIV << CS_CTL1_DIVS_OFS ;
216
+
215
217
// Lock CS module
216
218
CS -> KEY = 0 ;
217
- // Update the global clock values
219
+
220
+ // Update the global clock values.
218
221
SystemCoreClockUpdate ();
219
222
}
220
223
@@ -247,9 +250,7 @@ void SystemCoreClockUpdate(void)
247
250
// always switch to REFOCLK with 32768Hz
248
251
SystemCoreClock = __REFOCLK_L ;
249
252
} else {
250
- #ifdef MBED_CONF_TARGET_LFXT_HZ
251
- SystemCoreClock = MBED_CONF_TARGET_LFXT_HZ ;
252
- #endif
253
+ SystemCoreClock = LfxtFrequency ;
253
254
}
254
255
break ;
255
256
}
@@ -335,9 +336,7 @@ void SystemCoreClockUpdate(void)
335
336
// switch over to SYSOSC...
336
337
SystemCoreClock = __SYSCLK ;
337
338
} else {
338
- #ifdef MBED_CONF_TARGET_HFXT_HZ
339
- SystemCoreClock = MBED_CONF_TARGET_HFXT_HZ ;
340
- #endif
339
+ SystemCoreClock = HfxtFrequency ;
341
340
}
342
341
break ;
343
342
}
@@ -357,9 +356,7 @@ void SystemCoreClockUpdate(void)
357
356
// always switch to REFOCLK with 32768Hz
358
357
SubsystemMasterClock = __REFOCLK_L ;
359
358
} else {
360
- #ifdef MBED_CONF_TARGET_LFXT_HZ
361
- SubsystemMasterClock = MBED_CONF_TARGET_LFXT_HZ ;
362
- #endif
359
+ SubsystemMasterClock = LfxtFrequency ;
363
360
}
364
361
break ;
365
362
}
@@ -445,9 +442,7 @@ void SystemCoreClockUpdate(void)
445
442
// switch over to SYSOSC...
446
443
SubsystemMasterClock = __SYSCLK ;
447
444
} else {
448
- #ifdef MBED_CONF_TARGET_HFXT_HZ
449
- SubsystemMasterClock = MBED_CONF_TARGET_HFXT_HZ ;
450
- #endif
445
+ SubsystemMasterClock = HfxtFrequency ;
451
446
}
452
447
break ;
453
448
}
0 commit comments