核-l053r8板上stm32l053r8的研制。
我们有一个系统,每200μs左右从睡眠中“醒来”,做少量的工作然后回到睡眠状态(停止模式)。
理想情况下,我希望在50μs内从停止状态中醒来。
HAL_RCC_OscConfig()函数大约需要170μs,这使得这项工作毫无意义。
据我所见,大部分时间都花在pll配置上,特别是while循环(“等待pll准备就绪”),这是在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内从停止模式唤醒并返回到全速hsi?
什么是最有效的方法来设置时钟时,从停止?
目前,我使用压水堆停止示例中规定的方法,如下所示:
/* 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)中包含此长延迟。
非常感谢您的帮助。

最佳答案

我不知道你现在的pll来源是什么,但建议使用hsi16。全部来自reference manual
HSI16时钟信号由内部16 MHz RC产生
振荡器。它可以直接用作系统时钟或pll输入。
HSI16时钟可在从停止低功率唤醒后使用
模式,这样可以确保比使用msi的唤醒时间更短
时钟。
如果允许稍高的消耗,不要禁用内部调节器。这是一个折衷方案:用更高的消耗更快地醒来,还是用更慢的消耗更多的能量,决定哪个更重要。
当通过发出中断或唤醒事件退出停止模式时,
选择MSI或HSI16 RC振荡器作为系统时钟,具体取决于
RCC CFGR寄存器中的位stopwuck。
当电压调节器
在低功率模式下运行,会产生额外的启动延迟
从停止模式中醒来时。保持内部调节器开启
在停止模式下,虽然启动时间
减少。
现在我想使用pll是必须的,但是除了上面提到的以外,恐怕你不能在启动时间上做太多的事情。锁相环需要一定的时间来锁定输入参考时钟频率。但首先,输入频率必须稳定(这就是为什么建议使用hsi16)。
您可以使用中断代替阻塞等待(while循环)。
如果在RCC寄存器中启用,当PLL准备就绪时,可以生成中断
(见第7.3.5节)。
当pll锁定时,您可以在16mhz上执行一些任务,当接收到中断时,需要全速的任务可以启动(完成isr中的时钟配置)。

09-27 21:01