http://forum.easyelectronics.ru/viewtopic.php?t=35047&p=546084#p546084

Делал автоматический переход при сбое генерации на кварце.
Вчера вечером запустить не получилось, сегодня стал разбираться внимательно и наконец то доперло:

Если в обработчике стоит условие:
Код:
if (CLK->CSSR & CLK_CSSR_CSSD)
   {
           CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV);   
     CLK->CSSR &=(~CLK_CSSR_CSSD);
   }


Фиг оно отключит делитель (F=16 МГц), выскочит из обработчика и частота останется F/8 = 2МГц

Нужно ждать флага AUX

и соответственно обработчик будет выглядеть так:

Код:
if (CLK->CSSR & CLK_CSSR_CSSD)
   {   
     CLK->CSSR &=(~CLK_CSSR_CSSD);
   }
   
if (CLK->CSSR & CLK_CSSR_AUX)
{
      CLK->ICKR |= CLK_ICKR_HSIEN;  // <=== Можно не ставить, оно и так уже включено
      CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV);
}   


Сам код настройки и переключения в основной программе:
Код:
//-------------Запуск в режиме HSI------------------------
     CLK->ICKR |= CLK_ICKR_HSIEN; //внутренний генератор на 16MHz
     CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); //делитель вырубить
   //------------Конфигурируем HSE -------------------------   
      CLK->SWCR |=CLK_SWCR_SWEN;
      CLK->SWR = 0xB4;  // как будет готов (HSERDY=1) переключится сам, ждать где то 2000 тактов
      CLK->ECKR |= CLK_ECKR_HSEEN; 
   //-----------Настраиваем аварийное переключение на HSI---   
      CLK->CSSR |= CLK_CSSR_CSSEN;
      CLK->CSSR |= CLK_CSSR_CSSDIE; //прерывание включено    
