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