系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后, 会自动禁止 访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置 时间之前,先要取消备份区域(BKP)写保护。 执行以下操作可以使能对备份 寄存器和 RTC 的访问: 1)通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口 的时钟 2)电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 的访问。 RTC 构成: RTC:1,APB1 总线,16 位寄存器。2,(RTC 核心)由一组可编程计数器组成,分成 两个主要模块。第一个模块是 RTC 的预分频模块,它可编程产生最长为 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周 期中 RTC 产生一个中断(秒中断)。 第二个模块是一个 32 位的可编程计数器,可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记录 4294967296 秒,约合 136 年左右 RTC 还有一个闹钟寄存器 RTC_ALR,32 位,用于产生闹钟。系统时间按 TR_CL 周 期累加并与存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄 存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。 RTC 正常工作的一般配置步骤如下: 1)使能电源时钟和备份区域时钟。 前面已经介绍了,我们要访问 RTC 和备份区域就必须先使能电源时钟和备份 区域时钟。这个通过 RCC_APB1ENR 寄存器来设置。 2)取消备份区写保护。 要向备份区域写入数据,就要先取消备份区域写保护(写保护在每次硬复 位之后被使能) ,否则是无法向备份区域写入数据的。我们需要向备份区域写入 一个字节,来标记时钟已经配置过了,这样避免每次复位之后重新配置时钟 3)复位备份区域,开启外部低速振荡器。 在取消备份区域写保护之后,可以先对这个区域复位,以清除前面的设置 当然这个操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢 失,所以要不要复位,要看情况而定。然后我们使能外部低速振荡器,注意这 里一般要先判断 RCC_BDCR 的 LSERDY 位来确定低速振荡器已经就绪了才开始下 面 的操作。4)选择 RTC 时钟,并使能。 这里将通过 RCC_BDCR 的 RTCSEL 来选择选择外部 LSI 作为 RTC 的时钟。然后 过 RTCEN 位使能 RTC 时钟。 5)设置 RTC 的分频,以及配置 RTC 时钟。 在开启了 RTC 时钟之后,我们要做的就是设置 RTC 时钟的分频数,通过 RTC_PRLH 和 RTC_PRLL 来设置,然后等待 RTC 寄存器操作完成,并同步之后,设 秒钟中断。然后设置 RTC 的允许配置位(RTC_CRH 的 CNF 位) ,设置时间(其实 是设置 RTC_CNTH 和 RTC_CNTL 两个寄存器) 。 6)更新配置,设置 RTC 中断。 在设置完时钟之后,我们将配置更新,这里还是通过 RTC_CRH 的 CNF 来实 在这之后我们在备份区域 BKP_DR1 中写入 0X5050 代表我们已经初始化过时钟了 下次开机(或复位)的时候,先读取 BKP_DR1 的值,然后判断是否是 0X5050 来 定是不是要配置。接着我们配置 RTC 的秒钟中断,并进行分组。 7)编写中断服务函数。 最后,我们要编写中断服务函数,在秒钟中断产生的时候,读取当前的时 间值,并显示到 TFTLCD 模块上。