STM32CubeMX-实时时钟(RTC)
4 e( x( l* L" F( }$ f, P; t9 c
; ?5 u: [" z9 ?' }, IRTC简介( ^% {% X! f3 f- q2 N
实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。RTC 还包含具有中断功能的周期性可编程唤醒标志。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。只要芯片的备用电源一直供电,RTC上的时间会一直走。/ L2 ^# A* D: K+ ]) @+ ]' ^
新建工程& u% P# E8 o0 |& B o
本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。点击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。RTC选择内部唤醒(Internal WakeUp)开启RTC。开启外部低速晶振,PC14,PC15配置。( O4 g1 o/ L2 T- W2 Q
/ `& B" `" o" f, ?7 m' x
RTC时钟选择为外部低速晶振(LSE),频率为32.768。
! q' P) U" s h; k( _2 C' h# w; ~ 在RTC配置中,设置时间和日期,其他为默认设置。此处设置时间为2016/04/16 16:25:49。
5 P; w, D- ]8 K/ i1 d
2 Y/ t3 T( F2 |! {( }, W
生成报告以及代码,编译程序。
3 C$ w, S) j2 Q! K6 a添加应用程序
; G% m7 O; O, n" r1 y) G N- h 在rtc.c文件中可以看到ADC初始化函数。在stm32f7xx_hal_rtc.h头文件中可以看到rtc时间和日期读写操作函数。
5 i) O. d" a" w
, {) l: H1 w9 b h2 m
从操作函数中可以看到,时间和日期是以结构体的形式读写的。所以在main.c文件前面申明两个结构体变量存储读取的时间和日期数据。* u) k0 y* A% I" |
4 P z, P3 X4 P9 A
- 2 |9 x: h, z$ O/ e2 P
- <font size="3">/* USER CODE BEGIN PV */
+ u# m6 a/ r) j$ R' S& ] - /* Private variables --------*/
6 ^ ]" ~4 B: |( ^" N - RTC_DateTypeDef sdatestructure;
* C; Z* J3 K; \% a2 h, F - RTC_TimeTypeDef stimestructure;
1 T- G# m- \; j0 k7 \ - /* USER CODE END PV */</font>
复制代码 3 s; A5 t5 b0 G: k6 I
# i- J7 { ~! U! [8 X5 k在stm32f7xx_hal_rtc.h头文件中,可以找到RTC_TimeTypeDef,RTC_DateTypeDef这两个结构体的成员变量。5 k$ l N! @! d; N6 _$ q0 f! J/ k
. t1 p7 S# [) E/ P6 F& r# Z5 O2 g
在while循环中添加应用程序,读取当前的时间和日期,并通过串口发送到电脑上显示。
$ N- @2 Z+ p, Q3 Q- " E2 T' @; n* f% q, o
- <font size="3">/* USER CODE BEGIN WHILE */
. e; J0 D6 a6 o( k - while (1)
. \4 }% _, `- E/ ]$ h - {
7 G: e# H: g, D$ L& e$ | - /* USER CODE END WHILE */
9 r: H" {: I3 p1 d4 O2 w - /* USER CODE BEGIN 3 *// \1 v- P" Y$ [0 W: l
- /* Get the RTC current Time ,must get time first*/8 K. C* n( I, o. Z0 l* i
- HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN);
, w. q; m% [ c% y5 I - /* Get the RTC current Date */& r! K7 s" c1 M! i0 r
- HAL_RTC_GetDate(&hrtc, &sdatestructure, RTC_FORMAT_BIN);, _& H3 `3 h+ J+ j7 x4 T6 o" M
- /* Display date Format : yy/mm/dd */: e {' e w; u$ `1 |$ B; i5 H
- printf("%02d/%02d/%02d\r\n",2000 + sdatestructure.Year, sdatestructure.Month, sdatestructure.Date);; W9 l6 M! j6 w; R5 s5 M* }2 m
- /* Display time Format : hh:mm:ss */: I& n0 R( y* G
- printf("%02d:%02d:%02d\r\n",stimestructure.Hours, stimestructure.Minutes, stimestructure.Seconds);: P8 p/ J* D y1 e3 ]4 \
- printf("\r\n");2 t6 \1 {; U( o% [' ?/ g
- HAL_Delay(1000);
7 U r+ b/ F4 P! ?$ _- s - }& |! a; T/ Z- a1 a# s8 P6 o
- /* USER CODE END 3 */</font>
复制代码 ( H# I8 n# T6 Y u% J1 f/ ^* S5 y2 Z
7 Z1 Z6 I& C. G6 }9 \7 o' q
程序中使用HAL_RTC_GetTime(),HAL_RTC_GetDate()读取时间和日期,并保存到结构体变量中,然后通过串口输出读取的时间和日期。注意:要先读取时间再读取日期,如果先读取日期在读取时间会导致读取的时间不准确,一直都是原来设置的时间。# v& K+ Q. i; F0 S4 U1 H7 F
编译程序并下载到开发板。打开串口调试助手。设置波特率为115200。串口助手上会显示RTC的时间日期。
* U6 n( l1 Y, J$ b5 X4 ^3 @0 X' F" W& o3 h$ c7 ~( A# v3 G. g
- F2 F# y0 |0 }7 q. g( L" T, {
% s5 z# q/ s8 X, U
5 c, d H6 @. X- I
3 j+ S% i. f c* M5 P$ d
|) a# |/ J0 x+ f
( v6 ^7 k) ~' L$ z8 R+ p8 |' Z# |& e# [/ }% s
! r. y" w6 z; e. c7 `# _
/ c9 B3 \( K- c7 P
; @* ? Y5 z1 g$ i- r9 G8 h3 b O/ v6 s! L# ]* w2 A( t2 Y
+ T- I+ g, x/ O |