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

STM32F103C8T6 STOP模式无法通过RTC唤醒

[复制链接]
1+1=2 提问时间:2022-10-8 20:09 / 未解决
使用如下函数

RTC_SetAlarm(RTC_GetCounter()+10); //设置待机时间

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入低功耗
结果无法通过RTC唤醒,是为啥啊


收藏 评论5 发布时间:2022-10-8 20:09

举报

5个回答
1+1=2 回答时间:2022-10-8 20:10:10
在while里面循环调用,通过一个计数器,计数,达到数量后开始进入,然后在等着继续,为啥无法唤醒呢?

butterflyspring 回答时间:2022-10-9 10:42:55
RTC的寄存器包括计数器的读取是有一定规则的,在手册18.3.3章节有详细描述的。所以需要软件额外的处理,否则读取的值会不准确,那么设置的ALARM就不准。
如果用流行的CUBE库,那么从应用层看就会简单的多。这个库里面有例程可以参考。


STM32Cube_FW_F1_V1.8.0\Projects\STM32F103RB-Nucleo\Examples\RTC
1+1=2 回答时间:2022-10-9 13:31:14
butterflyspring 发表于 2022-10-9 10:42
RTC的寄存器包括计数器的读取是有一定规则的,在手册18.3.3章节有详细描述的。所以需要软件额外的处理,否 ...

在使用本函数前必须先调用函数 RTC_WaitForLastTask(),等待标志位RTOFF 被设置
这个我试了一下,发现手册写错了,
手册是这样的
例:
/* Wait until last write operation on RTC registers is terminated */
RTC_WaitForLastTask();
/* Sets Alarm value to 0xFFFFFFFA */
RTC_SetAlarm(0xFFFFFFFA);
但实际上应该是这样的
/* Sets Alarm value to 0xFFFFFFFA */
RTC_SetAlarm(0xFFFFFFFA);
/* Wait until last write operation on RTC registers is terminated */
RTC_WaitForLastTask();
调换一下就好了,这是为啥,很奇怪


1+1=2 回答时间:2022-10-9 13:31:54
butterflyspring 发表于 2022-10-9 10:42
RTC的寄存器包括计数器的读取是有一定规则的,在手册18.3.3章节有详细描述的。所以需要软件额外的处理,否 ...

其中,计数值修改为这个RTC_GetCounter()
xmshao 回答时间:2022-10-9 15:43:40
你是用的之前的标准库开发的吧。关于那个函数RTC_WaitForLastTask()调用,它是为了保证
刚才最后的针对RTC寄存器的写操作完成了。换言之,开启新的RTC写操作时要保证没有前次没完成的
写操作。


反正你保证每次做RTC寄存器写操作前保证该位置1才可以。这是关键点。


下面F1标准库例程的部分代码:


/* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();  ///START

  /* Enable the RTC Second */

  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  /* Wait until last write operation on RTC registers has finished */

  RTC_WaitForLastTask();

  /* Set RTC prescaler: set RTC period to 1sec */

  RTC_SetPrescaler(32767);/* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  /* Wait until last write operation on RTC registers has finished */

  RTC_WaitForLastTask(); //END


你现在觉得这样写没有问题:


/* Sets Alarm value to 0xFFFFFFFA */RTC_SetAlarm(0xFFFFFFFA);/* Wait until last write operation on RTC registers is terminated */
RTC_WaitForLastTask();


你写前没有查RTCOFF标志,有可能你写时该位置1了,即没有未完成的RTC写操作。
然后再调用RTC_WaitForLastTask();也是合理的、保险的,保证该写操作顺利完成。


因为看不到你的代码,不知你后面还有些什么代码。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版