[应用相关] HAL库开发教程(五)—RTC使用

[复制链接]
 楼主| 梅花香自123 发表于 2021-9-28 21:31 | 显示全部楼层 |阅读模式
一、RTC简介
STM32F2的实时时钟(RTC)是一个独立的BCD(Binary Coded Decimal)定时器/计时器,提供了一个包括时间与日期的时钟/日历功能,两个闹钟中断,一个定期唤醒中断,并且包括一个自动唤醒单位管理的低功耗模式。

 楼主| 梅花香自123 发表于 2021-9-28 21:32 | 显示全部楼层
1.时钟与分频
STM32F2的RTC(RTCCLK)时钟源头可以从LES时钟、LSI时钟以及HSE时钟中进行选择,一般我们选择LSE外部低速时钟,即32.768Khz外部晶振作为时钟源。并且通过配置异步预分频器和同步预分频器设置1Hz的时钟核心。
 楼主| 梅花香自123 发表于 2021-9-28 21:32 | 显示全部楼层
2.开发步骤
1.STM32CubeMX中配置:时钟+RTC模式+RTC参数
2.Keil中对RTC时间和日期进行设置和获取
3.编写中断服务函数
 楼主| 梅花香自123 发表于 2021-9-28 21:33 | 显示全部楼层
二、STM32CbueMX配置
1.选取RTC进行配置
在STM32CubeMX首页找到并选择RTC进行相关配置
720016153199b57bc5.png
 楼主| 梅花香自123 发表于 2021-9-28 21:34 | 显示全部楼层
2.配置RTC模式
主要对RTC的各个模式进行选择,包括使能日历,闹钟和唤醒中断等。这里选择配置图中三处
57032615319c95ff70.png
 楼主| 梅花香自123 发表于 2021-9-28 21:35 | 显示全部楼层
3.配置RTC参数
主要对RTC的各个参数进行配置,包括:时间,日期,预分频设置,周期性唤醒的频率和计数值。这里配置如图所示。
95019615319fa4f9f6.png
 楼主| 梅花香自123 发表于 2021-9-28 21:36 | 显示全部楼层
4.配置NVIC中断优先级
主要对唤醒中断和闹钟中断的NVIC优先级进行配置
9639761531a6b1fb68.png
 楼主| 梅花香自123 发表于 2021-9-28 21:38 | 显示全部楼层
三、Keil程序开发
1.主要功能函数
设置日历参数
HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
获取日历参数
HAL_RTC_SetTime(&hrtc, &RTC_Time, RTC_FORMAT_BIN);
HAL_RTC_SetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);

其中,第一个参数为RTC结构体,第二个参数为Time和Date结构体,第三个参数可设置为:RTC_FORMAT_BIN或RTC_FORMAT_BCD

周期性唤醒中断
void RTC_WKUP_IRQHandler(void)
 楼主| 梅花香自123 发表于 2021-9-28 21:40 | 显示全部楼层
2.相关代码
1.日历更新
日历更新程序如下(示例):
  1. RTC_Time.Hours = 1;
  2. RTC_Time.Minutes = 2;
  3. RTC_Time.Seconds = 3;
  4. RTC_Time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  5. RTC_Time.StoreOperation = RTC_STOREOPERATION_RESET;
  6. HAL_RTC_SetTime(&hrtc, &RTC_Time, RTC_FORMAT_BIN);
  7.                
  8. RTC_Date.WeekDay = 4;
  9. RTC_Date.Month = 5;
  10. RTC_Date.Date = 6;
  11. RTC_Date.Year = 7;       
  12. HAL_RTC_SetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);
复制代码
 楼主| 梅花香自123 发表于 2021-9-28 21:41 | 显示全部楼层
2.日历获取
日历获取程序如下(示例):
  1. HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
  2. printf("Time:%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
  3. HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
  4. printf("Date:20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
复制代码
 楼主| 梅花香自123 发表于 2021-9-28 21:41 | 显示全部楼层
总结
本项目中RTC的使用主要可以归纳为:
1.日历的获取
2.日历的更新
3.周期性唤醒中断的使用
在正确配置好CubeMX后,通过对主要功能函数的使用实现对RTC的灵活使用。
heimaojingzhang 发表于 2021-10-12 15:19 | 显示全部楼层
一直想自己做个日历呢
keaibukelian 发表于 2021-10-12 15:22 | 显示全部楼层
可以进行网络上的时间校准吗
labasi 发表于 2021-10-12 15:25 | 显示全部楼层
精度高不高 误差主要来自于哪里
paotangsan 发表于 2021-10-12 15:26 | 显示全部楼层
主要就是日历上边用是吗
renzheshengui 发表于 2021-10-12 15:26 | 显示全部楼层
它的主要时钟来源是什么呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1215

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部