对于单片机转ARM的同学来说,RTC可能比较少接触。提到实时时钟,更经常想到的是DS1302。当然,在STM32里,自己一个CPU已经足够,不需要DS1302。 实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。我们在本期教程中将详细讲述RTC原理及例程,以引导大家顺利进入RTC的世界。 1.STM32的RTC模块 RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。下面就来看以下它的组成结构。 1.1RTC的组成 RTC由两个部分组成:APB1接口部分以及RTC核心部分(感觉说了等于没说,因为任何模块都会有接口部分和它自己的核心部分。请注意,权威的STM32系列手册是这么说的?)。笔者猜想原因可能是STM32所有的外设默认时钟无效,使用某个外设时,再开启时钟,用这样的方式来降低功耗。这里的RTC,APB1接口由APB1总线时钟来驱动。为了突出时钟吧?不过据说APB1接口部分还包括一组16位寄存器。 RTC核心部分又分为预分频模块和一个32位的可编程计数器。前者可使每个TR_CLK周期中RTC产生一个秒中断,后者可被初始化为当前系统时间。此后系统时间会按照TR_CLK周期进行累加,实现时钟功能。 1.2对RTC的操作 我们对RTC的访问,是通过APB1接口来进行的。注意,APB1刚被开启的时候(比如刚上电,或刚复位后),从APB1上读出来的RTC寄存器的第一个值有可能是被破坏了的(通常读到0)。这个不幸,STM32是如何预防的呢?我们在程序中,会先等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1,然后才开始读操作,这时候读出来的值就是OK的。 那么对RTC寄存器的写操作会不会有类似的情况呢?对于写操作,我们只要注意,每一次写操作,必须确保在前一次写操作完成后进行。这个“确保”, 是通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。只有当RTOFF状态位是1,才可以写RTC寄存器。
|