5 XOSCHF with External Clock
To use XOSCHF with an external clock signal, the SELHF bit and the ENABLE bit in
the External High-Frequency Oscillator Control A (CLKCTRL.XOSCHFCTRLA) register must be
written to ‘1
’.
This register has Configuration Change Protection (CCP), so
the ccp_write_io
function in cpufunc.h
should be used
to ensure correct timing for the unlock of the register.
/* Enable external clock input */ ccp_write_io((uint8_t *) &CLKCTRL.XOSCHFCTRLA, CLKCTRL_SELHF_EXTCLOCK_gc | CLKCTRL_ENABLE_bm);
If changing Main Clock to use XOSCHF as the clock source, first make sure to
set the Main Clock prescaler to output maximum 24 MHz by writing a prescaler setting to
the Prescaler Division (PDIV) bit field and ‘1
’ to the Prescaler Enable
(PEN) bit in the Main Clock Control B (CLKCTRL.MCLKCTRLB) register. This register also
has CCP.
/* Set Main Clock Prescaler */
ccp_write_io((uint8_t *) &CLKCTRL.MCLKCTRLB,
CLKCTRL_PDIV_2X_gc | CLKCTRL_PEN_bm);
Change Main Clock source by writing the EXTCLK setting to the Clock Select
(CLKSEL) bit field in the Main Clock Control A (CLKCTRL.MCLKCTRLA) register. The Main
Clock Out (CLKOUT) bit can be written to ‘1
’ to output the Main Clock
on the CLKOUT pin. This register also has CCP.
/* Set the main clock to use XOSCHF as source, and enable the CLKOUT pin */ ccp_write_io((uint8_t *) &CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_EXTCLK_gc | CLKCTRL_CLKOUT_bm);
After changing the Main Clock source, wait for the switch to complete by
polling the Main Clock Oscillator Changing (SOSC) bit in the Main Clock Status
(CLKCTRL.MCLKSTATUS) register until the bit is read as ‘0
’.
/* Wait for system oscillator changing to complete */ while(CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm) { ; }
The code for this example is available in the
XOSCHF-with-external-clock folder in these github
repositories: