@@ -58,197 +58,201 @@ void SystemInit( void )
58
58
#if defined(__SAMD51__ )
59
59
NVMCTRL -> CTRLA .reg |= NVMCTRL_CTRLA_RWS (0 );
60
60
61
- #if defined(CRYSTALLESS )
62
-
63
-
64
- #else // has crystal
65
-
66
- /* ----------------------------------------------------------------------------------------------
67
- * 1) Enable XOSC32K clock (External on-board 32.768Hz oscillator)
68
- */
61
+ #ifndef CRYSTALLESS
62
+ /* ----------------------------------------------------------------------------------------------
63
+ * 1) Enable XOSC32K clock (External on-board 32.768Hz oscillator)
64
+ */
65
+
66
+ OSC32KCTRL -> XOSC32K .reg = OSC32KCTRL_XOSC32K_ENABLE | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_CGM_XT | OSC32KCTRL_XOSC32K_XTALEN ;
67
+
68
+ while ( (OSC32KCTRL -> STATUS .reg & OSC32KCTRL_STATUS_XOSC32KRDY ) == 0 ){
69
+ /* Wait for oscillator to be ready */
70
+ }
69
71
70
- OSC32KCTRL -> XOSC32K .reg = OSC32KCTRL_XOSC32K_ENABLE | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_CGM_XT | OSC32KCTRL_XOSC32K_XTALEN ;
71
-
72
- while ( (OSC32KCTRL -> STATUS .reg & OSC32KCTRL_STATUS_XOSC32KRDY ) == 0 ){
73
- /* Wait for oscillator to be ready */
74
- }
72
+ #endif //CRYSTALLESS
75
73
76
- #endif //CRYSTALLESS
77
-
78
74
//software reset
79
75
80
76
GCLK -> CTRLA .bit .SWRST = 1 ;
81
77
while ( GCLK -> SYNCBUSY .reg & GCLK_SYNCBUSY_SWRST ){
82
78
/* wait for reset to complete */
83
79
}
80
+
81
+ #ifndef CRYSTALLESS
82
+ /* ----------------------------------------------------------------------------------------------
83
+ * 2) Put XOSC32K as source of Generic Clock Generator 3
84
+ */
85
+ GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_XOSC32K ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_XOSC32K ) | //generic clock gen 3
86
+ GCLK_GENCTRL_GENEN ;
87
+ #else
88
+ /* ----------------------------------------------------------------------------------------------
89
+ * 2) Put OSCULP32K as source of Generic Clock Generator 3
90
+ */
91
+ GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_XOSC32K ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_OSCULP32K ) | GCLK_GENCTRL_GENEN ; //generic clock gen 3
92
+ #endif
84
93
85
- /* ----------------------------------------------------------------------------------------------
86
- * 2) Put XOSC32K as source of Generic Clock Generator 3
87
- */
88
- GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_XOSC32K ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_XOSC32K ) | //generic clock gen 3
89
- GCLK_GENCTRL_GENEN ;
90
94
91
- while ( GCLK -> SYNCBUSY .reg & GCLK_SYNCBUSY_GENCTRL3 ){
92
- /* Wait for synchronization */
93
- }
95
+ while ( GCLK -> SYNCBUSY .reg & GCLK_SYNCBUSY_GENCTRL3 ){
96
+ /* Wait for synchronization */
97
+ }
94
98
95
- /* ----------------------------------------------------------------------------------------------
96
- * 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference)
97
- */
98
- GCLK -> GENCTRL [0 ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_OSCULP32K ) | GCLK_GENCTRL_GENEN ;
99
-
100
- /* ----------------------------------------------------------------------------------------------
101
- * 4) Enable DFLL48M clock
102
- */
99
+ /* ----------------------------------------------------------------------------------------------
100
+ * 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference)
101
+ */
102
+ GCLK -> GENCTRL [0 ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_OSCULP32K ) | GCLK_GENCTRL_GENEN ;
103
+
104
+ /* ----------------------------------------------------------------------------------------------
105
+ * 4) Enable DFLL48M clock
106
+ */
103
107
104
108
while ( GCLK -> SYNCBUSY .reg & GCLK_SYNCBUSY_GENCTRL0 ){
105
109
/* Wait for synchronization */
106
110
}
107
111
108
- /* DFLL Configuration in Open Loop mode */
109
-
110
- OSCCTRL -> DFLLCTRLA .reg = 0 ;
111
- //GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val);
112
-
113
- OSCCTRL -> DFLLMUL .reg = OSCCTRL_DFLLMUL_CSTEP ( 0x1 ) |
114
- OSCCTRL_DFLLMUL_FSTEP ( 0x1 ) |
115
- OSCCTRL_DFLLMUL_MUL ( 0 );
116
-
117
- while ( OSCCTRL -> DFLLSYNC .reg & OSCCTRL_DFLLSYNC_DFLLMUL )
118
- {
119
- /* Wait for synchronization */
120
- }
112
+ /* DFLL Configuration in Open Loop mode */
121
113
122
- OSCCTRL -> DFLLCTRLB .reg = 0 ;
123
- while ( OSCCTRL -> DFLLSYNC .reg & OSCCTRL_DFLLSYNC_DFLLCTRLB )
124
- {
125
- /* Wait for synchronization */
126
- }
114
+ OSCCTRL -> DFLLCTRLA .reg = 0 ;
115
+ //GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val);
127
116
128
- OSCCTRL -> DFLLCTRLA .reg |= OSCCTRL_DFLLCTRLA_ENABLE ;
129
- while ( OSCCTRL -> DFLLSYNC .reg & OSCCTRL_DFLLSYNC_ENABLE )
130
- {
131
- /* Wait for synchronization */
132
- }
133
-
134
- OSCCTRL -> DFLLVAL .reg = OSCCTRL -> DFLLVAL .reg ;
135
- while ( OSCCTRL -> DFLLSYNC .bit .DFLLVAL );
117
+ OSCCTRL -> DFLLMUL .reg = OSCCTRL_DFLLMUL_CSTEP ( 0x1 ) |
118
+ OSCCTRL_DFLLMUL_FSTEP ( 0x1 ) |
119
+ OSCCTRL_DFLLMUL_MUL ( 0 );
120
+
121
+ while ( OSCCTRL -> DFLLSYNC .reg & OSCCTRL_DFLLSYNC_DFLLMUL )
122
+ {
123
+ /* Wait for synchronization */
124
+ }
125
+
126
+ OSCCTRL -> DFLLCTRLB .reg = 0 ;
127
+ while ( OSCCTRL -> DFLLSYNC .reg & OSCCTRL_DFLLSYNC_DFLLCTRLB )
128
+ {
129
+ /* Wait for synchronization */
130
+ }
131
+
132
+ OSCCTRL -> DFLLCTRLA .reg |= OSCCTRL_DFLLCTRLA_ENABLE ;
133
+ while ( OSCCTRL -> DFLLSYNC .reg & OSCCTRL_DFLLSYNC_ENABLE )
134
+ {
135
+ /* Wait for synchronization */
136
+ }
137
+
138
+ OSCCTRL -> DFLLVAL .reg = OSCCTRL -> DFLLVAL .reg ;
139
+ while ( OSCCTRL -> DFLLSYNC .bit .DFLLVAL );
136
140
137
141
OSCCTRL -> DFLLCTRLB .reg = OSCCTRL_DFLLCTRLB_WAITLOCK |
138
142
OSCCTRL_DFLLCTRLB_CCDIS | OSCCTRL_DFLLCTRLB_USBCRM ;
139
143
140
- while ( !OSCCTRL -> STATUS .bit .DFLLRDY )
141
- {
142
- /* Wait for synchronization */
143
- }
144
-
145
- GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_1M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DFLL_Val ) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV (24u );
146
-
147
- while ( GCLK -> SYNCBUSY .bit .GENCTRL5 ){
148
- /* Wait for synchronization */
149
- }
150
-
144
+ while ( !OSCCTRL -> STATUS .bit .DFLLRDY )
145
+ {
146
+ /* Wait for synchronization */
147
+ }
148
+
149
+ GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_1M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DFLL_Val ) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV (24u );
150
+
151
+ while ( GCLK -> SYNCBUSY .bit .GENCTRL5 ){
152
+ /* Wait for synchronization */
153
+ }
154
+
151
155
152
156
/* ------------------------------------------------------------------------
153
157
* Set up the PLLs
154
158
*/
155
159
156
- //PLL0 is 120MHz
157
- GCLK -> PCHCTRL [OSCCTRL_GCLK_ID_FDPLL0 ].reg = (1 << GCLK_PCHCTRL_CHEN_Pos ) | GCLK_PCHCTRL_GEN (GCLK_PCHCTRL_GEN_GCLK5_Val );
158
-
159
- OSCCTRL -> Dpll [0 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0x00 ) | OSCCTRL_DPLLRATIO_LDR (59 ); //120 Mhz
160
-
161
- while (OSCCTRL -> Dpll [0 ].DPLLSYNCBUSY .bit .DPLLRATIO );
162
-
163
- //MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
164
- OSCCTRL -> Dpll [0 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS ;
165
-
166
- OSCCTRL -> Dpll [0 ].DPLLCTRLA .reg = OSCCTRL_DPLLCTRLA_ENABLE ;
167
-
168
- while ( OSCCTRL -> Dpll [0 ].DPLLSTATUS .bit .CLKRDY == 0 || OSCCTRL -> Dpll [0 ].DPLLSTATUS .bit .LOCK == 0 );
169
-
170
- //PLL1 is 100MHz
171
- GCLK -> PCHCTRL [OSCCTRL_GCLK_ID_FDPLL1 ].reg = (1 << GCLK_PCHCTRL_CHEN_Pos ) | GCLK_PCHCTRL_GEN (GCLK_PCHCTRL_GEN_GCLK5_Val );
172
-
173
- OSCCTRL -> Dpll [1 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0x00 ) | OSCCTRL_DPLLRATIO_LDR (49 ); //100 Mhz
174
-
175
- while (OSCCTRL -> Dpll [1 ].DPLLSYNCBUSY .bit .DPLLRATIO );
176
-
177
- //MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
178
- OSCCTRL -> Dpll [1 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS ;
179
-
180
- OSCCTRL -> Dpll [1 ].DPLLCTRLA .reg = OSCCTRL_DPLLCTRLA_ENABLE ;
181
-
182
- while ( OSCCTRL -> Dpll [1 ].DPLLSTATUS .bit .CLKRDY == 0 || OSCCTRL -> Dpll [1 ].DPLLSTATUS .bit .LOCK == 0 );
183
-
160
+ //PLL0 is 120MHz
161
+ GCLK -> PCHCTRL [OSCCTRL_GCLK_ID_FDPLL0 ].reg = (1 << GCLK_PCHCTRL_CHEN_Pos ) | GCLK_PCHCTRL_GEN (GCLK_PCHCTRL_GEN_GCLK5_Val );
162
+
163
+ OSCCTRL -> Dpll [0 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0x00 ) | OSCCTRL_DPLLRATIO_LDR (59 ); //120 Mhz
164
+
165
+ while (OSCCTRL -> Dpll [0 ].DPLLSYNCBUSY .bit .DPLLRATIO );
166
+
167
+ //MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
168
+ OSCCTRL -> Dpll [0 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS ;
169
+
170
+ OSCCTRL -> Dpll [0 ].DPLLCTRLA .reg = OSCCTRL_DPLLCTRLA_ENABLE ;
171
+
172
+ while ( OSCCTRL -> Dpll [0 ].DPLLSTATUS .bit .CLKRDY == 0 || OSCCTRL -> Dpll [0 ].DPLLSTATUS .bit .LOCK == 0 );
173
+
174
+ //PLL1 is 100MHz
175
+ GCLK -> PCHCTRL [OSCCTRL_GCLK_ID_FDPLL1 ].reg = (1 << GCLK_PCHCTRL_CHEN_Pos ) | GCLK_PCHCTRL_GEN (GCLK_PCHCTRL_GEN_GCLK5_Val );
176
+
177
+ OSCCTRL -> Dpll [1 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0x00 ) | OSCCTRL_DPLLRATIO_LDR (49 ); //100 Mhz
178
+
179
+ while (OSCCTRL -> Dpll [1 ].DPLLSYNCBUSY .bit .DPLLRATIO );
180
+
181
+ //MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
182
+ OSCCTRL -> Dpll [1 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS ;
183
+
184
+ OSCCTRL -> Dpll [1 ].DPLLCTRLA .reg = OSCCTRL_DPLLCTRLA_ENABLE ;
185
+
186
+ while ( OSCCTRL -> Dpll [1 ].DPLLSTATUS .bit .CLKRDY == 0 || OSCCTRL -> Dpll [1 ].DPLLSTATUS .bit .LOCK == 0 );
187
+
184
188
185
189
/* ------------------------------------------------------------------------
186
190
* Set up the peripheral clocks
187
191
*/
188
192
189
193
//48MHZ CLOCK FOR USB AND STUFF
190
194
GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_48M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DFLL_Val ) |
191
- GCLK_GENCTRL_IDC |
192
- //GCLK_GENCTRL_OE |
193
- GCLK_GENCTRL_GENEN ;
194
-
195
- while ( GCLK -> SYNCBUSY .reg & GENERIC_CLOCK_GENERATOR_48M_SYNC )
196
- {
197
- /* Wait for synchronization */
198
- }
199
-
200
- //100MHZ CLOCK FOR OTHER PERIPHERALS
201
- GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_100M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DPLL1_Val ) |
202
- GCLK_GENCTRL_IDC |
203
- //GCLK_GENCTRL_OE |
204
- GCLK_GENCTRL_GENEN ;
205
-
206
- while ( GCLK -> SYNCBUSY .reg & GENERIC_CLOCK_GENERATOR_100M_SYNC )
207
- {
208
- /* Wait for synchronization */
209
- }
210
-
195
+ GCLK_GENCTRL_IDC |
196
+ //GCLK_GENCTRL_OE |
197
+ GCLK_GENCTRL_GENEN ;
198
+
199
+ while ( GCLK -> SYNCBUSY .reg & GENERIC_CLOCK_GENERATOR_48M_SYNC )
200
+ {
201
+ /* Wait for synchronization */
202
+ }
203
+
204
+ //100MHZ CLOCK FOR OTHER PERIPHERALS
205
+ GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_100M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DPLL1_Val ) |
206
+ GCLK_GENCTRL_IDC |
207
+ //GCLK_GENCTRL_OE |
208
+ GCLK_GENCTRL_GENEN ;
209
+
210
+ while ( GCLK -> SYNCBUSY .reg & GENERIC_CLOCK_GENERATOR_100M_SYNC )
211
+ {
212
+ /* Wait for synchronization */
213
+ }
214
+
211
215
//12MHZ CLOCK FOR DAC
212
- GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_12M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DFLL_Val ) |
216
+ GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_12M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DFLL_Val ) |
213
217
GCLK_GENCTRL_IDC |
214
218
GCLK_GENCTRL_DIV (4 ) |
215
219
GCLK_GENCTRL_DIVSEL |
216
220
//GCLK_GENCTRL_OE |
217
221
GCLK_GENCTRL_GENEN ;
218
-
219
- while ( GCLK -> SYNCBUSY .reg & GENERIC_CLOCK_GENERATOR_12M_SYNC )
222
+
223
+ while ( GCLK -> SYNCBUSY .reg & GENERIC_CLOCK_GENERATOR_12M_SYNC )
220
224
{
221
- /* Wait for synchronization */
225
+ /* Wait for synchronization */
222
226
}
223
227
224
228
/*---------------------------------------------------------------------
225
- * Set up main clock
226
- */
227
-
228
- GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_MAIN ].reg = GCLK_GENCTRL_SRC (MAIN_CLOCK_SOURCE ) |
229
- GCLK_GENCTRL_IDC |
230
- //GCLK_GENCTRL_OE |
231
- GCLK_GENCTRL_GENEN ;
232
-
229
+ * Set up main clock
230
+ */
231
+
232
+ GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_MAIN ].reg = GCLK_GENCTRL_SRC (MAIN_CLOCK_SOURCE ) |
233
+ GCLK_GENCTRL_IDC |
234
+ //GCLK_GENCTRL_OE |
235
+ GCLK_GENCTRL_GENEN ;
236
+
233
237
234
238
while ( GCLK -> SYNCBUSY .reg & GCLK_SYNCBUSY_GENCTRL0 )
235
- {
236
- /* Wait for synchronization */
237
- }
239
+ {
240
+ /* Wait for synchronization */
241
+ }
238
242
239
243
MCLK -> CPUDIV .reg = MCLK_CPUDIV_DIV_DIV1 ;
240
-
244
+
241
245
/* Use the LDO regulator by default */
242
246
SUPC -> VREG .bit .SEL = 0 ;
243
247
244
-
248
+
245
249
/* If desired, enable cache! */
246
250
#if defined(ENABLE_CACHE )
247
251
__disable_irq ();
248
252
CMCC -> CTRL .reg = 1 ;
249
253
__enable_irq ();
250
254
#endif
251
-
255
+
252
256
//*************** END SAMD51 *************************//
253
257
254
258
#else
0 commit comments