7.STM32F407ZGT6-RTC
参考:1.正点原子
媒介:
RTC及时时钟是很根本的外设,用来记载绝对时间。做个总结,到达:
1.学习RTC的原理和概念。
2.通过STM32CubeMX快速设置RTC。
27.1 RTC 时钟简介
STM32F407 的及时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组一连计数的计数器,在相对应的软件设置下,可提供时钟日历的功能。修改计数器的值可以重新设置体系的当前时间和日期。
RTC 模块和时钟设置体系(RCC_BDCR 寄存器)是在后备地区,即在体系复位或从待机模式叫醒后 RTC 的设置和时间维持稳固,只要后备地区供电正常,那么 RTC 将可以不绝运行。
但是在体系复位后,会主动克制访问后备寄存器和 RTC,以防止对后备地区(BKP)的不测写利用。以是在要设置时间之前,先要取消备份地区(BKP)写掩护。
27.1.1 RTC 框图
下面先来学习 RTC 框图,通过学习 RTC 框图会有一个很好的团体把握,同时对之后的编程也会有一个清楚的思绪。RTC 的框图,如图 27.1.1 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZTIxMzIxZTI5Yzc4NGFkNzkwNzkzMzMzMTBhOGZmZTUucG5n
我们把 RTC 框图分成以下几个部分解说:
① 时钟源
STM32F407 的 RTC 时钟源(RTCCLK)通逾期钟控制器,可以从 LSE 时钟、LSI 时钟以及 HSE 时钟三者中选择其一(通过设置 RCC_BDCR 寄存器选择)。一样平常我们选择 LSE,即外部 32.768KHz 晶振作为时钟源(RTCCLK)。外部晶振具有精度高的长处。LSI 是 STM32 芯片内部的低速 RC 振荡器,频率约 32 KHz,缺点是精度较低,以是一样平常不发起利用。比如当没有外部低速晶振(32.768KHz)的时间,分频后的 HSE 可以作为备选利用的时钟源。
② 预分频器
预分配器(RTC_PRER)分为 2 个部分:一个通过 RTC_PRER 寄存器的 PREDIV_A 位设置的 7 位异步预分频器。另一个通过 RTC_PRER 寄存器的 PREDIV_S 位设置的 15 位同步预分频器。
颠末 7 位异步预分频器出来的时钟 ck_apre 可作为 RTC_SSR 亚秒递减计数器(RTC_SSR)的时钟,ck_apre 时钟频率的盘算公式如下:
Fck_apre =Frtcclk ( PREDIV_A + 1)
当 RTC_SSR 寄存器递减到 0 的时间,会利用 PREDIV_S 的值重新装载 PREDIV_S。而PREDIV_S 一样平常为 255,如许,我们得到亚秒时间的精度是:1/256 秒,即 3.9ms 左右,有了这个亚秒寄存器 RTC_SSR,就可以得到更加准确的时间数据。
颠末 15 位同步预分频器出来的时钟 ck_spre 可以用于更新日历,也可以用作 16 位叫醒主动重载定时器的时基,ck_apre 时钟频率的盘算公式如下:
Fck_spre =Frtcclk(PREDIV_S + 1) ∗ ( PREDIV_A + 1)
PREDIV_A 和 PREDIV_S 分别为 RTC 的异步和同步分频器,利用两个预分频器时,我们保举设置 7 位异步预分频器(PREDIV_A)的值较大,以最大水平低沉功耗。比方:本实验我们的外部低速晶振的频率 32.768KHz 颠末 7 位异步预分频器后,再颠末 15 位同步预分频器,要得到 1Hz 频率的时钟用于更新日历。通过盘算知道,32.768KHz 的时钟要颠末 32768 分频,才气得到 1Hz 的 ck_spre。于是我们只须要设置: PREDIV_A=0X7F,即 128 分频;PREDIV_S=0XFF,即 256 分频,即可得到 1Hz 的 Fck_spre,PREDIV_A 的值我们也是往只管大的原则,以最大水平低沉功耗。
③ 时间和日期干系寄存器
该部分包罗三个影子寄存器,RTC_SSR(亚秒)、RTC_TR(时间)、RTC_DR(日期)。及时时钟一样平常表现为:时/分/秒/亚秒。RTC_TR 寄存器用于存储时/分/秒时间数据,可读可写(即可设置大概获取时间)。RTC_DR 寄存器用于存储日期数据,包罗年/月/日/星期,可读可写(即可设置大概获取日期)。RTC_SSR 寄存器用于存储亚秒级的时间,如许我们可以获取更加准确的时间数据。
这三个影子寄存器可以通过与 PCLK1(APB1 时钟)同步的影子寄存器来访问,这些时间和日期寄存器也可以直接访问,如许可克制等候同步的一连时间。
每隔 2 个 RTCCLK 周期,当前日历值便会复制到影子寄存器,并置位 RTC_ISR 寄存器的RSF 位。我们可以读取 RTC_TR 和 RTC_DR 来得到当前时间和日期信息,不外须要留意的是:
时间和日期都是以 BCD 码的格式存储的,读出来要转换一下,才可以得到十进制的数据。
④ 可编程闹钟
STM32F407 提供两个可编程闹钟:闹钟 A(ALARM_A)和闹钟 B(ALARM_B)。通过RTC_CR 寄存器的 ALRAE 和 ALRBE 位置 1 来使能闹钟。当亚秒、秒、分、小时、日期分别与闹钟寄存器 RTC_ALRMASSR/RTC_ALRMAR 和RTC_ALRMBSSR/RTC_ALRMBR 中的值匹配时,则可以产生闹钟(须要得当设置)。本章我们将利用闹钟 A 产生闹铃,即设置RTC_ALRMASSR 和 RTC_ALRMAR 即可。
⑤ 周期性主动叫醒
STM32F407 的 RTC 不带秒钟克制了,但是多了一个周期性主动叫醒功能。周期性叫醒功能,由一个 16 位可编程主动重载递减计数器(RTC_WUTR)天生,可用于周期性克制/叫醒。
我们可以通过 RTC_CR 寄存器中的 WUTE 位设置使能此叫醒功能。
叫醒定时器的时钟输入可以是:2、4、8 或 16 分频的 RTC 时钟(RTCCLK),也可以是 ck_spre时钟(一样平常为 1Hz)。
当选择 RTCCLK(假定 LSE 是:32.768 kHz)作为输入时钟时,可设置的叫醒克制周期介于122us(由于 RTCCLK/2 时,RTC_WUTR 不能设置为 0)和 32 s 之间,分辨率最低为:61us。
当选择 ck_spre(1Hz)作为输入时钟时,可得到的叫醒时间为 1s 到 36h 左右,分辨率为 1秒。而且这个 1s~36h 的可编程时间范围分为两部分:
当 WUCKSEL=10 时为:1s 到 18h。
当 WUCKSEL=11 时约为:18h 到 36h。
在后一种情况下,会将 2^16 添加到 16 位计数器当前值(即扩展到 17 位,相称于最高位用WUCKSEL 取代)。
初始化完成后,定时器开始递减计数。在低功耗模式下使能叫醒功能时,递减计数保持有用。别的,当计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标记会置 1,而且叫醒寄存器会利用其重载值(RTC_WUTR 寄存器值)主动重载,之后必须用软件清零 WUTF 标记。
通过将 RTC_CR 寄存器中的 WUTIE 位置 1 来使能周期性叫醒克制时,可以使 STM32 退出低功耗模式。体系复位以及低功耗模式(就寝、停机和待机)对叫醒定时器没有任何影响,它仍然可以正常工作,故叫醒定时器,可以用于周期性叫醒 STM32。
27.1.2 RTC 寄存器
接下来,我们先容本实验我们要用到的 RTC 寄存器。
⚫ RTC 时间寄存器(RTC_TR)
RTC 时间寄存器形貌如图 27.1.2.1 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYzBhYjY3MDA5MTcxNDViZmEyNTMxNjA0ZTE4ZDBkMzkucG5n
该寄存器是 RTC 的时间寄存器,可读可写,对该寄存器写,可以设置时间,对该寄存器读,可以获取当前的时间,别的该寄存器受到寄存器写掩护,通过 RTC 写掩护寄存器(RTC_WPR)设置,背面会解说到 RTC_WPR 寄存器。须要留意的是:本寄存器存储的数据都是 BCD 格式的,读取之后须要举行转换,方可得到十进制的时分秒等数据。
⚫ RTC 日期寄存器(RTC_DR)
RTC 日期寄存器形貌如图 27.1.2.2 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvY2I1M2YxODQ5ZDRkNGI2ZThjNDkwYzk5YTc2ZGU1MDQucG5n
该寄存器是 RTC 的日期寄存器,可读可写,对该寄存器写,可以设置日期,对该寄存器读,可以获取当前的日期,同样该寄存器也受到寄存器写掩护,存储的数据也都是 BCD 格式的。
⚫ RTC 控制寄存器(RTC_CR)
RTC 控制寄存器形貌如图 27.1.2.3 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNTk5MDc2M2ViOTMwNDZlMGFmZGIxM2YzMDIyYzlkZDcucG5n
该寄存器重点先容几个要用到的位:WUTIE 是叫醒定时器克制使能位,ALRAIE 是闹钟 A克制使能位,本章用到这两个使能位,都设置为 1 即可。WUTE 和 ALRAE 分别是叫醒定时器和闹钟 A 使能位,同样都设置为 1,开启。FMT 为小时格式选择位,我们设置为 0,选择 24 小时制。WUCKSEL,用于叫醒时钟选择,这个前面已经有先容了,我们这里就不多说了。
⚫ RTC 亚秒寄存器(RTC_SSR)
RTC 亚秒寄存器形貌如图 27.1.2.4 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMmUyZjNkYjkxMTIxNGIwNjg2YzYyZGU2ZjUzOTJjNDYucG5n
该寄存器可用于获取更加准确的 RTC 时间。不外,在本章没有用到,如果须要准确时间的地方,各人可以利用该寄存器。
⚫ RTC 初始化和状态寄存器(RTC_ISR)
RTC 初始化和状态寄存器形貌如图 27.1.2.5 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZTNlZTYzZjlmMTAyNGEzYzkzNDNkODY5ZTM3YjY4ZmYucG5n
该寄存器中,WUTF、ALRBF 和 ALRAF,分别是叫醒定时器、闹钟 B 和闹钟 A 的克制标记位,当对应变乱产生时,这些标记位被置 1,如果设置了克制,则会进入克制服务函数,这些位通过软件写 0 扫除。
INIT 为初始化模式控制位,要初始化 RTC 时,必须先设置 INIT=1。
INITF 为初始化标记位,当设置 INIT 为 1 以后,要等候 INITF 为 1,才可以更新时间、日期和预分频寄存器等。
RSF 位为寄存器同步标记,仅在该位为 1 时,表现日历影子寄存器已同步,可以准确读取RTC_TR/RTC_TR 寄存器的值了。
WUTWF、ALRBWF 和 ALRAWF 分别是叫醒定时器、闹钟 B 和闹钟 A 的写标记,只有在这些位为 1 的时间,才可以更新对应的内容。比如:要设置闹钟 A 的 ALRMAR 和 ALRMASSR,则必须先等候 ALRAWF 为 1,才可以设置。
⚫ RTC 预分频寄存器(RTC_PRER)
RTC 预分频寄存器形貌如图 27.1.2.6 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYTUzOTViMzJmNGU4NDZkNTg1ZjFmM2M5OTk3ZGIwMDcucG5n
该寄存器用于 RTC 的分频,我们在之前也有讲过,这里就不多说了。该寄存器的设置,必须在初始化模式(INITF=1)下,才可以举行。
⚫ RTC 叫醒寄存器(RTC_WUTR)
RTC 叫醒寄存器形貌如图 27.1.2.7 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMTZiNjFlZmFmNDUyNDY1MzkwNTUxNGVmYzNiY2E3NjEucG5n
该寄存器用于设置主动叫醒重装载值,可用于设置叫醒周期。该寄存器的设置,必须等候RTC_ISR 的 WUTWF 为 1 才可以举行。
⚫ RTC 闹钟 A 寄存器(RTC_ALRMAR)
RTC 闹钟 A 寄存器形貌如图 27.1.2.8 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNjBhMDQ2ZDZjZDQxNDBkYmEwNjViODBhZGFiNWU1NzEucG5n
该寄存器用于设置闹铃 A,当 WDSEL 选择 1 时,利用星期制闹铃,本章我们选择星期制闹铃。该寄存器的设置,必须等候 RTC_ISR 的 ALRAWF 为 1 才可以举行。别的,尚有RTC_ALRMASSR 寄存器,该寄存器我们这里就不再先容了,各人参考手册。
⚫ RTC 写掩护寄存器(RTC_WPR)
RTC 写掩护寄存器:RTC_WPR,该寄存器比力简朴,低八位有用。上电后,全部 RTC 寄存器都受到写掩护(RTC_ISR、RTC_TAFCR 和 RTC_BKPxR 除外),必须依次写入:0xCA、0x53 两关键字到 RTC_WPR 寄存器,才可以解锁。写一个错误的关键字将再次激活 RTC 的寄存器写掩护。
⚫ RTC 备份寄存器(RTC_BKPxR)
RTC 备份寄存器形貌如图 27.1.2.9 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvODdmMjkwMjdhZDk3NDRjM2I0NjFkMjk5YTY2YWIxMjEucG5n
该寄存器组统共有 32 个,每个寄存器是 32 位的,可以存储 128 个字节的用户数据,这些寄存器在备份域中实现,可在 VDD 电源关闭时通过 VBAT 保持上电状态。备份寄存器不会在体系复位或电源复位时复位,也不会在 MCU 从待机模式叫醒时复位。
复位后,对 RTC 和 RTC 备份寄存器的写访问被克制,实验以下利用可以使能 RTC 及 RTC备份寄存器的写访问:
1)电源控制寄存器(PWR_CR)的 DBP 位来使能 RTC 及 RTC 备份寄存器的访问。
2)往 RTC_WPR 写入 0xCA、0x53 解锁序列(先写 0xCA,再写 0x53)。
我们可以用 BKP 来存储一些告急的数据,相称于一个 EEPROM,不外这个 EEPROM 并不是真正的 EEPROM,而是须要电池来维持它的数据。
⚫ 备份地区控制(RCC_BDCR)
备份地区控制寄存器形貌如图 27.1.2.10 所示:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMzRmMTY5YTFkNzQ4NDU4MWJlMWZmNDhjY2I0YWE5YzIucG5n
RTC 的时钟源选择及使能设置都是通过这个寄存器来实现的,以是我们在 RTC 利用之前先要通过这个寄存器选择 RTC 的时钟源,然后才气开始其他的利用。
27.2 硬件操持
1. 例程功能
本实验通过串口输出 RTC 时间,并可以通过串口 设置 RTC 时间,从而调治时间。
2. 硬件资源
1)串口 1(PA9/PA10 毗连在板载 USB 转串口芯片 CH340 上面)
2)RTC(及时时钟)
3. 原理图
RTC 属于 STM32F407 内部资源,通过软件设置好就可以了。不外 RTC 不能断电,否则数据就丢失了,我们如果想让时间在断电后还可以继续走,那么必须确保开发板的电池有电。
27.3 步调操持
27.3.1 RTC 的 HAL 库驱动
RTC 在 HAL 库中的驱动代码在 stm32f4xx_hal_rtc.c 文件(及其头文件)中。下面先容几个告急的 RTC 函数,其他没有先容的请看源码。
1. HAL_RTC_Init 函数
RTC 的初始化函数,其声明如下:
HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc);
⚫ 函数形貌:
用于初始化 RTC。
⚫ 函数形参:
形参 1 是 RTC_HandleTypeDef 结构体范例指针变量,其界说如下:
typedef struct
{
RTC_TypeDef *Instance; /* 寄存器基地址 */
RTC_InitTypeDef Init; /* RTC 配置结构体 */
HAL_LockTypeDef Lock; /* RTC 锁定对象 */
__IO HAL_RTCStateTypeDef State; /* RTC 设备访问状态 */
}RTC_HandleTypeDef;
1)Instance:指向 RTC 寄存器基所在。
2)Init:是真正的 RTC 初始化结构体,其结构体范例 RTC_InitTypeDef 界说如下:
typedef struct
{
uint32_t HourFormat; /* 小时格式 */
uint32_t AsynchPrediv; /* 异步预分频系数 */
uint32_t SynchPrediv; /* 同步预分频系数 */
uint32_t OutPut; /* 选择连接到 RTC_ALARM 输出的标志 */
uint32_t OutPutPolarity; /* 设置 RTC_ALARM 的输出极性 */
uint32_t OutPutType; /* 设置 RTC_ALARM 的输出类型为开漏输出还是推挽输出 */
}RTC_InitTypeDef;
HourFormat : 用来设置小时格式,可以是 12 小时制大概 24 小时制,这两个选项的宏界说分别为 RTC_HOURFORMAT_12 和 RTC_HOURFORMAT_24。
AsynchPrediv: 用来设置 RTC 的异步预分频系数,也就是设置 RTC_PRER 寄存器的PREDIV_A 干系位,由于异步预分频
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]