startup.c

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