数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 93|回复: 0

《STM32H7R7开发指南》第二十九章 RTC实时时钟实验

[复制链接]
发表于 昨天 09:30 | 显示全部楼层 |阅读模式
第二十九章 RTC实时时钟实验


本章,我们将介绍STM32H7R7的内部实时时钟(RTC)。我们将使用LCD模块来显示日期和时间,实现一个简单的实时时钟,并可以设置闹铃,另外还将介绍BKP的使用。
本章分为如下几个小节:
29.1 RTC时钟简介
29.2 硬件设计
29.3 程序设计
29.4 下载


29.1 RTC时钟简介
STM32H7R7的实时时钟(RTC)相对于STM32F1来说,改进了不少,带了日历功能了。RTC是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARM AALARM B)中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模式的自动唤醒单元。
两个32位寄存器(TRDR)包含二进码十进数格式 (BCD) 的秒、分钟、小时(1224小时制)、星期、日期、月份和年份。此外,还可提供二进制格式的亚秒值。
STM32H7R7RTC可以自动将月份的天数补偿为 2829(闰年)、30 31 天。并且还可以进行夏令时补偿。
RTC模块和时钟配置是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,那么RTC将可以一直运行。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。
29.1.1 RTC框图
下面先来学习RTC框图,通过学习RTC框图会有一个很好的整体掌握,同时对之后的编程也会有一个清晰的思路。RTC的框图,如图29.1.1所示:
29.1.1 RTC框图
我们把RTC框图分成以下几个部分讲解:
时钟源
STM32H7R7RTC时钟源(rtc_ker_ck)通过时钟控制器,可以从LSE时钟、LSI时钟以及HSE时钟三者中选择其一(通过设置RCC_BDCR寄存器选择)。一般我们选择LSE,即外部32.768Khz晶振作为时钟源(rtc_ker_ck)。外部晶振具有精度高的优点。LSISTM32芯片内部的低速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时钟频率的计算公式如下:
file:///C:/Users/ALIENTEK/AppData/Local/Temp/ksohtml31436/wps2.jpg
RTC_SSR寄存器递减到0的时候,会使用PREDIV_S的值重新装载PREDIV_S。而PREDIV_S一般为255,这样,我们得到亚秒时间的精度是:1/256秒,即3.9ms左右,有了这个亚秒寄存器RTC_SSR,就可以得到更加精确的时间数据。
经过15位同步预分频器出来的时钟ck_spre可以用于更新日历,也可以用作16位唤醒自动重载定时器的时基,ck_apre时钟频率的计算公式如下:
file:///C:/Users/ALIENTEK/AppData/Local/Temp/ksohtml31436/wps3.jpg
PREDIV_APREDIV_S分别为RTC的异步和同步分频器,使用两个预分频器时,我们推荐设置7位异步预分频器(PREDIV_A)的值较大,以最大程度降低功耗。例如:本实验我们的外部低速晶振的频率32.768KHZ经过7位异步预分频器后,再经过15位同步预分频器,要得到1HZ频率的时钟用于更新日历。通过计算知道,32.768KHZ的时钟要经过32768分频,才能得到1Hzck_spre。于是我们只需要设置:PREDIV_A=0X7F,即128分频;PREDIV_S=0XFF,即256分频,即可得到1HzFck_sprePREDIV_A的值我们也是往尽量大的原则,以最大程度降低功耗。
时间和日期相关寄存器
该部分包括三个影子寄存器,RTC_SSR(亚秒)、RTC_TR(时间)、RTC_DR(日期)。实时时钟一般表示为:时///亚秒。RTC_TR寄存器用于存储时//秒时间数据,可读可写(即可设置或者获取时间)。RTC_DR寄存器用于存储日期数据,包括年///星期,可读可写(即可设置或者获取日期)。RTC_SSR寄存器用于存储亚秒级的时间,这样我们可以获取更加精确的时间数据。
每隔2rtc_ker_ck周期,当前日历值便会复制到影子寄存器,并置位RTC_ISR寄存器的RSF位。我们可以读取RTC_TRRTC_DR来得到当前时间和日期信息,不过需要注意的是:时间和日期都是以BCD码的格式存储的,读出来要转换一下,才可以得到十进制的数据。
可编程闹钟
STM32H7R7提供两个可编程闹钟:闹钟AALARM_A)和闹钟BALARM_B)。通过RTC_CR寄存器的ALRAEALRBE位置1来使能闹钟。当亚秒、秒、分、小时、日期分别与闹钟寄存器RTC_ALRMASSR/RTC_ALRMARRTC_ALRMBSSR/RTC_ALRMBR中的值匹配时,则可以产生闹钟(需要适当配置)。本章我们将利用闹钟A产生闹铃,即设置RTC_ALRMASSRRTC_ALRMAR即可。
周期性自动唤醒
STM32H7R7RTC不带秒钟中断了,但是多了一个周期性自动唤醒功能。周期性唤醒功能,由一个16位可编程自动重载递减计数器(RTC_WUTR)生成,可用于周期性中断/唤醒。
我们可以通过RTC_CR寄存器中的WUTE位设置使能此唤醒功能。
唤醒定时器的时钟输入可以是:24816分频的RTC时钟(rtc_ker_ck),也可以是ck_spre时钟(一般为1Hz)。
当选择rtc_ker_ck (假定LSE是:32.768 kHz)作为输入时钟时,可配置的唤醒中断周期介于 122us(因为rtc_ker_ck/2时,RTC_WUTR不能设置为0)和32 s之间,分辨率最低为:61us
当选择ck_spre1Hz)作为输入时钟时,可得到的唤醒时间为 1s36h左右,分辨率为1 秒。并且这个1s~36h的可编程时间范围分为两部分:
WUCKSEL[2:1]=10时为:1s18h
WUCKSEL[2:1]=11时约为:18h36h
在后一种情况下,会将2^16添加到16位计数器当前值(即扩展到17位,相当于最高位用WUCKSEL [1]代替)。
初始化完成后,定时器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当计数器计数到0时,RTC_ISR寄存器的WUTF标志会置1,并且唤醒寄存器会使用其重载值(RTC_WUTR寄存器值)动重载,之后必须用软件清零WUTF标志。
通过将 RTC_CR寄存器中的WUTIE位置1来使能周期性唤醒中断时,可以使STM32H7R7退出低功耗模式。系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响,它仍然可以正常工作,故唤醒定时器,可以用于周期性唤醒STM32H7R7
29.1.2 RTC寄存器
接下来,我们介绍本实验我们要用到的RTC寄存器。
l RTC时间寄存器(RTC_TR
RTC时间寄存器描述如图29.1.2.1所示:
图29.1.2.1 RTC_TR寄存器
该寄存器是RTC的时间寄存器,可读可写,对该寄存器写,可以设置时间,对该寄存器读,可以获取当前的时间,此外该寄存器受到寄存器写保护,通过RTC写保护寄存器(RTC_WPR)设置,后面会讲解到RTC_WPR寄存器。需要注意的是:本寄存器存储的数据都是BCD格式的,读取之后需要进行转换,方可得到十进制的时分秒等数据。
l RTC日期寄存器(RTC_DR
RTC日期寄存器描述如图29.1.2.2所示:
图29.1.2.2 RTC_DR寄存器
该寄存器是RTC的日期寄存器,可读可写,对该寄存器写,可以设置日期,对该寄存器读,可以获取当前的日期,同样该寄存器也受到寄存器写保护,存储的数据也都是BCD格式的。
l RTC亚秒寄存器(RTC_SSR
RTC亚秒寄存器描述如图29.1.2.3所示:
图29.1.2.3 RTC_SSR寄存器
该寄存器可用于获取更加精确的RTC时间。不过,在本章没有用到,如果需要精确时间的地方,大家可以使用该寄存器。
l RTC控制寄存器(RTC_CR
RTC控制寄存器描述如图29.1.2.4所示:
图29.1.2.4 RTC_CR寄存器
该寄存器重点介绍几个要用到的位:WUTIE是唤醒定时器中断使能位,ALRAIE是闹钟A中断使能位,本章用到这两个使能位,都设置为1即可。WUTEALRAE分别是唤醒定时器和闹钟A使能位,同样都设置为1,开启。FMT为小时格式选择位,我们设置为0,选择24小时制。WUCKSEL[2:0],用于唤醒时钟选择,这个前面已经有介绍了,我们这里就不多说了。
l RTC初始化和状态寄存器(RTC_SR
RTC初始化和状态寄存器描述如图29.1.2.5所示:
图29.1.2.5 RTC_SR寄存器
该寄存器中,WUTFALRBFALRAF,分别是唤醒定时器、闹钟B和闹钟A的中断标志位,当对应事件产生时,这些标志位被置1,如果设置了中断,则会进入中断服务函数,这些位通过软件写0清除。
l RTC预分频寄存器(RTC_PRER
RTC预分频寄存器描述如图29.1.2.6所示:
图29.1.2.6 RTC_PRER寄存器
该寄存器用于RTC的分频,我们在之前也有讲过,这里就不多说了。该寄存器的配置,必须在初始化模式(INITF=1)下,才可以进行。
l RTC唤醒寄存器(RTC_WUTR
RTC唤醒寄存器描述如图29.1.2.7所示:
图29.1.2.7 RTC_WUTR寄存器
该寄存器用于设置自动唤醒重装载值,可用于设置唤醒周期。该寄存器的配置,必须等待RTC_ISRWUTWF1才可以进行。
l RTC闹钟A寄存器(RTC_ALRMAR
RTC闹钟A寄存器描述如图29.1.2.8所示:
图29.1.2.8 RTC_ALRMAR寄存器
该寄存器用于设置闹铃A,当WDSEL选择1时,使用星期制闹铃,本章我们选择星期制闹铃。该寄存器的配置,必须等待RTC_ISRALRAWF1才可以进行。另外,还有RTC_ALRMASSR寄存器,该寄存器我们这里就不再介绍了,大家参考手册。
l RTC写保护寄存器(RTC_WPR
RTC写保护寄存器描述如图29.1.2.9所示:
图29.1.2.9 RTC_WPR寄存器
RTC写保护寄存器:RTC_WPR,该寄存器比较简单,低八位有效。上电后,所有RTC寄存器都受到写保护(RTC_ISR[13:8]RTC_TAFCRRTC_BKPxR除外),必须依次写入:0XCA0X53两关键字到RTC_WPR寄存器,才可以解锁。写一个错误的关键字将再次激活RTC的寄存器写保护。
l RTC备份寄存器(RTC_BKPxR
RTC备份寄存器描述如图29.1.2.10所示:
图29.1.2.10 RTC_BKPxR寄存器
该寄存器组总共有32个,每个寄存器是32位的,可以存储128个字节的用户数据,这些寄存器在备份域中实现,可在VDD电源关闭时通过VBAT保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在MCU从待机模式唤醒时复位。
复位后,对RTCRTC备份寄存器的写访问被禁止,执行以下操作可以使能对RTCRTC备份寄存器的写访问:
1)电源控制寄存器(PWR_CR)的DBP位来使能对RTCRTC备份寄存器的访问。
2)往RTC_WPR写入0XCA0X53解锁序列(先写0XCA,再写0X53)。   
我们可以用BKP来存储一些重要的数据,相当于一个EEPROM,不过这个EEPROM并不是真正的EEPROM,而是需要电池来维持它的数据。
l 备份区域控制(RCC_BDCR
备份区域控制寄存器描述如图29.1.2.11所示:
图29.1.2.11 RCC_BDCR寄存器
RTC的时钟源选择及使能设置都是通过这个寄存器来实现的,所以我们在RTC操作之前先要通过这个寄存器选择RTC的时钟源,然后才能开始其他的操作。
29.2 硬件设计1. 例程功能
本实验通过LCD显示RTC时间,并可以通过usmart设置RTC时间,从而调节时间,或设置RTC闹钟,还可以写入或者读取RTC后备区域SRAMLED1每两秒闪烁一次,表示进入WAKE UP中断。LED0闪烁,提示程序运行。
2. 硬件资源
1LED
     LED0: LED0 PD14
LED1: LED1 PC0
2) 串口1(PB14/PB15连接在板载USB转串口芯片CH340上面)
3) RTC(实时时钟)
4)正点原子2.8/3.5/4.3/7/10TFTLCD模块(包括MCU屏和RGB,都支持)
3. 原理图
RTC属于STM32H7R7内部资源,通过软件设置好就可以了。不过RTC不能断电,否则数据就丢失了,我们如果想让时间在断电后还可以继续走,那么必须确保开发板的电池有电。
29.3 程序设计 29.3.1 RTCHAL库驱动
RTC在HAL库中的驱动代码在stm32h7rsxx_hal_rtc.c文件(及其头文件)中。下面介绍几个重要的RTC函数,其他没有介绍的请看源码。
1. HAL_RTC_Init函数
RTC的初始化函数,其声明如下:
HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc);
l 函数描述:
用于初始化RTC。
l 函数形参:
形参1是RTC_HandleTypeDef结构体类型指针变量,其定义如下:
typedef struct
{
  RTC_TypeDef                   *Instance;  /* 寄存器基地址 */
  RTC_InitTypeDef               Init;        /* RTC配置结构体 */
  HAL_LockTypeDef               Lock;        /* RTC锁定对象 */
  __IO HAL_RTCStateTypeDef      State;         /* RTC设备访问状态 */
}RTC_HandleTypeDef;
1Instance:指向RTC寄存器基地址。
2)Init:是真正的RTC初始化结构体,其结构体类型RTC_InitTypeDef定义如下:
typedef struct
{
  uint32_t HourFormat;        /* 小时格式 */
  uint32_t AsynchPrediv;      /* 异步预分频系数 */
  uint32_t SynchPrediv;       /* 同步预分频系数 */  
  uint32_t OutPut;             /* 选择连接到RTC_ALARM输出的标志 */   
uint32_t OutPutRemap;       /* 指定RTC输出的映射 */
  uint32_t OutPutPolarity;   /* 设置RTC_ALARM的输出极性 */
  uint32_t OutPutType;        /* 设置RTC_ALARM的输出类型为开漏输出还是推挽输出 */
uint32_t OutPutPullUp;        /* RTC输出上拉模式 */
uint32_t BinMode;            /* 二进制模式 */
uint32_t BinMixBcdU;        /* 设置RTC日历更新 */
}RTC_InitTypeDef;
HourFormat用来设置小时格式,可以是12小时制或者24小时制,这两个选项的宏定义分别为RTC_HOURFORMAT_12和RTC_HOURFORMAT_24。
AsynchPrediv用来设置RTC的异步预分频系数,也就是设置RTC_PRER寄存器的PREDIV_A相关位,因为异步预分频系数是7位,所以最大值为0x7F,不能超过这个值。
SynchPrediv用来设置RTC的同步预分频系数,也就是设置RTC_PRER寄存器的PREDIV_S相关位,因为同步预分频系数也是15位,所以最大值为0x7FFF,不能超过这个值。
OutPut用来选择要连接到RTC_ALARM输出的标志,取值为:RTC_OUTPUT_DISABLE(禁止输出),RTC_OUTPUT_ALARMA(使能闹钟A输出),RTC_OUTPUT_ALARMB(使能闹钟B输出)和RTC_OUTPUT_WAKEUP(使能唤醒输出)。
OutPutRemap用于设置指定RTC输出的映射,即配置RTC_OR寄存器。
OutPutPolarity用来设置RTC_ALARM的输出极性,与Output成员变量配合使用,取值为RTC_OUTPUT_POLARITY_HIGH(高电平)或RTC_OUTPUT_POLARITY_LOW(低电平)。
OutPutType用来设置RTC_ALARM的输出类型为开漏输出(RTC_OUTPUT_TYPE_ OPENDRAIN)还是推挽输出(RTC_OUTPUT_TYPE_PUSHPULL),与成员变量OutPut和OutPutPolarity配合使用。
另外三个参数就不再介绍了。
3)Lock:用于配置锁状态。
4)State:RTC设备访问状态。
l 函数返回值:
HAL_StatusTypeDef枚举类型的值。
2. HAL_RTC_SetTime函数
HAL_RTC_SetTime是设置RTC的时间函数。其声明如下:
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc,
RTC_TimeTypeDef *sTime, uint32_t Format);
l 函数描述:
该函数用于设置RTC的时间,即设置时间寄存器RTC_TR的相关位的值
l 函数形参:
形参1是RTC_HandleTypeDef结构体类型指针变量,即RTC的句柄。
形参2是RTC_TimeTypeDef结构体类型指针变量,定义如下:
typedef struct
{
  uint8_t Hours;
  uint8_t Minutes;
  uint8_t Seconds;
  uint8_t TimeFormat;
  uint32_t SubSeconds;
  uint32_t SecondFraction;
  uint32_t DayLightSaving;
  uint32_t StoreOperation;
}RTC_TimeTypeDef;
前面四个成员变量就比较好理解了,分别用来设置RTC时间参数的小时,分钟,秒钟,以及AM/PM符号,大家参考前面讲解的RTC_TR的位描述即可。SubSeconds用来读取保存亚秒寄存器 RTC_SSR的值,SecondFraction用来读取保存同步预分频系数 的值,也就是RTC_PRER的位0~14DayLightSaving用来设置日历时间增加1小时,减少1小时,还是不变。StoreOperation用户可对此变量设置以记录是否已对夏令时进行更改。
形参3是uint32_t类型变量,用来设置输入的时间格式为BIN格式还是BCD格式,可选值为RTC_FORMAT_BIN或者RTC_FORMAT_BCD。
l 函数返回值:
HAL_StatusTypeDef枚举类型的值。
3. HAL_RTC_SetDate函数
HAL_RTC_SetDate是设置RTC的日期函数。其声明如下:
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc,
RTC_DateTypeDef *sDate, uint32_t Format);
l 函数描述:
该函数用于设置RTC的日期,即设置日期寄存器RTC_DR的相关位的值
l 函数形参:
形参1是RTC_HandleTypeDef结构体类型指针变量,即RTC的句柄。
形参2是RTC_DateTypeDef结构体类型指针变量,定义如下:
typedef struct
{
  uint8_t WeekDay;   /* 星期 */
  uint8_t Month;     /* 月份 */
  uint8_t Date;      /* 日期 */
  uint8_t Year;      /* 年份 */
}RTC_DateTypeDef;
结构体一共四个成员变量,这四个成员变量分别对应星期、月份、日期和年份,对应的是RTC_DR寄存器。
形参3是uint32_t类型变量,用来设置输入的时间格式为BIN格式还是BCD格式,可选值为RTC_FORMAT_BIN或者RTC_FORMAT_BCD。
l 函数返回值:
HAL_StatusTypeDef枚举类型的值。
4. HAL_RTC_GetTime函数
HAL_RTC_GetTime是获取当前RTC时间函数。其声明如下:
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc,
RTC_TimeTypeDef *sTime, uint32_t Format);
l 函数描述:
该函数用于获取当前RTC时间,即读时间寄存器RTC_TR的相关位的值
l 函数形参:
形参1是RTC_HandleTypeDef结构体类型指针变量,即RTC的句柄。
形参2是RTC_TimeTypeDef结构体类型指针变量,对应的是RTC_TR寄存器。
形参3是uint32_t类型变量,用来设置获取的时间格式为BIN格式还是BCD格式,可选值为RTC_FORMAT_BIN或者RTC_FORMAT_BCD。
l 函数返回值:
HAL_StatusTypeDef枚举类型的值。
5. HAL_RTC_SetDate函数
HAL_RTC_SetDate是获取当前RTC日期函数。其声明如下:
HAL_StatusTypeDef HAL_RTC_SetDate (RTC_HandleTypeDef *hrtc,
RTC_DateTypeDef *sDate, uint32_t Format);
l 函数描述:
该函数用于获取当前RTC日期,即读时间寄存器RTC_DR的相关位的值
l 函数形参:
形参1是RTC_HandleTypeDef结构体类型指针变量,即RTC的句柄。
形参2是RTC_DateTypeDef结构体类型指针变量,对应的是RTC_DR寄存器。
形参3是uint32_t类型变量,用来设置获取的时间格式为BIN格式还是BCD格式,可选值为RTC_FORMAT_BIN或者RTC_FORMAT_BCD。
l 函数返回值:
HAL_StatusTypeDef枚举类型的值。
6. HAL_RTC_SetAlarm_IT函数
HAL_RTC_SetAlarm_IT是设置闹钟并开启闹钟中断的函数。其声明如下:
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc,
RTC_AlarmTypeDef *sAlarm, uint32_t Format);
l 函数描述:
该函数用于设置闹钟并开启闹钟中断。
l 函数形参:
形参1是RTC_HandleTypeDef结构体类型指针变量,即RTC的句柄。
形参2是RTC_AlarmTypeDef结构体类型指针变量。
形参3是uint32_t类型变量,用来设置获取的时间格式为BIN格式还是BCD格式,可选值为RTC_FORMAT_BIN或者RTC_FORMAT_BCD。
重点介绍RTC_AlarmTypeDef 结构体指针类型,结构体定义如下:
typedef struct
{
  RTC_TimeTypeDef AlarmTime;  
  uint32_t AlarmMask;      
  uint32_t AlarmSubSecondMask;
  uint32_t BinaryAutoClr;
  uint32_t AlarmDateWeekDaySel;
  uint8_t AlarmDateWeekDay;      
  uint32_t FlagAutoClr;      
  uint32_t Alarm;                          
}RTC_AlarmTypeDef;
AlarmTime用来设置闹钟时间,是RTC_TimeTypeDef结构体类型,该结构体前面我们已经讲解过各个成员变量含义。
AlarmMask用来设置闹钟时间掩码,也就是在我们第一个参数设置的时间中(包括后面参数RTC_AlarmDateWeekDay设置的星期几/哪一天),哪些是无关的。 比如我们设置闹钟时间为每天的101010秒,那么我们可以选择值RTC_AlarmMask_DateWeekDay,也就是我们不关心是星期几/每月哪一天。这里我们选择为RTC_AlarmMask_None,也就是精确匹配时间,所有的时分秒以及星期几/(或者每月哪一天)都要精确匹配。
AlarmSubSecondMask和AlarmMask作用类似,只不过该变量是用来设置亚秒的。
AlarmDateWeekDaySel用来选择是闹钟是按日期还是按星期。比如我们选择RTC_AlarmDateWeekDaySel_WeekDay那么闹钟就是按星期。如果我们选择RTC_AlarmDateWeekDaySel_Date那么闹钟就是按日期。这与后面第四个参数是有关联的,我们在后面第四个参数讲解。
AlarmDateWeekDay用来设置闹钟的日期或者星期几。比如我们第三个参数RTC_AlarmDateWeekDaySel设置了值为RTC_AlarmDateWeekDaySel_WeekDay,也就是按星期,那么参数RTC_AlarmDateWeekDay的取值范围就为星期一到星期天,也就是RTC_Weekday_Monday到RTC_Weekday_Sunday。如果第三个参数RTC_AlarmDateWeekDaySel设置值为RTC_AlarmDateWeekDaySel_Date,那么它的取值范围就为日期值,0~31
FlagAutoClr表示产生警告的原因。
Alarm用来设置是闹钟A还是闹钟B,这个很好理解。
l 函数返回值:
HAL_StatusTypeDef枚举类型的值。
RTC配置步骤
1)使能RTC时钟,并使能RTCRTC后备寄存器写访问
复位后,后备区域存在写保护,RTC属于后备区域,所以我们需要取消后备区域写保护。同时,我们需要使能RTC时钟,通过RCC_APB4ENR寄存器中的RTCAPBEN位设置。而取消后备区域写保护则是通过PWR_CR1寄存器中的DBP位去设置。HAL库设置方法为:
__HAL_RCC_RTC_CLK_ENABLE();  /* 使能RTC时钟 */
HAL_PWR_EnableBkUpAccess();  /* 取消备份区域写保护 */
2)开启外部低速振荡器LSE,选择RTC时钟,并使能
调用HAL_RCC_OscConfig函数配置开启LSE
调用HAL_RCCEx_PeriphCLKConfig函数选择RTC时钟源。
使能RTC函数为:__HAL_RCC_RTC_ENABLE。
3)初始化RTC,设置RTC的分频,以及配置RTC参数
HAL中,通过HAL_RTC_Init函数配置RTC分频系数,以及RTC的工作参数。
注意:该函数会调用:HAL_RTC_MspInit函数来完成对RTC的底层初始化,包括:RTC时钟使能、时钟源选择等
4)设置RTC的时间
调用HAL_RTC_SetTime函数设置RTC时间,该函数实际设置时间寄存器RTC_TR的相关位的值
5)设置RTC的日期
调用HAL_RTC_SetDate函数设置RTC的日期,该函数实际设置日期寄存器RTC_DR的相关位的值
6)获取RTC当前日期和时间
调用HAL_RTC_GetTime函数获取当前RTC时间,该函数实际读取RTC_TR寄存器,然后将值存放到相应的结构体中。
调用HAL_RTC_GetDate函数获取当前RTC日期,该函数实际读取RTC_DR寄存器,然后将值存放到相应的结构体中。
通过以上6个步骤,我们就完成了对RTC的配置,RTC即可正常工作,而且这些操作不是每次上电都必须执行的,可以视情况而定。当然,我们还可以唤醒中断、闹钟等,这些将在后面介绍。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|数码之家-技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2026-9-24 14:06 , Processed in 0.249601 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz!

© MyDigit.Net Since 2006

快速回复 返回顶部 返回列表