请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L152进入待机模式1分钟唤醒一次,18个小时后无法唤醒

[复制链接]
Dwyer 提问时间:2024-3-6 16:00 / 未解决

目前在使用STM32L152时,设置了RTC唤醒,每隔1分钟唤醒一次,周期采集数据并上传,一开始都是正常唤醒工作,但是在18个小时候,设备就无法唤醒,但是重新插拔电池后又可以正常工作18个小时。

STOP模式下可以连续运行不会有问题,在stanby模式下就是18个小时候无法唤醒

这个原因是什么?待机模式唤醒后要进行什么操作?

18个小时我算了一下大概是0xFFFF秒,也就是65535秒。不知道是那个参数导致了这个问题。

在此请教一下大家

收藏 评论6 发布时间:2024-3-6 16:00

举报

6个回答
xmshao 回答时间:2024-3-6 17:00:08
如果说固定18个小时候一定无法唤醒,就如你所言,可能是某个参数到某个位置设置出了点问题,比如溢出什么的。


你不妨检查下设置alarm唤醒参数配置的那部分代码。
butterflyspring 回答时间:2024-3-6 17:37:08
如同楼主发现的规律,8集中在18个小时时发生异常,多半和逻辑有关。


可以重点看看设置唤醒计算的部分。 可以快速测试一下。
废鱼 回答时间:2024-3-6 21:17:01

如果能确定是1分钟唤醒一次,也可以考虑用LL_RTC_WAKEUP_SetAutoReload唤醒试试。

Dwyer 回答时间:2024-3-8 09:51:13

这边贴一下我RTC设置的代码,还有就是我发现我用的是LSE时钟,这个时钟走时会有比较大的偏差(可能是电容匹配的问题),会不会是时间偏差导致无法唤醒??

void RTC_AlarmSet(uint32_t time)
{
  unsigned char Hours,Minutes,Seconds;  
  EXTI_InitTypeDef EXTI_InitStructure;
  RTC_AlarmTypeDef RTC_AlarmStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

//      SetRTC(180124,000000);// set the initial time

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

  /* Enable the RTC Alarm Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


  RTC_WriteProtectionCmd(DISABLE);//   RTC->WPR = 0xCA;  RTC->WPR = 0x53;  
  RTC_EnterInitMode();//RTC_ISR/INITF = ??
   /* Allow access to RTC */
  PWR_RTCAccessCmd(ENABLE);
  /* Enable the alarmA */
  RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
  /* Set the alarmA Masks */
  RTC_AlarmStructure.RTC_AlarmMask =RTC_AlarmMask_DateWeekDay|RTC_AlarmMask_Hours|RTC_AlarmMask_Minutes;//|RTC_AlarmMask_Hours;//|RTC_AlarmMask_Minutes; RTC_AlarmMask_None//闹钟信号被屏蔽
// RTC_AlarmStructure.RTC_AlarmMask =RTC_AlarmMask_None;;

    Hours=time/10000;
    Minutes=time/100%100;
    Seconds=time%100;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours=Hours;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes=Minutes;
  RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=Seconds;
  RTC_AlarmStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_Date;//???date??

  RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);

  /* Enable AlarmA interrupt */
  RTC_ITConfig(RTC_IT_ALRA, ENABLE);

  /* Enable the alarmA */
  RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
    /* Allow access to RTC */
  PWR_RTCAccessCmd(DISABLE);
  RTC_WriteProtectionCmd(ENABLE);
}
Dwyer 回答时间:2024-3-8 09:53:19

butterflyspring 发表于 2024-3-6 17:37
如同楼主发现的规律,8集中在18个小时时发生异常,多半和逻辑有关。 </p>
<p>

我在STOP模式下就没有发现这个问题,可以连续运行24小时都不出错,但是在stanby模式下就会18个小时后无法唤醒,这个验证了3次,两台设备,都是这样

Zona 回答时间:2024-5-16 16:20:18

这个调试起来很麻烦,因为是65535,所以可以很精确知道第几次会无法唤醒

先确定是完全无法唤醒,还是唤醒后执行出问题卡死了,可以在唤醒后啥都没干的时候先输出个简单的标志性字符作为标记,

看看是不是可以人为增加秒计时,通过这个手段触发每秒唤醒一次,这样18分钟后就能看到现场,就能用调试器看这个寄存器情况

我觉得大概率是自己写的代码出问题,计数溢出什么的,应该不太可能cubemx的代码出问题(不过也要验证一下这一点),如果这个确认,可以17个小时时候输出一下完整内存出来,看看哪个变量开始要溢出了。

所以,1,搞一个机器,只是唤醒,唤醒后啥都不做(自己代码全部屏蔽),看看18小时后是不是还能正常唤醒

2,搞一个机器,代码修改人为触发rtc快走,现实一秒rtc以为是一分钟,这样18分钟后就要到出问题时间点,方便调试检查

其他的,,18分钟后仔细看寄存器和各变量吧,

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版