4

在 NUCLEO-L053R8 板上开发 STM32L053R8。

我们有一个系统,它每 200 μS 左右从睡眠中“唤醒”,做少量工作然后返回睡眠(停止模式)。理想情况下,我希望在 50 μS 内从 STOP 唤醒。该HAL_RCC_OscConfig()函数大约需要 170 μS,这使得这项工作毫无意义。

据我所知,大部分时间都花在了 PLL 配置上,特别是在重新启用 PLL 之后的 while 循环(“等待 PLL 准备就绪”)(大约 98 μS)。

/* 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;
  }      
}  

有什么方法可以在 50 μS 以下从 STOP 模式唤醒并恢复到全速 HSI?从 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).

非常感谢您提供的任何帮助。

4

2 回答 2

2

好吧,数据表说 PLL 锁定最多需要 160 μs,因此只要您尝试使用 PLL,就会出现延迟。

在此处输入图像描述

你需要PLL吗?

您可以将 RCC 配置为在 HSI 已经以 16 MHz 运行时唤醒(请参阅该RCC_CFGR_STOPWUCK位)。你只得到一半的速度,但它在 6 我们的时间内启动并运行。

于 2016-10-28T08:45:23.593 回答
1

我现在不知道你的 PLL 源是什么,但建议使用 HSI16。全部来自参考手册

HSI16 时钟信号由内部 16 MHz RC 振荡器产生。它可以直接用作系统时钟或 PLL 输入。

HSI16 时钟可以在从 Stop 低功耗模式唤醒后使用,这样可以确保比使用 MSI 时钟唤醒更短的唤醒时间。


如果您可以允许稍高的消耗,请不要禁用内部调节器。这是一个折衷方案:在消耗更多的情况下更快地唤醒或在节省更多能源的同时更慢地唤醒,决定哪个更重要。

通过发出中断或唤醒事件退出停止模式时,根据 RCC_CFGR 寄存器中的 STOPWUCK 位选择 MSI 或 HSI16 RC 振荡器作为系统时钟。

当稳压器在低功耗模式下运行时,从停止模式唤醒时会产生额外的启动延迟。通过在停止模式期间保持内部调节器开启,虽然启动时间减少,但消耗会更高。


现在我认为使用 PLL 是必须的,但是除了上面提到的之外,我恐怕无法对启动时间做太多事情。PLL 需要一定的时间来锁定输入参考时钟频率。但首先输入频率必须稳定(这就是为什么推荐使用 HSI16)。

while您可以使用中断来代替阻塞等待(循环)。

如果在 RCC_CIER 寄存器中使能,当 PLL 准备好时,可以产生中断(参见第 7.3.5 节)。

当 PLL 锁定时,您可以在 16 MHz 上执行一些任务,并且可以在收到中断时启动需要全速的任务(完成 ISR 中的时钟配置)。

于 2016-10-28T08:46:30.330 回答