鹅卵石m 发表于 2018-7-29 17:13:58

STTM32L151 低功耗 RTC唤醒不正常

想利用 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);

butterflyspring 发表于 2018-7-30 11:15:46

标准外设库?你中断函数怎么处理?清中断?

第109位梁山好汉 发表于 2018-7-30 11:27:56

唤醒后,需要重新配置时钟。
页: [1]
查看完整版本: STTM32L151 低功耗 RTC唤醒不正常