weixin_43859699 2022-03-25 16:19 采纳率: 0%
浏览 158

STM32F103进入standby模式会卡在RTC_WaitForLastTask

每次进入standby时程序就会卡在RTC_WaitForLastTask函数中

LSI初始化函数:


```c

u8 RTC_Init(void)
{
    
    
    //检查是不是第一次配置时钟
    u8 temp=0;
    u8 RCC_FLAG=0;
    
    RTC_Configuration();

    
    
    if (BKP_ReadBackupRegister(BKP_DR1) != 0X50C0)        //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
    {             
        BKP_DeInit();    //复位备份区域             
                 

        RCC_LSICmd(ENABLE);//使能LSI
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
        {
            temp++;
            //delay_ms(10);
            user_delay_ms(10);
            if(temp>=250)
                RCC_FLAG = 0;
                return 1;
        }//等待LSI稳定
        RCC_FLAG = 1;
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//选择LSI做为RTC的时钟源
        
        RCC_RTCCLKCmd(ENABLE);    //使能RTC时钟  
        RTC_WaitForLastTask();    //等待最近一次对RTC寄存器的写操作完成
        RTC_WaitForSynchro();        //等待RTC寄存器同步  
        RTC_ITConfig(RTC_IT_SEC, ENABLE);        //使能RTC秒中断
        RTC_WaitForLastTask();    //等待最近一次对RTC寄存器的写操作完成
        RTC_EnterConfigMode();/// 允许配置    
        //RTC_SetPrescaler(32767); //设置RTC预分频的值
        RTC_SetPrescaler(39999); //设置RTC预分频的值
        RTC_WaitForLastTask();    //等待最近一次对RTC寄存器的写操作完成
        //RTC_Set(2020,4,21,10,0,0);  //设置时间    calendar
        //rtc_set_ticks_flag = 1;//时间需要重新设定
        RTC_ExitConfigMode(); //退出配置模式  
        if(RCC_FLAG == 0)//内部低速晶振时,不写该区域,保证能恢复到外部低速晶振
        {BKP_WriteBackupRegister(BKP_DR1, 0X5050);}    //向指定的后备寄存器中写入用户程序数据
        else
        {BKP_WriteBackupRegister(BKP_DR1, 0X50C0);}
        g_appconf.updata_time_flag = NOUPDATA;
    }
    else//系统继续计时
    {
        RCC_LSICmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
        {
            temp++;
            //delay_ms(10);
            user_delay_ms(10);
            if(temp>=250)
                RCC_FLAG = 0;
                return 1;
        }//等待LSI稳定
        RCC_FLAG = 1;
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//选择LSI做为RTC的时钟源
        
        RCC_RTCCLKCmd(ENABLE);    //使能RTC时钟  
        RTC_WaitForLastTask();//等待上一次写RTC任务完成
        RTC_WaitForSynchro();        //等待RTC寄存器同步  
        
        RTC_ITConfig(RTC_IT_SEC, ENABLE);    //使能RTC秒中断
        RTC_WaitForLastTask();    //等待最近一次对RTC寄存器的写操作完成
  
    }
    
    
        
    RTC_NVIC_Config();//RCT中断分组设置    
    RTC_ITConfig(RTC_IT_ALR, ENABLE);   //闹钟
    RTC_WaitForLastTask();    //等待最近一次对RTC寄存器的写操作完成
    RTC_Get();//更新时间    
    
    return 0; //ok

}    

下面是我进入standby模式时的函数,用的是内部晶振LSI

void RTC_Enter_StandbyMode(u32 s)  
{  
    debug_print("\r\nIt will wake up after %d s.\n",standbytime);
    RCC_APB2PeriphResetCmd(0X01FC,DISABLE);    //复位所有IO口
    //OSC_deinit();
    GPIO_Close();
    
    USART_Cmd(USART1,DISABLE);
    USART_Cmd(UART4,DISABLE);
    SPI_Cmd(SPI1, DISABLE); 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);
    RCC_RTCCLKCmd(ENABLE);    //使能RTC时钟 
    RTC_WaitForLastTask();
    
    //user_delay_ms(10);
      

    RTC_SetAlarm(RTC_GetCounter()+s);

    RTC_WaitForLastTask(); //卡在这里!!!!
    
    // 进入待机模式, 此时所有1.8V域的时钟都关闭,HIS和HSE的振荡器关闭, 电压调节器关闭.  
    // 只有WKUP引脚上升沿,RTC警告事件,NRST引脚的外部复位,IWDG复位.  
    /* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */  
    PWR_EnterSTANDBYMode();  
}



我的解答思路和尝试过的方法 :我在RTC_Enter_StandbyMode函数中加入PWR、BKP等相关时钟的使能后依然会卡在第二个RTC_WaitForLastTask函数这里,有点搞不懂,请大家指导一下,谢谢!
  • 写回答

1条回答 默认 最新

  • 「已注销」 2022-03-26 15:30
    关注

    字面意思是等待最后的作业啊

    评论

报告相同问题?

问题事件

  • 创建了问题 3月25日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现