HAL_RCC_OscConfig занимает слишком много времени (около 170 мкс), мне нужно, чтобы он был <50 мкс при выходе из режима STOP

Разработка для STM32L053R8 на плате NUCLEO-L053R8.

У нас есть система, которая "просыпается" из сна каждые 200 мкс или около того, выполняет небольшую работу и затем возвращается в спящий режим (режим остановки). В идеале я хотел бы проснуться от STOP менее чем за 50 мкс. HAL_RCC_OscConfig() функция занимает около 170 мкс, что делает это усилие бессмысленным.

Из того, что я вижу, большую часть времени тратится на конфигурацию PLL, в частности цикл while ("Ожидание готовности PLL"), который следует за повторным включением PLL (около 98 мкс).

/* Configure the main PLL clock source, multiplication and division factors. */
__HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource,
                     RCC_OscInitStruct->PLL.PLLMUL,
                     RCC_OscInitStruct->PLL.PLLDIV);
/* Enable the main PLL. */
__HAL_RCC_PLL_ENABLE();

/* Get timeout */
tickstart = HAL_GetTick();

/* Wait till PLL is ready */  
while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET)
{
  if((HAL_GetTick() - tickstart ) > RCC_PLL_TIMEOUT_VALUE)
  {
    return HAL_TIMEOUT;
  }      
}  

Есть ли способы выйти из режима STOP и вернуться к полной скорости HSI менее чем за 50 мкс? Какой самый эффективный способ установить часы при пробуждении из STOP?

В настоящее время я использую метод, описанный в примере PWR_STOP, который выглядит следующим образом:

/* Enter Stop Mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

/* Stop interrupt that woke us up */
int ret = HAL_LPTIM_TimeOut_Stop_IT(&LptimHandle);
SystemDisableWakeupCounter();

/* Configures system clock after wake-up from STOP: enable HSI, PLL and select
PLL as system clock source (HSI and PLL are disabled automatically in STOP mode) */
SystemClockConfig_STOP();

Призыв к SystemClockConfig_STOP() по очереди звонки SystemClock_Config(), который настраивает часы и включает эту длительную задержку в HAL_RCC_OscConfig(&RCC_OscInitStruct),

Заранее большое спасибо за любую помощь.

2 ответа

Решение

Я не знаю, какой у вас источник PLL, но рекомендуется HSI16. Все из справочника.

Тактовый сигнал HSI16 генерируется внутренним RC-генератором 16 МГц. Его можно использовать непосредственно как системные часы или как вход ФАПЧ.

Часы HSI16 можно использовать после выхода из режима "Стоп с низким энергопотреблением", это обеспечивает меньшее время включения, чем включение с использованием часов MSI.


Если вы можете позволить немного более высокое потребление, не отключайте внутренний регулятор. Это компромисс: быстрее просыпаться с более высоким потреблением или медленнее, экономя больше энергии, решите, что для вас важнее.

При выходе из режима Stop путем выдачи прерывания или события пробуждения RC-генератор MSI или HSI16 выбирается в качестве системных часов в зависимости от бита STOPWUCK в регистре RCC_CFGR.

Когда регулятор напряжения работает в режиме пониженного энергопотребления, возникает дополнительная задержка запуска при выходе из режима останова. При включенном внутреннем регуляторе в режиме останова потребление увеличивается, хотя время запуска сокращается.


Теперь я полагаю, что использование PLL является обязательным, но я боюсь, что помимо вышесказанного, вы не можете ничего сделать со временем запуска. ФАПЧ требуется определенное время, чтобы зафиксировать на частоте входного опорного тактового сигнала. Но сначала входная частота должна стать стабильной (поэтому рекомендуется использовать HSI16).

Вместо ожидания блокировки (while цикл) вы можете использовать прерывание.

Прерывание может быть сгенерировано, когда ФАПЧ готово, если оно включено в регистре RCC_CIER (см. Раздел 7.3.5).

И пока PLL блокируется, вы можете выполнять некоторые задачи на 16 МГц, и задачи, требующие полной скорости, могут быть запущены при получении прерывания (завершите настройку тактовой частоты в ISR).

Что ж, в спецификации указано, что блокировка ФАПЧ может занять до 160 мкс, поэтому задержка будет существовать до тех пор, пока вы пытаетесь использовать ФАПЧ.

введите описание изображения здесь

Вам нужен PLL вообще?

Вы можете настроить RCC на пробуждение с HSI, уже работающим на 16 МГц (см. RCC_CFGR_STOPWUCK немного). Вы получаете только половину скорости, но она заработала в 6 раз.

Другие вопросы по тегам