Ver código fonte

автоматический переход при сбое генерации на кварце

Vladimir Shilov 7 anos atrás
pai
commit
862ab38742
1 arquivos alterados com 45 adições e 0 exclusões
  1. 45 0
      quartz-guard.txt

+ 45 - 0
quartz-guard.txt

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