你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STTM32L151 低功耗 RTC唤醒不正常

[复制链接]
鹅卵石m 提问时间:2018-7-29 17:13 /
想利用 STM32L151 实现低功耗,采用RTC的wakeup的方式进行唤醒,当单片机进入待机状态后,10秒钟唤醒。每次重新下载程序或者断电重启后,都能间隔10秒唤醒,第二次进入低功耗后会立马唤醒。初步怀疑是写入计数初值不成功。在程序了采用RTC_WakeUpCmd(DISABLE)方式关闭计数后再写入计数初值,发现RTC_WakeUpCmd(DISABLE)返回错误,通过读取 RTC_GetWakeUpCounter()中的值也和写入的不一致。

另外,我同时使能了 引脚唤醒,发现两个奇怪的现象:1、引脚唤醒后,RTC就不能正常唤醒;2、将RTC唤醒所有代码屏蔽掉,采用引脚第一次唤醒后,单片机在进入低功耗会自动唤醒。
代码如下,各位大神研究研究。


  /* Reset RTC Domain */
   RCC_RTCResetCmd(ENABLE);
   RCC_RTCResetCmd(DISABLE);
        
   RTC_ITConfig(RTC_IT_WUT, DISABLE);
if(0==RTC_WakeUpCmd(DISABLE))
{
    UART3_SendLR();
    UART3_SendString("RTC_WakeUpCmd(DISABLE)-> fail");

}
        
/* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  /* Allow access to RTC */
  PWR_RTCAccessCmd(ENABLE);

  /* Enable the LSI OSC */
  RCC_LSICmd(ENABLE);

  /* Wait till LSI is ready */  
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

  /* Select the RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

  /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);

  /* Wait for RTC APB registers synchronisation */
  RTC_WaitForSynchro();

  /* Calendar Configuration */
  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  RTC_InitStructure.RTC_SynchPrediv        =  0x120; /* (37KHz / 128) - 1 = 0x120*/
  RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
        RTC_STATFACK=0;
if(RTC_STATFACK==RTC_Init(&RTC_InitStructure))
{
    UART3_SendLR();
    UART3_SendString("RTC_Init(&RTC_InitStructure)-> fail");

}         

  /* EXTI configuration *******************************************************/
  EXTI_ClearITPendingBit(EXTI_Line20);
  EXTI_InitStructure.EXTI_Line = EXTI_Line20;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  /* Enable the RTC Wakeup Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
        
  ;
        RTC_STATFACK=0;
if(RTC_STATFACK==RTC_WakeUpCmd(DISABLE))
{
    UART3_SendLR();
    UART3_SendString("RTC_WakeUpCmd(DISABLE)-> fail");

}        
  /* Configure the RTC WakeUp Clock source: CK_SPRE (1Hz) */
  RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);

  wakeupc=RTC_GetWakeUpCounter();
  UART3_SendLR();
  sprintf(stingl, "%d",wakeupc );
  UART3_SendString("RTC_GetWakeUpCounter() 1-> ");
  UART3_SendString(stingl);

  RTC_SetWakeUpCounter(10); //2S

  wakeupc=RTC_GetWakeUpCounter();
  UART3_SendLR();
  sprintf(stingl, "%d",wakeupc );

  UART3_SendString("RTC_GetWakeUpCounter() 2-> ");
  UART3_SendString(stingl);  

  /* Enable the RTC Wakeup Interrupt */
  RTC_ITConfig(RTC_IT_WUT, ENABLE);

  /* Enable Wakeup Counter */

        RTC_STATFACK=0;
if(RTC_STATFACK==RTC_WakeUpCmd(ENABLE))
{
    UART3_SendLR();
    UART3_SendString("RTC_WakeUpCmd(ENABLE)-> fail");

}
  RTC_ClearFlag(RTC_FLAG_WUTF);

收藏 评论2 发布时间:2018-7-29 17:13

举报

2个回答
butterflyspring 回答时间:2018-7-30 11:15:46
标准外设库?你中断函数怎么处理?清中断?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

第109位梁山好汉 回答时间:2018-7-30 11:27:56
唤醒后,需要重新配置时钟。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版