I am setting up system clocks for an Atmel Cortex M4 SAM4S Processor. For both the Main Oscillator Register (CKGR_MOR
) and the PLL Registers(CKGR_PLLxR
), there are variables (MOSCXTST
and PLLxCOUNT
, respectively) which allow to specify a longer startup time. Setting these values to 0 doesn't seem to affect performance, so I was wondering what the purpuse of these variables is, and how to choose the right value.
Here is my current code, the relevant lines are indicated (->
).
//setup clocks
//enable crystal oscillator
-> PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCXTST(0) | CKGR_MOR_MOSCXTEN;
while(!(PMC->PMC_SR & PMC_SR_MOSCXTS));
//switch to crystal oscillator
PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCSEL;
while(!(PMC->PMC_SR & PMC_SR_MOSCSELS));
//measure frequency
while(!(PMC->CKGR_MCFR & CKGR_MCFR_MAINFRDY));
freq = PMC->CKGR_MCFR;
//configure PLLA
-> PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(20-1) | CKGR_PLLAR_PLLACOUNT(0) | CKGR_PLLAR_DIVA(1);
while(!(PMC->PMC_SR & PMC_SR_LOCKA));
//set flash wait states
EFC0->EEFC_FMR = EEFC_FMR_FWS(5) | EEFC_FMR_CLOE;
EFC1->EEFC_FMR = EEFC_FMR_FWS(5) | EEFC_FMR_CLOE;
//set master clock to PLLA
// PMC->PMC_MCKR = PMC_MCKR_PRES_CLK_2 | PMC_MCKR_CSS_MAIN_CLK;
// while(!(PMC->PMC_SR & PMC_SR_MCKRDY));
// PMC->PMC_MCKR = PMC_MCKR_PRES_CLK_2 | PMC_MCKR_CSS_PLLA_CLK;
// while(!(PMC->PMC_SR & PMC_SR_MCKRDY));
PMC->PMC_MCKR = PMC_MCKR_PLLADIV2 | PMC_MCKR_CSS_PLLA_CLK;
while(!(PMC->PMC_SR & PMC_SR_MCKRDY));