Zuse 0 Вторник в 11:59 Опубликовано Вторник в 11:59 · Жалоба Всем привет. Пишу программку для одного устройства с МК Cortex-M4F, в котором в определенные моменты времени для снижения потребления хочу переключаться с PLL на генератор 8 Мгц и обратно. В примерах инициализации системы тактирования обычно при переходе на PLL есть цикл ожидания совершения перехода, по завершении которого программа идет исполняться дальше. Вопрос: если время, за которое исполняется команда, не критично, можно ли продолжить исполнение программы, не дожидаясь завершения смены источника тактирования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 128 Вторник в 12:03 Опубликовано Вторник в 12:03 · Жалоба Можно. В противном случае вы ведь все равно будете исполнять команды (опроса флага завершения перехода). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 Вторник в 12:06 Опубликовано Вторник в 12:06 · Жалоба Переключаться можно, не дожидаясь. Внутренняя логика переключения гарантирует безглючный переход. Упс. Не для любых МК, конечно же. Все эти ожидания делают для чувствительной периферии, такой как USB или даже банально UART-ов, печатающих что-то в консоль или куда-то еще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 213 Вторник в 12:08 Опубликовано Вторник в 12:08 · Жалоба Во-первых - о каком МК речь? Во-вторых - не "ожидание совершения перехода", а "ожидание стабилизации PLL после его включения, до переключения тактирования на него". До которого нужно ещё включить внешний генератор (если он включаемый), и дождаться его стабилизации. 9 минут назад, Zuse сказал: Вопрос: если время, за которое исполняется команда, не критично, можно ли продолжить исполнение программы, не дожидаясь завершения смены источника тактирования? Если критична работоспособность программы - нельзя. И для снижения потребления недостаточно переключиться на RC-генератор. Нужно ещё и выключить PLL и выключить внешний генератор (если переключаетесь на внутренний). А может и вообще не нужно никуда переключаться, может достаточно просто снизить частоту тактирования? PS: Вообще - читайте раздел "clocking" мануала на ваш МК, а не примеры изучайте. Примеры - только для прояснения неясных моментов документации. 2 минуты назад, Arlleex сказал: Переключаться можно, не дожидаясь. Слишком безоглядное заявление, не зная какой МК у ТСа.... Вы все мануалы на все в мире Cortex-M4F изучили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 Вторник в 12:10 Опубликовано Вторник в 12:10 · Жалоба Только что, jcxz сказал: Слишком безоглядное заявление, не зная какой МК у ТСа.... Согласен, поправил выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 70 Вторник в 12:16 Опубликовано Вторник в 12:16 · Жалоба А какой микроконтроллер то? Обычно ожидается флаг готовности выбранного источника тактирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 Вторник в 12:19 Опубликовано Вторник в 12:19 · Жалоба 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 213 Вторник в 12:27 Опубликовано Вторник в 12:27 · Жалоба 2 минуты назад, Zuse сказал: 1921ВК035 Нет, после того, как PLL стабилизировалась, идет смена источника тактирования и в цикле проверяется, что в статусном регистре установился номер нужного источника Что "нет"? Переключение тактирования всей системы (в которую входит и ядро и периферия) на стабилизировавшийся PLL, происходит после тех шагов, которые я писал. Но те шаги всё равно обычно нужны. С вашим МК не знаком, но сильно сомневаюсь, что у него PLL стартует и стабилируется мгновенно, без необходимости ожидания. Само переключение тактирования системы тоже может быть не мгновенным и тоже может требовать ожидания. Но скорей всего - это самая малая часть общего ожидания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 Вторник в 12:27 Опубликовано Вторник в 12:27 (изменено) · Жалоба 26 minutes ago, Сергей Борщ said: В противном случае вы ведь все равно будете исполнять команды (опроса флага завершения перехода). Я это понимаю, но спросил из соображений "как бы чего не вышло" Изменено Вторник в 12:28 пользователем Zuse Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 20 Вторник в 12:42 Опубликовано Вторник в 12:42 · Жалоба 42 minutes ago, Zuse said: Вопрос: если время, за которое исполняется команда, не критично, можно ли продолжить исполнение программы, не дожидаясь завершения смены источника тактирования? смена источника тактирования проиходит крайне быстро - это по сути переключение мультиплексора источника тактовой с одного входа на другой, ничего не мешает заранее настроить и завести PLL, не дожидаясь его стабилизации, и паралельно работать дальше на встроеннм RC генераторе, а переключится потом можно в любое время и очень быстро Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 48 Вторник в 12:44 Опубликовано Вторник в 12:44 · Жалоба On 7/9/2024 at 3:42 PM, Forger said: смена источника тактирования проиходит крайне быстро - это по сути переключение мультиплексора источника тактовой с одного входа на другой, ничего не мешает заранее настроить и завести PLL, не дожидаясь его стабилизации, и паралельно работать дальше на встроеннм RC генераторе, а переключится потом можно в любое время и очень быстро Ну, так ведь можно еще немножко кружануть потребления, если выключать PLL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 20 Вторник в 12:57 Опубликовано Вторник в 12:57 · Жалоба 11 minutes ago, dimka76 said: Ну, так ведь можно еще немножко кружануть потребления, если выключать PLL. Разумеется в батарейных включать PLL надо когда надо, а не когда воткнули батарейку )) Тут вопрос бы про ожидание пока PLL застабилизируется, так пока он стабилизируется проц работает на внутреннем RC генератора, который стартует всегда первым без вариантов. Поэтому ничего не мешает коду выполнятся, пока ждем готовности PLL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 Вторник в 13:02 Опубликовано Вторник в 13:02 · Жалоба 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 20 Вторник в 13:08 Опубликовано Вторник в 13:08 · Жалоба 5 minutes ago, Zuse said: Вопрос был про ожидание смены источника тактирования в статусном регистре. Вот не поленитесь и посчитайте в тактах, сколько времени требуется на переключения мультиплексора тактовой? А то окажется что там не наберется и микросекунды )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zuse 0 Вторник в 13:18 Опубликовано Вторник в 13:18 · Жалоба 6 minutes ago, Forger said: Вот не поленитесь и посчитайте в тактах, сколько времени требуется на переключения мультиплексора тактовой? А то окажется что там не наберется и микросекунды )) Я думаю, что время небольшое, но его не посчитать - тут речь про микроархитектурную реализацию переключения. Как он происходит, мы не знаем. Но меня не задержка волнует, а цикл ожидания. Для чего он? Для детерминированности выполнения программы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться