В STM32 есть механизм называемый Clock Security System, который позволяет продолжить работу микроконтроллера если произошел сбой в работе кварцевого генератора. В таком случае происходит автоматическое переключение на внутренний RC генератор и переход в прерывание что позволяет предпринять соответствующие меры для продолжения нормальной работы МК.

Из Reference manual

Clock security system (CSS)

Clock Security System can be activated by software. In this case, the clock detector is
enabled after the HSE oscillator startup delay, and disabled when this oscillator is stopped.
If a failure is detected on the HSE clock, the HSE oscillator is automatically disabled, a clock
failure event is sent to the break input of the advanced-control timers (TIM1 and TIM8) and
an interrupt is generated to inform the software about the failure (Clock Security System
Interrupt CSSI), allowing the MCU to perform rescue operations. The CSSI is linked to the
Cortex®-M3 NMI (Non-Maskable Interrupt) exception vector.
Note: Once the CSS is enabled and if the HSE clock fails, the CSS interrupt occurs and an NMI is
automatically generated. The NMI will be executed indefinitely unless the CSS interrupt
pending bit is cleared. As a consequence, in the NMI ISR user must clear the CSS interrupt
by setting the CSSC bit in the Clock interrupt register (RCC_CIR).
If the HSE oscillator is used directly or indirectly as the system clock (indirectly means: it is
used as PLL input clock, and the PLL clock is used as system clock), a detected failure
causes a switch of the system clock to the HSI oscillator and the disabling of the HSE
oscillator. If the HSE clock (divided or not) is the clock entry of the PLL used as system clock
when the failure occurs, the PLL is disabled too.

Работает это следующим образом.
При первоначальном старте, МК тактируется от RC генератора HSI и через переключатель System Clock Mux идет на ядро МК и периферию, т. е. МК тактируется частотой 8 МГц.

Скриншот

http://s5.uploads.ru/qJFhe.png

В процессе инициализации и настройки, обычно выполняется код который переключает тактирование на HSE (внешний кварцевый генератор) и активирует умножитель частоты настроив его таким образом чтобы системная частота стала равной 72 МГц.

Скриншот

http://sg.uploads.ru/P4nyT.png

Если включить Clock Security System, то при сбое работы кварцевого генератора, тактирование автоматически переключится на RC генератор HSI и настройки будут как на первом скриншоте (на ядро и периферию поступает частота 8 МГц). Кроме того, произойдет прерывание с переходом в обработчик NMI. Это так называемое не маскируемое прерывание (Non-Maskable Interrupt.) В нем можно принять соответствующие меры, скажем сообщить пользователю об аппаратной ошибке и попытаться наладить нормальную (насколько это возможно) работу МК. Прежде всего нужно установить частоту тактирования такой же как она была до сбоя HSE. Правда не всегда это возможно. При тактировании от RC генератора HSI, используя умножитель можно максимум получить частоту 64 МГц, что немного меньше чем 72 МГц, а все из-за делителя на 2 между HSI и умножителем.

Скриншот

http://s9.uploads.ru/9IZzW.png

Программа в которой включен Clock Security System.

Код:
#include "stm32f10x_conf.h"
#include "SysTimer.h"

extern uint32_t SystemCoreClock;

void NMI_Handler(void)
{
    if (RCC_GetITStatus(RCC_IT_CSS)) // Прерывание от Clock Security System.
    {
        RCC_ClearITPendingBit(RCC_IT_CSS);
        RCC_ClockSecuritySystemCmd(DISABLE);      // Выкл. Clock Security System.

        // Переключение тактирования на HSI (RC генератор 8 МГц).
        RCC_PLLCmd(DISABLE); // Выключаем умножитель частоты.
        RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_CFGR_PLLMULL16); // На сколько будем умножать частоту (8/2*16=64МГц).
        RCC_PLLCmd(ENABLE); // Включаем умножитель частоты.
        while ((RCC->CR & RCC_CR_PLLRDY) == 0);     // Ждем запуска умножителя частоты.
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Выбираем источником тактирования умножитель частоты.

        SystemCoreClockUpdate(); // Вычисление тактовой частоты ядра.
        SysTim_Init(100);
    }
}


int main(void)
{
    SystemCoreClockUpdate();
    SysTim_Init(100);

    if (RCC->CR & RCC_CR_HSERDY) // Тактирование от HSE (кварцевый резонатор).
    {
        RCC_HSICmd(ENABLE); // Включение RC генератора 8 МГц.
        RCC_ClockSecuritySystemCmd(ENABLE); // Активация Clock Security System.
    }


    GPIO_InitTypeDef Gpio;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // Вкл. тактирование порта GPIOC

    Gpio.GPIO_Pin = GPIO_Pin_13;
    Gpio.GPIO_Mode = GPIO_Mode_Out_PP;
    Gpio.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &Gpio); // Конфигурация GPIOC.

    while(1)
    {
        if (RCC->CR & RCC_CR_HSERDY) // Тактирование от HSE (кварцевый резонатор).
        {
            GPIO_SetBits(GPIOC, GPIO_Pin_13); // Мигание светодиода.
            SysTim_DelayMS(500);
            GPIO_ResetBits(GPIOC, GPIO_Pin_13);
            SysTim_DelayMS(500);
        }
        else // Тактирование от HSI (RC генератор).
        {
            GPIO_SetBits(GPIOC, GPIO_Pin_13); // Мигание светодиода.
            SysTim_DelayMS(900);
            GPIO_ResetBits(GPIOC, GPIO_Pin_13);
            SysTim_DelayMS(100);
        }

    }
}

В функции main проверяется работает ли кварцевый генератор HSE и если работает, то включается RC генератор HSI (это лишнее, потому что если HSI и HSE не работали бы, то МК не выполнял бы код), а затем активируется Clock Security System. В случае сбоя, тактирование автоматически переключится на HSI и будет выполнен переход в функцию NMI_Handler которая является обработчиком прерывания NMI. В ней проверяется источник прерывания и если это Clock Security System, тактирование настраивается как на скриншоте выше.
При необходимости можно в этом же прерывании включать HSE но не дожидаться начала его работы, а настроить прерывание, которое произойдет как только МК сможет запустить кварцевый генератор и уже в нем переключать тактирование на HSE.

Если залить эту программу в STM32F103C8T6 то светодиод подключенный к PC 13 будет мигать раз в секунду, светясь 0.5 секунды. В случае сбоя HSE (достаточно пальцем коснутся вывода кварцевого резонатора), светодиод будет также мигать раз в секунду, светясь 0.1 секунды.

Файлы. http://pure-basic.narod.ru/forum_files/ … System.zip