Обработка событий для 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 может привести к повтору остановки.