OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4006|回复: 1

STM32F070Standby模式,进入休眠后,唤醒后在进入会重启,第三次可以进入休眠

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-10-25
在线时间
3 小时
发表于 2018-10-25 16:07:32 | 显示全部楼层 |阅读模式
1金钱
Standby模式,进入休眠后,唤醒后在进入会重启,第三次可以进入休眠,RTC唤醒,如果第一次进入休眠,能唤醒,说明RTC设置基本正确,但为什么会重启,在跑一边程序?要再等到STANDBYMODE时候才能进入,以后的都是睡眠失败-重启-睡眠成功,附上代码,官方例子修改,大家有什么想法么,
static void RTC_Config(void)
{
    RTC_InitTypeDef   RTC_InitStructure;
    RTC_TimeTypeDef   RTC_TimeStructure;
    uint32_t LSIFreq = 0;

    /* Enable the PWR clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//ê1ÄüPWRê±Öó

    /* Allow access to Backup Domain */
    PWR_BackupAccessCmd(ENABLE);//ê1Äüo󱸼Ä′æÆ÷·ÃÎê

    /* Disable wake-up source(ALARM) to guarantee free access to WUT level-OR input */
    RTC_ITConfig(RTC_IT_ALRA, DISABLE);

    /* Clear Wakeup flag */
    PWR_ClearFlag(PWR_FLAG_WU);

    /* Enable wake-up source(ALARM) to guarantee free access to WUT level-OR input */
    RTC_ITConfig(RTC_IT_ALRA, ENABLE);

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

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

    /* Check if the StandBy flag is set */
    if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET)
    {
        /* Clear StandBy flag */
        PWR_ClearFlag(PWR_FLAG_SB);

        /* Check if the StandBy flag is cleared */
        if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET)
        {
            while(1);
        }

        RTC_WaitForSynchro();

        /* No need to configure the RTC as the RTC config(clock source, enable,
        prescaler,...) are kept after wake-up from STANDBY */
    }
    else
    {
        /* RTC Configuration ******************************************************/
        /* Reset Backup Domain */
        RCC_BackupResetCmd(ENABLE);
        RCC_BackupResetCmd(DISABLE);

        /* 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();

        /* Get the LSI frequency:  TIM14 is used to measure the LSI frequency */
        LSIFreq = GetLSIFrequency();

        RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
        RTC_InitStructure.RTC_AsynchPrediv = 99;
        RTC_InitStructure.RTC_SynchPrediv =  (LSIFreq/100) - 1;

        RTC_Init(&RTC_InitStructure);

        /* Set the time to 01h 00mn 00s AM */
        RTC_TimeStructure.RTC_H12     = RTC_H12_AM;
        RTC_TimeStructure.RTC_Hours   = 0x01;
        RTC_TimeStructure.RTC_Minutes = 0x00;
        RTC_TimeStructure.RTC_Seconds = 0x00;

        RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure);
    }
}

static void EnterSTANDBYMode(void)
{
    RTC_AlarmTypeDef  RTC_AlarmStructure;
    RTC_TimeTypeDef   RTC_TimeStructure;

    /* Disable the Alarm A */
    RTC_AlarmCmd(RTC_Alarm_A, DISABLE);

    /* Get the current time */
    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);

    if(GetiWaterMeterInterval()==0x1)   //1D¡ê±2é¼ˉò»ìì24ìõ·¢Ëí0x1   15·ÖÖó2é¼ˉ1D¡ê±·¢Ëí0x0
    {
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = (RTC_TimeStructure.RTC_Hours + 1) % 24;
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = RTC_TimeStructure.RTC_Minutes;
    }
    else
    {
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = RTC_TimeStructure.RTC_Hours;
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = (RTC_TimeStructure.RTC_Minutes + 15) % 60;
    }
    /* Set the alarm to current time + 3s */
    RTC_AlarmStructure.RTC_AlarmTime.RTC_H12     = RTC_TimeStructure.RTC_H12;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = (RTC_TimeStructure.RTC_Seconds + 20) % 60;//10Ãë
    RTC_AlarmStructure.RTC_AlarmDateWeekDay = 31;
    RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
    RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay | RTC_AlarmMask_Hours | RTC_AlarmMask_Minutes;//Æá±ÎèÕÆú£¬D¡ê±£¬·ÖÖó
    RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);

    /* Enable RTC Alarm A Interrupt: this Interrupt will wake-up the system from
    STANDBY mode (RTC Alarm IT not enabled in NVIC) */
    RTC_ITConfig(RTC_IT_ALRA, ENABLE);

    /* Enable the Alarm A */
    RTC_AlarmCmd(RTC_Alarm_A, ENABLE);

    /* Clear RTC Alarm Flag */
    RTC_ClearFlag(RTC_FLAG_ALRAF);
               
    /* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */
    PWR_EnterSTANDBYMode();
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-10-26 02:04:13 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表