quartz-guard.txt 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. http://forum.easyelectronics.ru/viewtopic.php?t=35047&p=546084#p546084
  2. Делал автоматический переход при сбое генерации на кварце.
  3. Вчера вечером запустить не получилось, сегодня стал разбираться внимательно и наконец то доперло:
  4. Если в обработчике стоит условие:
  5. Код:
  6. if (CLK->CSSR & CLK_CSSR_CSSD)
  7. {
  8. CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV);
  9. CLK->CSSR &=(~CLK_CSSR_CSSD);
  10. }
  11. Фиг оно отключит делитель (F=16 МГц), выскочит из обработчика и частота останется F/8 = 2МГц
  12. Нужно ждать флага AUX
  13. и соответственно обработчик будет выглядеть так:
  14. Код:
  15. if (CLK->CSSR & CLK_CSSR_CSSD)
  16. {
  17. CLK->CSSR &=(~CLK_CSSR_CSSD);
  18. }
  19. if (CLK->CSSR & CLK_CSSR_AUX)
  20. {
  21. CLK->ICKR |= CLK_ICKR_HSIEN; // <=== Можно не ставить, оно и так уже включено
  22. CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV);
  23. }
  24. Сам код настройки и переключения в основной программе:
  25. Код:
  26. //-------------Запуск в режиме HSI------------------------
  27. CLK->ICKR |= CLK_ICKR_HSIEN; //внутренний генератор на 16MHz
  28. CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); //делитель вырубить
  29. //------------Конфигурируем HSE -------------------------
  30. CLK->SWCR |=CLK_SWCR_SWEN;
  31. CLK->SWR = 0xB4; // как будет готов (HSERDY=1) переключится сам, ждать где то 2000 тактов
  32. CLK->ECKR |= CLK_ECKR_HSEEN;
  33. //-----------Настраиваем аварийное переключение на HSI---
  34. CLK->CSSR |= CLK_CSSR_CSSEN;
  35. CLK->CSSR |= CLK_CSSR_CSSDIE; //прерывание включено