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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版