|
@@ -0,0 +1,45 @@
|
|
|
|
+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; //прерывание включено
|