打印
[应用相关]

HAL库开发教程(五)—RTC使用

[复制链接]
1542|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、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进行相关配置

使用特权

评论回复
5
梅花香自123|  楼主 | 2021-9-28 21:34 | 只看该作者
2.配置RTC模式
主要对RTC的各个模式进行选择,包括使能日历,闹钟和唤醒中断等。这里选择配置图中三处

使用特权

评论回复
6
梅花香自123|  楼主 | 2021-9-28 21:35 | 只看该作者
3.配置RTC参数
主要对RTC的各个参数进行配置,包括:时间,日期,预分频设置,周期性唤醒的频率和计数值。这里配置如图所示。

使用特权

评论回复
7
梅花香自123|  楼主 | 2021-9-28 21:36 | 只看该作者
4.配置NVIC中断优先级
主要对唤醒中断和闹钟中断的NVIC优先级进行配置

使用特权

评论回复
8
梅花香自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)

使用特权

评论回复
9
梅花香自123|  楼主 | 2021-9-28 21:40 | 只看该作者
2.相关代码
1.日历更新
日历更新程序如下(示例):
RTC_Time.Hours = 1;
RTC_Time.Minutes = 2;
RTC_Time.Seconds = 3;
RTC_Time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
RTC_Time.StoreOperation = RTC_STOREOPERATION_RESET;
HAL_RTC_SetTime(&hrtc, &RTC_Time, RTC_FORMAT_BIN);
               
RTC_Date.WeekDay = 4;
RTC_Date.Month = 5;
RTC_Date.Date = 6;
RTC_Date.Year = 7;       
HAL_RTC_SetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);

使用特权

评论回复
10
梅花香自123|  楼主 | 2021-9-28 21:41 | 只看该作者
2.日历获取
日历获取程序如下(示例):
HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
printf("Time:%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
printf("Date:20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);

使用特权

评论回复
11
梅花香自123|  楼主 | 2021-9-28 21:41 | 只看该作者
总结
本项目中RTC的使用主要可以归纳为:
1.日历的获取
2.日历的更新
3.周期性唤醒中断的使用
在正确配置好CubeMX后,通过对主要功能函数的使用实现对RTC的灵活使用。

使用特权

评论回复
12
heimaojingzhang| | 2021-10-12 15:19 | 只看该作者
一直想自己做个日历呢

使用特权

评论回复
13
keaibukelian| | 2021-10-12 15:22 | 只看该作者
可以进行网络上的时间校准吗

使用特权

评论回复
14
labasi| | 2021-10-12 15:25 | 只看该作者
精度高不高 误差主要来自于哪里

使用特权

评论回复
15
paotangsan| | 2021-10-12 15:26 | 只看该作者
主要就是日历上边用是吗

使用特权

评论回复
16
renzheshengui| | 2021-10-12 15:26 | 只看该作者
它的主要时钟来源是什么呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

1035

帖子

0

粉丝