这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【STM32回顾】-- STM32F207的RTC与备份寄存器配合完成万年历

共3条 1/1 1 跳转至

【STM32回顾】-- STM32F207的RTC与备份寄存器配合完成万年历

高工
2012-11-22 21:16:05     打赏

RTC的初始化,配置及使用请参考固件库(此处略去)

STM32F207的RTC与备分寄存器

        STM32F207具有20个32位的备分寄存器,能够存储共计80字节的内容,当入侵检测(前文中提到的“改变检查”)中断发生时将会被复位,而系统复位,以及系统从其他低功耗模式被唤醒都不会对RTC和BKP造成影响。备分寄存器(BKP)与RTC有什么关系呢,我们从实际来分析一下。我们的RTC和备分寄存器都是可以在系统掉电的情况下由电池进行供电的,假如没有BKP,当系统电源断开后,或者系统复位后,或者系统从低功耗模式被唤醒后,它定要对某些模块进行初始化,而这个时候RTC由电池供电,其数据具有连续性,如果系统不能判断RTC是否该重新初始化,那系统只能对其进行初始化导致系统时间回到默认,用户或上位机软件又得对其进行修改,增加了应用的复杂性。这个时候如果加上BKP,因为它也是可以由电池供电的,掉电丢失信息,意味着如果在电池供电正常的情况下,如果系统VDD掉电,BKP的内容就会保留下来,这样的话,我们在第一次配置好RTC后就可以通过在BKP中某个寄存器内写入一个特片标志值,便可以在系统复位后用于判断,避免对RTC的重配置。
        为了避免意外的写入操作,在系统复位后,对BKP和RTC的访问都被禁止,并且备分区BKP被保护起来。需要特殊的指令序列后才可以对其进行访问。
        举个例子说明,假如第一次配置完RTC后我们往备分寄存器0中写入一个值:0x32F2,则每次复位后我们配置RTC就用下面一段代码即可:
if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)
{
/* RTC configuration */
RTC_Config();

/* Configure the RTC data register and RTC prescaler */
RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;

/* Check on RTC init */
if (RTC_Init(&RTC_InitStructure) == ERROR)
{
printf("\n\r /!\\***** RTC Prescaler Config failed ********/!\\ \n\r");
}

/* Configure the time register */
RTC_TimeRegulate();
}

        当然里面有几个函数,需要你根据自已的需要进行选择性的配置和修改。




关键词: STM32     回顾     STM32F207     备份     寄存器    

高工
2012-11-22 21:17:46     打赏
2楼

官方的例程写得真的很好,最开始看的时候我还没怎么注意那个备份寄存器,到用的时候才发现如此好用啊……


院士
2012-11-23 14:50:44     打赏
3楼
新功能的详细解释……

大赞楼主……

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]