一、为了降低功耗用了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;
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();
}
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例程如果不配置后备电池就没意义了。
一、为了降低功耗用了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;
直接烧录完RTC Alarm唤醒standby的时候,RTC_GetFlagStatus(RTC_FLAG_ALR) ==SET,同样的程序,断电再重新上电后虽然仍然是 RTC Alarm唤醒standby,但是RTC_GetFlagStatus(RTC_FLAG_ALR) ==RESET;
只要不断电用RESET复位也是正常能获取到FLAG。
检查一下后备电池是否正常
评分
查看全部评分
http://blog.sina.com.cn/s/blog_6c911b3f0100lykc.html
楼主,你的原理图是什么样的?也许跟硬件有关系。首先VBAT应该接了电池,是没问题的吧?
STM32F103xB数据手册和AN2586应用手册。
评分
查看全部评分
复位过程除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。 RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位,详见第6.1.3节。
评分
查看全部评分
没有用单独的后备电池,全部用的是VDD,VBAT口接的也是VDD;
全部用的是VDD,VBAT口接的也是VDD;
VBAT没接电池,断电后,状态不会保存的。
但是重新上电后会完全重新配置一遍,这时候不再断电,结果却读取不到ALRF了啊。
没有接后备电池,断电后数据当然无法保存。每次上电都要初始化RTC的。
首先说明一下,程序中每次进入standby前都会重新配置RTC;
可能是我没让你明白我的意思;
我的问题是,烧写完程序不断电,RTC_GetFlagStatus(RTC_FLAG_ALR)在standby被唤醒的时候能够正常读取到被SET,可以判断是通过这个flag判断出是被RTC alarm唤醒的。但是同样的程序,给系统完全断电后再上电,结果RTC_GetFlagStatus(RTC_FLAG_ALR)在standby被唤醒的时候一直读取到的是RESET,没法通过这个flag判断出是被RTC alarm唤醒的。
不知道我的疑问是否被你理解了?
所以,不接后备电池,断电后备份寄存器是空的,再一次初始化RTC了。
......
我在程序里面每次都会重新配置RTC,所以即使是断电在上电后(VBAT接的是VDD),也会重新配以一遍RTC,但是问题在于断电在上电后重新配置的RTC alarm虽然起作用,但是标志位不再有动作了,让我没法判断是不是被RTC Alarm唤醒了。
不知这样说是否清楚了?
另外我用的是F103CBU6