OpenEdv-开源电子网

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

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

[复制链接]

15

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2013-5-20
在线时间
8 小时
发表于 2016-1-6 21:30:47 | 显示全部楼层 |阅读模式
27金钱
本帖最后由 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]

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

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5780
金钱
5780
注册时间
2013-11-22
在线时间
1212 小时
发表于 2016-1-6 22:46:22 | 显示全部楼层
会不会是32K 晶振本身的问题?
回复

使用道具 举报

15

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2013-5-20
在线时间
8 小时
 楼主| 发表于 2016-1-6 22:48:26 | 显示全部楼层
lycreturn 发表于 2016-1-6 22:46
会不会是32K 晶振本身的问题?

晶振也换过了,战舰的晶振换过来还是一样
回复

使用道具 举报

15

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2013-5-20
在线时间
8 小时
 楼主| 发表于 2016-1-7 09:29:32 来自手机 | 显示全部楼层
自己顶一下
回复

使用道具 举报

15

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2013-5-20
在线时间
8 小时
 楼主| 发表于 2016-1-7 19:22:07 来自手机 | 显示全部楼层
再顶一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-7 22:41:37 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-3-20
在线时间
6 小时
发表于 2016-3-22 15:26:39 | 显示全部楼层
我也用到RTC周期待机唤醒,但是我的唤醒后,程序卡在给闹钟赋值了,不知道你其他部分是怎么配置的,能指点下么
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-12-21
在线时间
6 小时
发表于 2017-5-18 11:49:13 | 显示全部楼层
hao_north 发表于 2016-3-22 15:26
我也用到RTC周期待机唤醒,但是我的唤醒后,程序卡在给闹钟赋值了,不知道你其他部分是怎么配置的,能指点 ...

唉,没人搞啊,大神在哪里
回复

使用道具 举报

34

主题

178

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-11-1
在线时间
183 小时
发表于 2017-8-16 22:33:14 | 显示全部楼层
遇到同样的问题,请问楼主是怎么样解决的
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2019-8-6
在线时间
32 小时
发表于 2019-8-23 11:35:57 | 显示全部楼层
帮顶帮顶帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 15:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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