Обработка событий для CSS происходит в обработчике немаскируемых прерываний, с целью гарантированной реакции на возникший сбой в работе МК:
/* nmi handler */void nmi_handler(void) { if (RCC->CIR & RCC_CIR_CSSF) { /* fail led blink enabled and disable hse led*/ TIM4->CCR3 = 100; TIM4->CCR4 = 0; /* reset CSSC flag */ RCC->CIR |= RCC_CIR_CSSC; }}В этом обработчике мы гасим синий светодиод, который индицирует о работе HSE и задаем значение 10% ШИМ для красного светодиода показывающего что произошел сбой системы тактирования.
Также в случае работы от внутреннего тактового сигнала мы выходим из обработчика прерываний таймера №4:
static char direct; /* if enable HSI CSS enabled, return */ if ((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_HSI) return;Это сделано по причине того, что у нас произошел сбой HSE и включение PLL может привести к повтору остановки.