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

RTC Alarm唤醒standby后获取不到RTC Alarm标志位问题STMF103CBU6芯片

[复制链接]
codepencil 提问时间:2018-2-11 21:33 /
阅读主题, 点击返回1楼
收藏 评论26 发布时间:2018-2-11 21:33
26个回答
wenyangzeng 回答时间:2018-2-12 11:13:16
codepencil 发表于 2018-2-12 10:46
没有用单独的后备电池,全部用的是VDD,VBAT口接的也是VDD;

没有接后备电池,断电后数据当然无法保存。每次上电都要初始化RTC的。
回答时间:2018-2-12 11:16:26
可以考虑判断一下RCC_GetFlagStatus(RCC_FLAG_LPWRRST),这个可以用来判断是否从低功耗模式唤醒。可以从wakeup唤醒的标志是PWR_GetFlagStatus(PWR_FLAG_WU)来判断一下。
codepencil 回答时间:2018-2-12 11:41:26
wenyangzeng 发表于 2018-2-12 11:13
没有接后备电池,断电后数据当然无法保存。每次上电都要初始化RTC的。

首先说明一下,程序中每次进入standby前都会重新配置RTC;
可能是我没让你明白我的意思;
我的问题是,烧写完程序不断电,RTC_GetFlagStatus(RTC_FLAG_ALR)在standby被唤醒的时候能够正常读取到被SET,可以判断是通过这个flag判断出是被RTC alarm唤醒的。但是同样的程序,给系统完全断电后再上电,结果RTC_GetFlagStatus(RTC_FLAG_ALR)在standby被唤醒的时候一直读取到的是RESET,没法通过这个flag判断出是被RTC alarm唤醒的。
不知道我的疑问是否被你理解了?
wenyangzeng 回答时间:2018-2-12 13:13:01
本帖最后由 wenyangzeng 于 2018-2-12 13:15 编辑
codepencil 发表于 2018-2-12 11:41
首先说明一下,程序中每次进入standby前都会重新配置RTC;
可能是我没让你明白我的意思;
我的问题是,烧 ...

无标题.png

无标题2.png


所以,不接后备电池,断电后备份寄存器是空的,再一次初始化RTC了。
codepencil 回答时间:2018-2-12 13:28:41
wenyangzeng 发表于 2018-2-12 13:13
所以,不接后备电池,断电后备份寄存器是空的,再一次初始化RTC了。
...

......
我在程序里面每次都会重新配置RTC,所以即使是断电在上电后(VBAT接的是VDD),也会重新配以一遍RTC,但是问题在于断电在上电后重新配置的RTC alarm虽然起作用,但是标志位不再有动作了,让我没法判断是不是被RTC Alarm唤醒了。
不知这样说是否清楚了?
另外我用的是F103CBU6
codepencil 回答时间:2018-2-12 13:30:57
安 发表于 2018-2-12 11:16
可以考虑判断一下RCC_GetFlagStatus(RCC_FLAG_LPWRRST),这个可以用来判断是否从低功耗模式唤醒。可以从wak ...

用LowPowerReset就不会进入standby了
Low-power management reset
There are two ways to generate a low-power management reset:
1. Reset generated when entering Standby mode:
This type of reset is enabled by resetting nRST_STDBY bit in User Option Bytes. In this
case, whenever a Standby mode entry sequence is successfully executed, the device
is reset instead of entering Standby mode.
回答时间:2018-2-12 14:14:30
楼主现在的问题是断电唤醒后,判断不到RTC中断的标志位。我看还配置了wakeup功能,楼主是否开启了wakeup?我说的两个寄存器是关于唤醒的,也可以用来参考一下当时是wakeup唤醒的,还是RTC唤醒的。用于排查一下原因。我记得wakeup唤醒后,需要手动清除一下标志位吧。
codepencil 回答时间:2018-2-12 14:21:30
安 发表于 2018-2-12 14:14
楼主现在的问题是断电唤醒后,判断不到RTC中断的标志位。我看还配置了wakeup功能,楼主是否开启了wakeup? ...

wakeup pin唤醒的标志位在进入standby之前都清除掉了。

void Sys_Enter_Standby_WakeupPin_Enable(void)
{               
        /* Enable PWR and BKP clocks */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);                 
         
        /* Allow access to BKP Domain */
        PWR_BackupAccessCmd(ENABLE);
   
            RTC_ITConfig(RTC_IT_OW|RTC_IT_SEC,DISABLE);                               
        RTC_ClearITPendingBit(RTC_IT_OW|RTC_IT_ALR|RTC_IT_SEC);       
        PWR_ClearFlag(PWR_FLAG_WU);               
            PWR_WakeUpPinCmd(ENABLE);                 
        PWR_BackupAccessCmd(DISABLE);       
       
        PWR_EnterSTANDBYMode();                       
         
}
wenyangzeng 回答时间:2018-2-12 14:31:26
本帖最后由 wenyangzeng 于 2018-2-12 14:39 编辑
codepencil 发表于 2018-2-12 13:28
......
我在程序里面每次都会重新配置RTC,所以即使是断电在上电后(VBAT接的是VDD),也会重新配以一遍R ...
ST官方例程中:
RTC_Configuration()开头一定要判断BKP_DR0是否是第一次写入值(假设是0x5050)
这个0X0505是第一次配置写入备份寄存器。你断电了就丢失了,还要重新配置的;

uint8_t RTC_Configuration(void)
if(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
                                RCC_LSEConfig(RCC_LSE_ON);
        if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)                //是否第一次配置?
        {
                RCC_LSEConfig(RCC_LSE_ON);//LSE 开启


楼主这个RTC例程如果不配置后备电池就没意义了。
回答时间:2018-2-12 14:42:00
读取不到RTC的唤醒,是否可以考虑一下是其他唤醒引起的呢?最好看一下相关的几个寄存器。这里是清除掉了,但是不能保证下次唤醒是不是wakeup唤醒。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版