Zuse 0 9 июля Опубликовано 9 июля · Жалоба Всем привет. Пишу программку для одного устройства с МК Cortex-M4F, в котором в определенные моменты времени для снижения потребления хочу переключаться с PLL на генератор 8 Мгц и обратно. В примерах инициализации системы тактирования обычно при переходе на PLL есть цикл ожидания совершения перехода, по завершении которого программа идет исполняться дальше. Вопрос: если время, за которое исполняется команда, не критично, можно ли продолжить исполнение программы, не дожидаясь завершения смены источника тактирования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 9 июля Опубликовано 9 июля · Жалоба Можно. В противном случае вы ведь все равно будете исполнять команды (опроса флага завершения перехода). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 9 июля Опубликовано 9 июля · Жалоба Переключаться можно, не дожидаясь. Внутренняя логика переключения гарантирует безглючный переход. Упс. Не для любых МК, конечно же. Все эти ожидания делают для чувствительной периферии, такой как USB или даже банально UART-ов, печатающих что-то в консоль или куда-то еще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 9 июля Опубликовано 9 июля · Жалоба Во-первых - о каком МК речь? Во-вторых - не "ожидание совершения перехода", а "ожидание стабилизации PLL после его включения, до переключения тактирования на него". До которого нужно ещё включить внешний генератор (если он включаемый), и дождаться его стабилизации. 9 минут назад, Zuse сказал: Вопрос: если время, за которое исполняется команда, не критично, можно ли продолжить исполнение программы, не дожидаясь завершения смены источника тактирования? Если критична работоспособность программы - нельзя. И для снижения потребления недостаточно переключиться на RC-генератор. Нужно ещё и выключить PLL и выключить внешний генератор (если переключаетесь на внутренний). А может и вообще не нужно никуда переключаться, может достаточно просто снизить частоту тактирования? PS: Вообще - читайте раздел "clocking" мануала на ваш МК, а не примеры изучайте. Примеры - только для прояснения неясных моментов документации. 2 минуты назад, Arlleex сказал: Переключаться можно, не дожидаясь. Слишком безоглядное заявление, не зная какой МК у ТСа.... Вы все мануалы на все в мире Cortex-M4F изучили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 9 июля Опубликовано 9 июля · Жалоба Только что, jcxz сказал: Слишком безоглядное заявление, не зная какой МК у ТСа.... Согласен, поправил выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 9 июля Опубликовано 9 июля · Жалоба А какой микроконтроллер то? Обычно ожидается флаг готовности выбранного источника тактирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 9 июля Опубликовано 9 июля · Жалоба 9 minutes ago, jcxz said: Во-первых - о каком МК речь? 1921ВК035 11 minutes ago, jcxz said: Во-вторых - не "ожидание совершения перехода", а "ожидание стабилизации PLL после его включения, до переключения тактирования на него". До которого нужно ещё включить внешний генератор (если он включаемый), и дождаться его стабилизации. Нет, после того, как PLL стабилизировалась, идет смена источника тактирования и в цикле проверяется, что в статусном регистре установился номер нужного источника К моему МК производителем прилагается такой код: //switch sysclk RCU->SYSCLKCFG = (sysclk_source << RCU_SYSCLKCFG_SYSSEL_Pos); // Wait switching done timeout_counter = 0; while ((RCU->SYSCLKSTAT_bit.SYSSTAT != RCU->SYSCLKCFG_bit.SYSSEL) && (timeout_counter < SYSCLK_SWITCH_TIMEOUT)) timeout_counter++; if (timeout_counter == SYSCLK_SWITCH_TIMEOUT) //SYSCLK failed to switch while (1) {}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 9 июля Опубликовано 9 июля · Жалоба 2 минуты назад, Zuse сказал: 1921ВК035 Нет, после того, как PLL стабилизировалась, идет смена источника тактирования и в цикле проверяется, что в статусном регистре установился номер нужного источника Что "нет"? Переключение тактирования всей системы (в которую входит и ядро и периферия) на стабилизировавшийся PLL, происходит после тех шагов, которые я писал. Но те шаги всё равно обычно нужны. С вашим МК не знаком, но сильно сомневаюсь, что у него PLL стартует и стабилируется мгновенно, без необходимости ожидания. Само переключение тактирования системы тоже может быть не мгновенным и тоже может требовать ожидания. Но скорей всего - это самая малая часть общего ожидания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 9 июля Опубликовано 9 июля (изменено) · Жалоба 26 minutes ago, Сергей Борщ said: В противном случае вы ведь все равно будете исполнять команды (опроса флага завершения перехода). Я это понимаю, но спросил из соображений "как бы чего не вышло" Изменено 9 июля пользователем Zuse Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 июля Опубликовано 9 июля · Жалоба 42 minutes ago, Zuse said: Вопрос: если время, за которое исполняется команда, не критично, можно ли продолжить исполнение программы, не дожидаясь завершения смены источника тактирования? смена источника тактирования проиходит крайне быстро - это по сути переключение мультиплексора источника тактовой с одного входа на другой, ничего не мешает заранее настроить и завести PLL, не дожидаясь его стабилизации, и паралельно работать дальше на встроеннм RC генераторе, а переключится потом можно в любое время и очень быстро Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 9 июля Опубликовано 9 июля · Жалоба On 7/9/2024 at 3:42 PM, Forger said: смена источника тактирования проиходит крайне быстро - это по сути переключение мультиплексора источника тактовой с одного входа на другой, ничего не мешает заранее настроить и завести PLL, не дожидаясь его стабилизации, и паралельно работать дальше на встроеннм RC генераторе, а переключится потом можно в любое время и очень быстро Ну, так ведь можно еще немножко кружануть потребления, если выключать PLL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 июля Опубликовано 9 июля · Жалоба 11 minutes ago, dimka76 said: Ну, так ведь можно еще немножко кружануть потребления, если выключать PLL. Разумеется в батарейных включать PLL надо когда надо, а не когда воткнули батарейку )) Тут вопрос бы про ожидание пока PLL застабилизируется, так пока он стабилизируется проц работает на внутреннем RC генератора, который стартует всегда первым без вариантов. Поэтому ничего не мешает коду выполнятся, пока ждем готовности PLL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 9 июля Опубликовано 9 июля · Жалоба 4 minutes ago, Forger said: Тут вопрос бы про ожидание пока PLL застабилизируется Нет. Вопрос был про ожидание смены источника тактирования в статусном регистре. Еще раз привожу код производителя: //switch sysclk RCU->SYSCLKCFG = (sysclk_source << RCU_SYSCLKCFG_SYSSEL_Pos); // Wait switching done timeout_counter = 0; while ((RCU->SYSCLKSTAT_bit.SYSSTAT != RCU->SYSCLKCFG_bit.SYSSEL) && (timeout_counter < SYSCLK_SWITCH_TIMEOUT)) timeout_counter++; if (timeout_counter == SYSCLK_SWITCH_TIMEOUT) //SYSCLK failed to switch while (1) {}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 июля Опубликовано 9 июля · Жалоба 5 minutes ago, Zuse said: Вопрос был про ожидание смены источника тактирования в статусном регистре. Вот не поленитесь и посчитайте в тактах, сколько времени требуется на переключения мультиплексора тактовой? А то окажется что там не наберется и микросекунды )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 9 июля Опубликовано 9 июля · Жалоба 6 minutes ago, Forger said: Вот не поленитесь и посчитайте в тактах, сколько времени требуется на переключения мультиплексора тактовой? А то окажется что там не наберется и микросекунды )) Я думаю, что время небольшое, но его не посчитать - тут речь про микроархитектурную реализацию переключения. Как он происходит, мы не знаем. Но меня не задержка волнует, а цикл ожидания. Для чего он? Для детерминированности выполнения программы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться