
我们来学习下STM32F1 的实时时钟(以下简称 RTC),利用 RTC设计 一个简单的电子时钟。要实现的功能是:通过串口打印出日期和时间,D1指示灯闪烁提示系统运行。 RTC简介 STM32 的实时时钟( RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置是在后备区域,无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要保证后备区域供电正常,RTC 便不会停止工作,所以通常会在后备区域供电端加一个纽扣电池,即使主电源停止供电,后备电源也会启动供电,从而保证 RTC 时钟不停的运行,只有当主电源和后备纽扣电池都没有电的时,RTC 才停止工作。RTC 中的数据都保存在属于 RTC 的备份域中,若主电源 VDD 和 VBAT 都掉电,那么备份域中保存的所有数据将丢失。备份域除了 RTC 模块的寄存器, 还有 42 个 16 位的寄存器可以在 VDD 掉电的情况下保存用户程序的数据,系统复位或电源复位时,这些数据也不会被复位。我们一般用 BKP 来存储 RTC 的校验值或者记录一些重要的数据,相当于一个 EEPROM,不过这个 EEPROM 并不是真正的 EEPROM,而是需要电池来维持它的数据。 从 RTC 的定时器特性来说,它是一个 32 位的计数器,只能向上计数。它 的时钟来源有三种,分别为高速外部时钟的 128 分频( HSE/128)、 低速内部时钟 LSI 以及低速外部时钟 LSE。使用 HSE 分频时钟或 LSI 的话,在主电源VDD 掉电的情况下,这两个时钟来源都会受到影响,因此没法保证 RTC 正常工作。所以 RTC 一般使用低速外部时钟 LSE, 在设计中, 频率通常为实时时钟模块中常用的 32.768KHz,这是因为 32768 = 2^15,分频容易实现,所以它被广泛应用到 RTC 模块。在主电源 VDD 有效的情况下(待机), RTC 还可以配置闹钟事件使 STM32 退出待机模式。 RTC结构框图 STM32F1 RTC 拥有这么多功能,是由 RTC 内部结构决定。要更好的理解STM32F1 的 RTC,就需要了解它内部的结构。如下图所示:(大家也可以查看《STM32F10x 中文参考手册》-16 实时时钟(RTC)章节内容) ![]() 从上图中可以看出,浅灰色的部分都是属于备份域的,在 VDD 掉电时可 在 VBAT 的驱动下继续运行。这部分仅包括 RTC 的分频器,计数器,和闹钟控制器。若 VDD 电源有效,RTC 可以触发 RTC_Second(秒中断)、RTC_Overflow(溢出事件)和 RTC_Alarm(闹钟中断)。从上图可以分析到,其中的定时器溢出事件无法被配置为中断。若 STM32 原本处于待机状态,可由闹钟事件或 WKUP 事件(外部唤醒事件,属于 EXTI 模块,不属于 RTC)使它退出待机模式。闹钟事件是在计数器 RTC_CNT 的值等于闹钟寄存器 RTC_ALR 的值时触发的。 在备份域中所有寄存器都是 16 位的, RTC 控制相关的寄存器也不例外。 它的计数器 RTC_CNT 的 32 位由 RTC_CNTL 和 RTC_CNTH 两个寄存器组成,分别保存定时计数值的低 16 位和高 16 位。在配置 RTC 模块的时钟时, 通常把输入的 32768Hz 的 RTCCLK 进行 32768 分频得到实际驱动计数器的时钟TR_CLK = RTCCLK/32768= 1 Hz,计时周期为 1 秒,计时器在 TR_CLK 的驱动下计数,即每秒计数器 RTC_CNT 的值加 1。 由于备份域的存在,使得 RTC 核具有了完全独立于 APB1 接口的特性,也因此对 RTC 寄存器的访问要遵守一定的规则。 系统复位后, 默认禁止访问后备寄存器和 RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和 RTC 的访问: (1) 设置 RCC_APB1ENR 寄存器的 PWREN 和 BKPEN 位来使能电源和后备接口时钟。 (2) 设置电源控制寄存器(PWR_CR)的 DBP 位使能对后备寄存器和 RTC 的访问。 设置后备寄存器为可访问后,在第一次通过 APB1 接口访问 RTC 时, 因为时钟频率的差异, 所以必须等待 APB1 与 RTC 外设同步, 确保被读取出来的 RTC寄存器值是正确的。若在同步之后,一直没有关闭 APB1 的 RTC 外设接口,就不需要再次同步了。 如果内核要对 RTC 寄存器进行任何的写操作,在内核发出写指令后, RTC 模块在 3 个 RTCCLK 时钟之后, 才开始正式的写 RTC 寄存器操作。由于 RTCCLK的频率比内核主频低得多,所以每次操作后必须要检查 RTC 关闭操作标志位RTOFF,当这个标志被置 1 时,写操作才正式完成。 |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
刘氓兔的64位入门挑战【1】——MP257芯片下单和硬件准备
刘氓兔的64位入门挑战【0】——MP257选型
STM32功能安全设计包,助力产品功能安全认证