STM32F103 待机模式RTC周期唤醒,每次耗时很长?

2019-08-14 07:51发布

本帖最后由 wanglinma 于 2016-1-6 21:32 编辑

自己参考战舰的原理图做了一块板子,正在做低功耗的项目,项目需要STM32以100ms周期唤醒,于是选择了待机模式和RTC周期唤醒。可经过逻辑分析仪测试发现,每次进入main的间隔为200ms左右(如果设置为1ms周期唤醒,则每次进入main的间隔为100ms左右),也就是从待机模式唤醒居然需要100ms左右
然而,奇怪是的,如果用jlink调试运行,则每次进入main的间隔又正常了
并且,程序下到战舰上运行的间隔也是正常的
但是我的原理图和战舰主要部分都差不多;
我用示波器测量晶振32.768 KHz的输出,发现我板子的输出和战舰的不同,拍摄如下:
晶振输出 晶振输出


波形的周期和我程序设置的唤醒间隔相等,同样的程序在战舰上该晶振的输出则是稳定的,不像上图那样一直在跳动。

目前真是试了很多办法,未能解决,希望大家给帮忙看看!

周期唤醒和进入待机模式的代码如下:
[mw_shl_code=c,true]void RTC_Alarm_After(uint32_t t)
{
        //设置闹钟时间
        RTC_SetAlarm(t+RTC_GetCounter());
        RTC_WaitForLastTask();
}
void MILLIS_Init(void)
{
        //定义中断结构体
        NVIC_InitTypeDef NVIC_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
          //中断时钟使能
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

        //中断优先级配置
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        //设置RTC闹钟中断
        NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        //闹钟中断接到第17线外部中断
    EXTI_ClearITPendingBit(EXTI_Line17);
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

        //PWR_WakeUpPinCmd(DISABLE);  

        //电源管理部分时钟开启
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
        //使能后备寄存器访问
          PWR_BackupAccessCmd(ENABLE);
        BKP_ClearFlag();
          BKP_DeInit();
          //使能LSI
          RCC_LSICmd(ENABLE);
          //等待晶振启动
        while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
        {}
        //设置时钟为内部晶振
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);  
        RCC_RTCCLKCmd(ENABLE);
        //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
        RTC_WaitForSynchro();
          RTC_WaitForLastTask();
        //使能闹钟中断
        RTC_ITConfig(RTC_IT_ALR, ENABLE);
        RTC_WaitForLastTask();
        //分频系数
  RTC_SetPrescaler(32); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32+1) */
        RTC_WaitForLastTask();
        //初始计数值
        RTC_SetCounter(0);
        RTC_WaitForLastTask();

}
void RTCAlarm_Init()
{
        RTC_Alarm_After(WAKEUP_INTERVAL);
}

void RTCAlarm_IRQHandler(void)
{                                
        //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
        RTC_WaitForSynchro();
  if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
  {
        // 清EXTI_Line17挂起位
    EXTI_ClearITPendingBit(EXTI_Line17);
    // 检查唤醒标志是否设置
    if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
    {
        // 清除唤醒标志
        PWR_ClearFlag(PWR_FLAG_WU);
    }
    RTC_ClearITPendingBit(RTC_IT_ALR);
                RTC_WaitForLastTask();
                RTC_Alarm_After(WAKEUP_INTERVAL);
  }

  return;
}

进入待机模式:PWR_EnterSTANDBYMode(); [/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
lycreturn
1楼-- · 2019-08-14 12:27
会不会是32K 晶振本身的问题?
wanglinma
2楼-- · 2019-08-14 16:58
lycreturn 发表于 2016-1-6 22:46
会不会是32K 晶振本身的问题?

晶振也换过了,战舰的晶振换过来还是一样
wanglinma
3楼-- · 2019-08-14 20:16
自己顶一下
wanglinma
4楼-- · 2019-08-15 01:15
再顶一下
正点原子
5楼-- · 2019-08-15 06:28
 精彩回答 2  元偷偷看……
hao_north
6楼-- · 2019-08-15 10:59
我也用到RTC周期待机唤醒,但是我的唤醒后,程序卡在给闹钟赋值了,不知道你其他部分是怎么配置的,能指点下么

一周热门 更多>