打印

从停止模式唤醒到系统稳定需要多少时间

[复制链接]
4054|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zz2513|  楼主 | 2008-10-10 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    用STM32做过低功耗的帮帮忙,从停止模式唤醒到系统稳定需要多少时间?
自己在用低功耗的时候发现从停止模式唤醒到系统稳定需要十几个ms,如果没有十几个ms的延时的话,系统时钟就会强制打开HSI RC振荡器,配置好后可以从时钟输出管脚MCO看到8MHz的时钟频率。
   如果唤醒后还需要延时这么久的才能稳定的话,STM32将达不到产品的低功耗要求,只有舍弃了?!
沙发
zz2513|  楼主 | 2008-10-10 17:08 | 只看该作者

从停止模式唤醒到系统稳定需要多少时间

可以拿ST提供的PWR中的STOP例程来实验,系统进入停止模式后,利用RTCAlarm 10ms唤醒一次,然后把主函数while循环内的延时时间改为11ms(18ms以下),配置好MCO为系统时钟输出后将会看到系统时钟已经变成8MH在左右的了……

使用特权

评论回复
板凳
香水城| | 2008-10-10 17:16 | 只看该作者

“系统稳定”是什么意思?

根据数据手册,当使用HSI时,从STOP模式唤醒只需几个us的时间。如果按照数据手册要求(匹配电容和晶体等效电容等参数)使用HSE,HSE从启动至稳定的时间是2ms。

请检查你的HSE电路和相应的参数配置。


还有,“十几个ms的延时”是什么意思?依据什么?

使用特权

评论回复
地板
ijk| | 2008-10-10 17:43 | 只看该作者

从停止模式唤醒到系统稳定

  STM32从停止模式唤醒到系统稳定,需要的时间应该在1ms以内吧

使用特权

评论回复
5
ijk| | 2008-10-10 17:49 | 只看该作者

STM32从停止模式唤醒到系统稳定

  STM32从停止模式唤醒到系统稳定 ,附1张图

使用特权

评论回复
6
ijk| | 2008-10-10 17:58 | 只看该作者

STM32从停止模式唤醒到系统稳定

  STM32从停止模式唤醒到系统稳定,我刚好做过类似试验。从附图中可以看出。
  channel 2:从80ms~约170ms,STM32处于STOP模式;channel 3: 上升沿唤醒STM32,STM32已经稳定并且完成了4次AD转换后在channel 3输出低电平。channel 3的高电平时间肯定不到2ms,所以:STM32从停止模式唤醒到系统稳定,需要的时间应该可以在1ms以内

使用特权

评论回复
7
zz2513|  楼主 | 2008-10-11 11:04 | 只看该作者

从停止模式唤醒到系统稳定需要多少时间

非常感谢香版主和ijk的及时回复!
系统时钟是用外部8MHz晶振通过PLL倍频到16MHz,我提到的系统稳定是指系统从停止模式唤醒后到恢复系统时钟为16HMz,系统正常运行.
因为之前从停止模式唤醒后发现系统时钟一直都是8MHz左右(MCO管脚输出时钟),并不是自己想得到的16MHz.参考了例程,发现STOP例程主函数的while(1)循环程序中加有一个1.5s的延时,然后在自己的程序中也加一个十几个ms(香版提到的十几个ms就是在这里,以SysTick 1ms为时基)的延时后发现系统时钟的输出就为16MHz了.怀疑唤醒后到系统稳定不应该要这么久,所以才上来找大家帮忙.
______________________________________________________
//系统从停止模式唤醒后RCC的配置程序
void SYSCLKConfig_STOP(void)
{
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}
-----------------------------------------------------------------

-----------------------------------------------------------------
//例程中的while(1)程序
  while (1)
  {
    /* Insert 1.5 second delay */
    Delay(1500);//唤醒之后的延时!!

    /* Wait till RTC Second event occurs */
    RTC_ClearFlag(RTC_FLAG_SEC);
    while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);

    /* Alarm in 3 second */
    RTC_SetAlarm(RTC_GetCounter()+ 3);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* Turn off led connected to GPIO_LED Pin6 */
    GPIO_ResetBits(GPIO_LED, GPIO_Pin_6); 

    /* Request to enter STOP mode with regulator in low power mode*/
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
    
    /* At this stage the system has resumed from STOP mode    
   /* Turn on led connected to GPIO_LED Pin6 */
    GPIO_SetBits(GPIO_LED, GPIO_Pin_6); 

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

使用特权

评论回复
8
香水城| | 2008-10-11 11:07 | 只看该作者

现在楼主测量的从停止模式唤醒到系统稳定需要多少时间呢

给一个结论。

使用特权

评论回复
9
zz2513|  楼主 | 2008-10-11 11:11 | 只看该作者

从停止模式唤醒到系统稳定需要多少时间

怀疑自己从停止模式唤醒后的时钟配置可能不对.
另外请教ijk,从停止模式唤醒后要进行哪些配置?

使用特权

评论回复
10
zz2513|  楼主 | 2008-10-11 11:14 | 只看该作者

现在楼主测量的从停止模式唤醒到系统稳定需要多少时间呢

现在也是在测试中,不好下结论^-^

使用特权

评论回复
11
ijk| | 2008-10-13 10:06 | 只看该作者

从停止模式唤醒后进行的配置

  从停止模式唤醒后进行的配置,没有什么特别:其实跟复位后的配置没什么区别。如下代码,仅供参考:

    // Mode: STOP + Regulator in LowPower + Entry with WFI
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

    // re-start HSE
    RCC_HSEConfig(RCC_HSE_ON);
    // Wait till HSE is ready - HSE_RDY @ bit 17
    while((RCC->CR & (1<<17)) == 0)
      ;
    // Flash 2 wait state
    *(vu32 *)0x40022000 = 0x02;
    // HCLK = SYSCLK
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    // PLLCLK = 8MHz * 6 = 48 MHz
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
    // Enable PLL
    RCC_PLLCmd(ENABLE);
    // Wait till PLL is ready - PLL_RDY @ bit 25
    while((RCC->CR & (1<<25)) == 0)
      ;
    // Select PLL as system clock source
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    // Wait till PLL is used as system clock source
    while(RCC_GetSYSCLKSource() != 0x08)
      ;
    // re-init Peripherals
    xxx_Init();

使用特权

评论回复
12
zz2513|  楼主 | 2008-10-13 12:50 | 只看该作者

从停止模式唤醒后进行的配置

我从停止模式唤醒后进行的配置也一样,但观察MCO管脚输出的系统时钟还是不对。单步调试发现在唤醒后外部晶体振荡器已经被置位打开,HSE ready标志位也置位,同时HSI RDY和HSION也被置位……??
ijk兄,你在从停止模式下唤醒应该也没有加额外的延时吧?还想问下你唤醒后的外设重新初始化 xxx_Init()中包括哪些?我只重新初始化了GPIO。麻烦了,谢谢!

使用特权

评论回复
13
ijk| | 2008-10-13 13:29 | 只看该作者

外设重新初始化 xxx_Init()中包括哪些?

  外设重新初始化 xxx_Init()中包括哪些?对我来说很简单,需要用什么就初始化什么。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

0

粉丝