1

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));
A Farmanbar
  • 4,381
  • 5
  • 24
  • 42

0 Answers0