Skip to content

Commit 3461ace

Browse files
committed
DM: oops committed wrong stuff, actually fixed DPLL problems
1 parent 0da4144 commit 3461ace

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

cores/arduino/startup.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
//USE DPLL0 for 120MHZ
3535
#define MAIN_CLOCK_SOURCE GCLK_GENCTRL_SRC_DPLL0
3636

37+
#define GENERIC_CLOCK_GENERATOR_1M (5u)
38+
#define CRYSTALLESS
39+
3740
#else
3841

3942
#define GENERIC_CLOCK_GENERATOR_XOSC32K (1u)
@@ -52,7 +55,7 @@ void SystemInit( void )
5255
NVMCTRL->CTRLA.reg |= NVMCTRL_CTRLA_RWS(0);
5356

5457
#if defined(CRYSTALLESS)
55-
//TODO:
58+
5659

5760
#else // has crystal
5861

@@ -132,30 +135,41 @@ void SystemInit( void )
132135
{
133136
/* Wait for synchronization */
134137
}
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+
135145

136146
/* ------------------------------------------------------------------------
137147
* Set up the PLLs
138148
*/
139149

140150
//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
142154

143155
while(OSCCTRL->Dpll[0].DPLLSYNCBUSY.bit.DPLLRATIO);
144156

145157
//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;
147159

148160
OSCCTRL->Dpll[0].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE;
149161

150162
while( OSCCTRL->Dpll[0].DPLLSTATUS.bit.CLKRDY == 0 || OSCCTRL->Dpll[0].DPLLSTATUS.bit.LOCK == 0 );
151163

152164
//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
154168

155169
while(OSCCTRL->Dpll[1].DPLLSYNCBUSY.bit.DPLLRATIO);
156170

157171
//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;
159173

160174
OSCCTRL->Dpll[1].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE;
161175

0 commit comments

Comments
 (0)