34
34
//USE DPLL0 for 120MHZ
35
35
#define MAIN_CLOCK_SOURCE GCLK_GENCTRL_SRC_DPLL0
36
36
37
+ #define GENERIC_CLOCK_GENERATOR_1M (5u)
38
+ #define CRYSTALLESS
39
+
37
40
#else
38
41
39
42
#define GENERIC_CLOCK_GENERATOR_XOSC32K (1u)
@@ -52,7 +55,7 @@ void SystemInit( void )
52
55
NVMCTRL -> CTRLA .reg |= NVMCTRL_CTRLA_RWS (0 );
53
56
54
57
#if defined(CRYSTALLESS )
55
- //TODO:
58
+
56
59
57
60
#else // has crystal
58
61
@@ -132,30 +135,41 @@ void SystemInit( void )
132
135
{
133
136
/* Wait for synchronization */
134
137
}
138
+
139
+ GCLK -> GENCTRL [GENERIC_CLOCK_GENERATOR_1M ].reg = GCLK_GENCTRL_SRC (GCLK_GENCTRL_SRC_DFLL_Val ) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV (24u );
140
+
141
+ while ( GCLK -> SYNCBUSY .bit .GENCTRL5 ){
142
+ /* Wait for synchronization */
143
+ }
144
+
135
145
136
146
/* ------------------------------------------------------------------------
137
147
* Set up the PLLs
138
148
*/
139
149
140
150
//PLL0 is 120MHz
141
- OSCCTRL -> Dpll [0 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0x32 ) | OSCCTRL_DPLLRATIO_LDR (0xe4a ); //120 Mhz
151
+ GCLK -> PCHCTRL [OSCCTRL_GCLK_ID_FDPLL0 ].reg = (1 << GCLK_PCHCTRL_CHEN_Pos ) | GCLK_PCHCTRL_GEN (GCLK_PCHCTRL_GEN_GCLK5_Val );
152
+
153
+ OSCCTRL -> Dpll [0 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0x00 ) | OSCCTRL_DPLLRATIO_LDR (59 ); //120 Mhz
142
154
143
155
while (OSCCTRL -> Dpll [0 ].DPLLSYNCBUSY .bit .DPLLRATIO );
144
156
145
157
//MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
146
- OSCCTRL -> Dpll [0 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_XOSC32 | OSCCTRL_DPLLCTRLB_LBYPASS ;
158
+ OSCCTRL -> Dpll [0 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS ;
147
159
148
160
OSCCTRL -> Dpll [0 ].DPLLCTRLA .reg = OSCCTRL_DPLLCTRLA_ENABLE ;
149
161
150
162
while ( OSCCTRL -> Dpll [0 ].DPLLSTATUS .bit .CLKRDY == 0 || OSCCTRL -> Dpll [0 ].DPLLSTATUS .bit .LOCK == 0 );
151
163
152
164
//PLL1 is 100MHz
153
- OSCCTRL -> Dpll [1 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0xc ) | OSCCTRL_DPLLRATIO_LDR (0xbea ); //120 Mhz
165
+ GCLK -> PCHCTRL [OSCCTRL_GCLK_ID_FDPLL1 ].reg = (1 << GCLK_PCHCTRL_CHEN_Pos ) | GCLK_PCHCTRL_GEN (GCLK_PCHCTRL_GEN_GCLK5_Val );
166
+
167
+ OSCCTRL -> Dpll [1 ].DPLLRATIO .reg = OSCCTRL_DPLLRATIO_LDRFRAC (0x00 ) | OSCCTRL_DPLLRATIO_LDR (0x49 ); //100 Mhz
154
168
155
169
while (OSCCTRL -> Dpll [1 ].DPLLSYNCBUSY .bit .DPLLRATIO );
156
170
157
171
//MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
158
- OSCCTRL -> Dpll [1 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_XOSC32 | OSCCTRL_DPLLCTRLB_LBYPASS ;
172
+ OSCCTRL -> Dpll [1 ].DPLLCTRLB .reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS ;
159
173
160
174
OSCCTRL -> Dpll [1 ].DPLLCTRLA .reg = OSCCTRL_DPLLCTRLA_ENABLE ;
161
175
0 commit comments