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