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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版