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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版