Ok, so I've managed to work around the issue - I've modified the following function and everything seems to work as expected.
status_t CLOCK_SetExternalRefClkConfig(mcg_oscsel_t oscsel)
{
bool needDelay;
uint32_t i;
#if (defined(MCG_CONFIG_CHECK_PARAM) && MCG_CONFIG_CHECK_PARAM)
/* If change MCG_C7[OSCSEL] and external reference clock is system clock source, return error. */
if ((MCG_C7_OSCSEL_VAL != oscsel) && (!(MCG->S & MCG_S_IREFST_MASK)))
{
return kStatus_MCG_SourceUsed;
}
#endif /* MCG_CONFIG_CHECK_PARAM */
// #######
// FIX - RETURN EARLY AS THE FOLLOWING CAUSES A HARD FAULT
// #######
return kStatus_Success;
if (MCG_C7_OSCSEL_VAL != oscsel)
{
// If change OSCSEL, need to delay, ERR009878.
needDelay = true;
}
else
{
needDelay = false;
}
MCG->C7 = (MCG->C7 & ~MCG_C7_OSCSEL_MASK) | MCG_C7_OSCSEL(oscsel);
if (kMCG_OscselOsc == oscsel)
{
if (MCG->C2 & MCG_C2_EREFS_MASK)
{
while (!(MCG->S & MCG_S_OSCINIT0_MASK))
{
}
}
}
if (needDelay)
{
/* ERR009878 Delay at least 50 micro-seconds for external clock change valid. */
i = 1500U;
while (i--)
{
__NOP();
}
}
return kStatus_Success;
}