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

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

[复制链接]
codepencil 提问时间:2018-2-11 21:33 /
本帖最后由 codepencil 于 2018-2-12 15:50 编辑

关于STMF103CBU6芯片RTC Alarm唤醒standby后获取不到RTC Alarm标志位问题。
在设置了RTC Alarm唤醒standby mode后,给单片机烧录完程序,如果不断电可以通过
RTC_GetFlagStatus(RTC_FLAG_ALR)获取到RTC Alarm唤醒的flag,但是断电重启后就没法获取到了。
不断电直接RESET复位也是能获取到的;
不知道是什么原因?
Test Code .zip (8.08 MB, 下载次数: 18)
收藏 评论26 发布时间:2018-2-11 21:33

举报

26个回答
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例程如果不配置后备电池就没意义了。
codepencil 回答时间:2018-2-12 11:05:28
安 发表于 2018-2-12 10:07
楼主,是否可以考虑一下换个检测方式,从手册上来看,复位以后这个寄存器会被清除,standby模式唤醒后是直接 ...

一、为了降低功耗用了standby;
二、手册上有如下说:
A backup domain reset is generated when one of the following events occurs:
backup区域复位有两种方式
1. Software reset, triggered by setting the BDRST bit in the Backup domain control
register (RCC_BDCR).
软件复位,配置backup区域的BDRST;
2.  VDD or VBAT power on, if both supplies have previously been powered off.
VDD、VBAT全部掉电
但是程序在重新上电后也有重新配置一遍,应该和不断电效果一样才对,但是重新上电后读取不到ALRF;
codepencil 回答时间:2018-2-11 21:40:46
补充说明一下:
直接烧录完RTC Alarm唤醒standby的时候,RTC_GetFlagStatus(RTC_FLAG_ALR) ==SET,同样的程序,断电再重新上电后虽然仍然是 RTC Alarm唤醒standby,但是RTC_GetFlagStatus(RTC_FLAG_ALR) ==RESET;
只要不断电用RESET复位也是正常能获取到FLAG。
wenyangzeng 回答时间:2018-2-11 22:11:32
codepencil 发表于 2018-2-11 21:40
补充说明一下:
直接烧录完RTC Alarm唤醒standby的时候,RTC_GetFlagStatus(RTC_FLAG_ALR) ==SET,同样的程 ...

检查一下后备电池是否正常

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

七哥 回答时间:2018-2-12 01:17:13
楼主看一下这篇,也许有点用吧
http://blog.sina.com.cn/s/blog_6c911b3f0100lykc.html

楼主,你的原理图是什么样的?也许跟硬件有关系。首先VBAT应该接了电池,是没问题的吧?

STM32F103xB数据手册和AN2586应用手册。
AN2586.pdf (420.07 KB, 下载次数: 9)

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

废鱼 回答时间:2018-2-12 10:07:38
楼主,是否可以考虑一下换个检测方式,从手册上来看,复位以后这个寄存器会被清除,standby模式唤醒后是直接复位的,理论上寄存器应该被清掉了,或者先用STOP模式测试一下:
复位过程除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。 RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位,详见第6.1.3节。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

codepencil 回答时间:2018-2-12 10:46:34
wenyangzeng 发表于 2018-2-11 22:11
检查一下后备电池是否正常

没有用单独的后备电池,全部用的是VDD,VBAT口接的也是VDD;
codepencil 回答时间:2018-2-12 10:47:45
toofree 发表于 2018-2-12 01:17
楼主看一下这篇,也许有点用吧
http://blog.sina.com.cn/s/blog_6c911b3f0100lykc.html

全部用的是VDD,VBAT口接的也是VDD;
七哥 回答时间:2018-2-12 10:51:44
codepencil 发表于 2018-2-12 10:47
全部用的是VDD,VBAT口接的也是VDD;

VBAT没接电池,断电后,状态不会保存的。
codepencil 回答时间:2018-2-12 11:07:21
toofree 发表于 2018-2-12 10:51
VBAT没接电池,断电后,状态不会保存的。

但是重新上电后会完全重新配置一遍,这时候不再断电,结果却读取不到ALRF了啊。
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
12下一页

所属标签

相似问题

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