9 CFD on XOSCHF
To use Clock Failure Detection (CFD) on the External High-Frequency Oscillator (XOSCHF),
write the XOSCHF setting to the Clock Failure Detection Source (CFDSRC) bit field and
‘1
’ to the Clock Failure Detection Enable (CFDEN) bit in the Main Clock
Control C (CLKCTRL.MCLKCTRLC) register.
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 Clock Failure Detection on XOSCHF */ ccp_write_io((uint8_t *) &CLKCTRL.MCLKCTRLC, CLKCTRL_CFDSRC_XOSCHF_gc | CLKCTRL_CFDEN_bm);
To enable the regular CFD interrupt, write ‘0
’ to the Interrupt
Type (INTTYPE) bit and ‘1
’ to the Clock Failure Detection (CFD) bit in the
Main Clock Interrupt Control (CLKCTRL.MCLKINTCTRL) register. This register also has CCP.
/* Enable regular interrupt for CFD */ ccp_write_io((uint8_t *) &CLKCTRL.MCLKINTCTRL, CLKCTRL_CFD_bm);
The CFD vector will be called when the interrupt is triggered. Before returning from the
Interrupt Service Routine (ISR), the Clock Failure Detection (CFD) interrupt flag in the Main
Clock Interrupt Flags (CLKCTRL.MCLKINTFLAGS) register must be cleared. This is done by writing
a ‘1
’ to the flag.
ISR(CLKCTRL_CFD_vect) { /* This interrupt will trigger every time the CFD detects XOSCHF has stopped * The Main Clock source is OSCHF so the CPU is not affected */ LED0_toggle(); /* Clear the CFD interrupt flag */ CLKCTRL.MCLKINTFLAGS = CLKCTRL_CFD_bm; }
The code for this example is available in the
CFD-on-XOSCHF folder in these github repositories: