// externě připojeny 8 MHZ hodiny // interně je dělíme na 32kHz (vstup pro DFLL) // a pak je násobíme na 96MHz a ty pak dělíme na 48MHz void clock_init(void){ SYSCTRL->XOSC.reg = (SYSCTRL_XOSC_ENABLE); // enable 8MHz oscillator at input while((SYSCTRL->PCLKSR.reg & (SYSCTRL_PCLKSR_XOSCRDY)) == 0); // wait until start-up REG_NVMCTRL_CTRLB |= (NVMCTRL_CTRLB_RWS(1)); // flash wait state to 1 // config DPLL, DPLL jede ze 32kHz (vstup nesmi byt vetsi nez 33kHz), je potreba tedy 8MHz externi clock podělit ! SYSCTRL->DPLLCTRLA.reg = 0; // default values SYSCTRL->DPLLRATIO.reg = SYSCTRL_DPLLRATIO_LDR(2*F_CPU/F_INTERM); // PLL output can be 2*48 (2*F_CPU) => 96MHz SYSCTRL->DPLLCTRLB.reg = SYSCTRL_DPLLCTRLB_DIV(EXTCLK_DIV) | SYSCTRL_DPLLCTRLB_REFCLK(SYSCTRL_DPLLCTRLB_REFCLK_REF1_Val); // vybíráme externí clock SYSCTRL->DPLLCTRLA.reg = SYSCTRL_DPLLCTRLA_ENABLE; // spouštíme DPLL while(!(SYSCTRL->DPLLSTATUS.reg & (SYSCTRL_DPLLSTATUS_CLKRDY | SYSCTRL_DPLLSTATUS_LOCK)) == (SYSCTRL_DPLLSTATUS_CLKRDY | SYSCTRL_DPLLSTATUS_LOCK)); // čekáme než naskočí //For generic clock generator 0, select the DPLL Clock as input, divide by 2 GCLK->GENDIV.reg = ((2 << GCLK_GENDIV_DIV_Pos) | (0 << GCLK_GENDIV_ID_Pos)); GCLK->GENCTRL.reg = ((0 << GCLK_GENCTRL_ID_Pos) | (GCLK_SOURCE_FDPLL << GCLK_GENCTRL_SRC_Pos)| (GCLK_GENCTRL_GENEN)); GCLK->CLKCTRL.reg = ((GCLK_CLKCTRL_GEN_GCLK0) | (GCLK_CLKCTRL_CLKEN)) ; }