关于STM32F4的RTC疑问

发表在 RTC2019-11-16 11:00 [复制链接] 7 196

本帖最后由 kuailedeluojie 于 2019-11-16 11:32 编辑
+ }! j% Q! P! I3 }
/*******************************************************************************
2 U$ j2 E: x* u4 X$ L* Function Name  : RTC_Configuration
5 {9 A0 z& N2 x4 b6 o% x% A. O* Description    : Configures the RTC.% L/ H9 u1 P& \+ w/ j& \
* Input          : None
+ K7 n/ `! g) y* Output         : None
% h: }# l6 W: @1 r9 e' I4 l* Return         : 0 reday,-1 error.
( k6 |# Z9 n& t7 l' K* I*******************************************************************************/
# B2 q! C6 C  Qint RTC_Configuration(void); t* x3 m7 o+ F; V# p# |! I
{
% e# y6 Z. F$ m2 D        RTC_InitTypeDef RTC_InitStructure;
) p* s2 a$ l1 x1 C' J+ o        /* Enable the PWR clock */
8 V2 S1 G9 }6 Y3 f- ]        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
* t- a5 |4 L. _  \% W7 Y* G& v9 L" x$ A9 D  e
        /* Allow access to RTC */' Z- }4 c" ^* R* e/ u
        PWR_BackupAccessCmd(ENABLE);
, l0 m) r# H8 v$ J7 R: Z" a8 j- a! W4 y) @3 S
#if defined (RTC_CLOCK_SOURCE_LSI)  /* LSI used as RTC source clock*/5 v' K. I8 J- |* _* Q. `( X
        /* The RTC Clock may varies due to LSI frequency dispersion */   
" }4 |) k1 d$ S8 d        /* Enable the LSI OSC */
" G( o5 V4 l5 R$ q        RCC_LSICmd(ENABLE);+ T$ k* F7 G; |4 i: b9 k! o

8 M8 _) |# p/ `% C7 E0 ^        /* Wait till LSI is ready */  5 K  T+ b/ I2 X5 F+ P
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)- W6 _( e& P% E3 {- R
        {, G1 \" x5 _3 V$ K% o" L
        }
+ @' E. S* [! p* A% e4 r
) H" o: B! x: J+ ^% }& H        /* Select the RTC Clock Source */
/ l% P0 f2 b9 N( i        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);; U5 {$ w" H6 ^5 r* p8 t- W
1 \3 H' f$ N3 M; X! E2 ?: @4 _- D! s
        /* ck_spre(1Hz) = RTCCLK(LSI) /(uwAsynchPrediv + 1)*(uwSynchPrediv + 1)*/
% b: X# `7 n4 C7 v/ [0 ^+ j. d$ }        //uwSynchPrediv = 0xFF;
0 h6 i7 U( x4 l  T        //uwAsynchPrediv = 0x7F;- H2 J/ K; G" r+ S! J" l6 ]
) {; @4 N- C; _' @1 A7 T8 H
#elif defined (RTC_CLOCK_SOURCE_LSE) /* LSE used as RTC source clock */# x5 `9 e/ C9 [  I) {( D
        /* Enable the LSE OSC */
/ T& _5 N2 Y9 W! {4 W2 k        RCC_LSEConfig(RCC_LSE_ON);
4 D1 `7 b4 i) h1 [: t# e' ~0 x# J5 p) @. X4 j' `' @
        /* Wait till LSE is ready */  
0 f4 n! \- g6 u) X0 P: K        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)7 U' H( O2 W0 @5 V% S! ]* t
        {  N9 ]3 @1 H9 o8 V! g0 r4 e1 }
        }' [, \: K6 d+ `8 N
        /* Select the RTC Clock Source */
/ v5 ^3 s2 |% T0 o  @        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);2 @6 r' w0 D. {. J) i# F
! t% P7 S1 l/ k5 U* N! _. z
#else
( p% J! R- w. `# [0 D  D5 z#error Please select the RTC Clock source inside the main.c file7 ^# K- q! V  D) O
#endif /* RTC_CLOCK_SOURCE_LSI */
1 [. t9 _* F2 v0 ]1 J5 J. _! E# j6 Z5 P
        /* Enable the RTC Clock */5 W$ l7 N, D# p; z5 l5 F
        RCC_RTCCLKCmd(ENABLE);
; C# p7 K) ^7 r8 y: |
( z( A6 j; v$ p% u0 }& P& |) w: M' Z        /* Wait for RTC APB registers synchronisation */( L7 u2 e. J: A+ d& S# }  O; }
        RTC_WaitForSynchro();
: M2 I5 `* |1 |7 y9 m4 p& g# }
z这是RTC的配置代码,用的是RTC_CLOCK_SOURCE_LSE,之前能正常运行的,设置了一次之后,重启一下,就获取不了正常时间了。, S# |, R) d3 d$ |5 q/ q) O4 U
void RTC_TimeAndDate_Set(void)+ w6 v8 ~; z0 |- H
{
# t% T* \! b7 E. d7 J        RTC_TimeTypeDef RTC_TimeStructure;7 L- E; W# }8 r5 q5 M3 O
        RTC_DateTypeDef RTC_DateStructure;
/ [- x; c( e$ n3 V5 t        
) M2 ]  `6 G3 x& `        // 初始化时间4 F! X% j% @3 Z" a4 }& _
        RTC_TimeStructure.RTC_H12 = RTC_H12_AMorPM;
5 h6 W4 Y9 p% g' q  Q9 S) D* `3 m  f        RTC_TimeStructure.RTC_Hours = HOURS;        
. M  |2 h* Y1 E( }6 s7 T        RTC_TimeStructure.RTC_Minutes = MINUTES;      
& P- j3 |. E- M; G; A( Y& @3 I        RTC_TimeStructure.RTC_Seconds = SECONDS;      0 A# h5 G, \5 A3 \
        RTC_SetTime(RTC_Format_BINorBCD, &RTC_TimeStructure);6 P$ W: S+ m( m" E% B: }) q
        RTC_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA);& F  n5 t: W" z2 {/ i' q
        
. _* N6 o3 `, ^' D3 Y( O+ O  // 初始化日期        
' g4 Y1 |9 N4 N        RTC_DateStructure.RTC_WeekDay = WEEKDAY;      
2 X' E3 a$ H" {0 ^, u; A. E9 f        RTC_DateStructure.RTC_Date = DATE;         ! i; j6 K5 r7 r, x* }7 K
        RTC_DateStructure.RTC_Month = MONTH;         
6 L- z, _* G3 }; U        RTC_DateStructure.RTC_Year = YEAR;        
. F. ^( u" k" Y, n& M        RTC_SetDate(RTC_Format_BINorBCD, &RTC_DateStructure);9 p5 p! j* g3 j1 e0 R
        RTC_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA);( I9 P- @+ j5 Q, y9 h/ h) r
}

9 e& Z' T1 V4 K以上是时间设置函数, [' o) @1 _6 U3 J
void show_time(void)) _, M7 I/ |" v$ q$ P& b# [4 }7 m6 B
{
9 c" ^- O: y3 R) Y# j/ W; k        RTC_TimeTypeDef        t;* X3 F/ x# [$ S3 e% r$ }! Z
        RTC_DateTypeDef        d;7 A8 A2 b$ P- G7 s7 n
        /* Get the current Date */
/ S4 V* R! b$ H3 z+ m0 ]7 B& z        RTC_GetDate(RTC_Format_BIN,&d);% p7 {: p7 G# z6 a  M+ K" _
        /* Get the current Time */+ l' g  v! H8 C% G! L" k( U
        RTC_GetTime(RTC_Format_BIN, &t);
$ t7 ~0 u! j: t% W9 b        /* Display time Format : hh:mm:ss */7 u" b5 E1 j8 r7 T
        rt_kprintf("Now Time = 20%02d %02d %02d[%02d]-%0.2d:%0.2d:%0.2d \r\n", \# i, W2 _6 \- P2 K0 \9 F
                d.RTC_Year,d.RTC_Month,d.RTC_Date,d.RTC_WeekDay,t.RTC_Hours, t.RTC_Minutes, t.RTC_Seconds);' z3 }% q* X# o) {  P
}

4 {& `! R0 n. \0 B1 D这是获取时间函数) C2 U2 }& H* k2 R1 [3 Y5 \2 h
以下是RTC配置相关函数) ]) [8 l# i4 l0 v! t9 K7 m7 G  d
void rt_hw_rtc_init(void)$ `7 h! f: j  x2 [5 d/ f
{
3 `: D$ j9 w& m' I" B. l, |6 b    rtc.type        = RT_Device_Class_RTC;, p2 T- z9 o; V* t! ^

" s% x& e5 `! S( e9 B% _    if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)* m, \/ @2 E; ]4 a) }( X0 k" A' E
    {
8 \0 u+ X& M+ ~& N3 ?; P        rt_kprintf("rtc is not configured\n");
0 f; G% s6 y* {        rt_kprintf("please configure with set_date and set_time\n");/ S5 I! [* r/ Y3 l+ e
        if ( RTC_Configuration() != 0)# H1 o  r# |. C5 t. e" j! i- K2 }7 Z' n
        {5 \$ z' H0 H/ q" r# m
            rt_kprintf("rtc configure fail...\r\n");8 a1 x- }1 s/ M# S
            return ;1 K5 O" S! m: ]4 T  `; t9 W; _9 g
        }4 P1 F1 j" u  x
    }: |8 j1 H) b- z6 _
    else+ S2 v  z! x) p+ Z6 J7 r8 v6 V
    {7 j6 L: ^9 X( ^- e; ^0 ]
        /* Wait for RTC registers synchronization */
3 [, N( u9 y$ v! }4 h        RTC_WaitForSynchro();! O% I( V' H5 k/ ~
    }5 |, f$ E9 ^; H0 E

9 _6 u+ H6 ^4 ^- @5 g; F( O) c    /* register rtc device */
/ l/ \4 m2 e1 _9 h5 |& u/ Q, s4 [    rtc.init         = RT_NULL;$ {5 C  w2 y. H" \; X' C7 i
    rtc.open         = rt_rtc_open;0 J0 V* \- x4 v5 `- i, p. c- W
    rtc.close        = RT_NULL;
5 G' M7 X! T0 K    rtc.read         = rt_rtc_read;
6 h; h9 Y3 D+ k) q9 P/ i    rtc.write        = RT_NULL;
) k6 |) l& \( f" L; L    rtc.control = rt_rtc_control;
; q5 R& R, i" l& G- r8 d& ~
& t, m  {/ ~% |) V6 l    /* no private */
0 D  r: o, @2 }2 q" p) f    rtc.user_data = RT_NULL;
8 q- i8 R. j- J3 c8 H7 O' j) c% m) C' Q1 U) Y) H
    rt_device_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR);+ t6 P3 s  w% N
                 show_time();
1 V5 j, j# f+ b; V3 r    return;
3 n2 Z; d% |4 R$ q5 x$ r}
1 o% `: d4 [" w& s
每次都打印一样的结果,请大神指点一下5 H. Q& ^& J" T
Now Time = 2000 01 01[01]-00:00:00
% P3 I4 @  P/ {/ ~7 M
. U. {$ r3 ~5 E- P/ P& b0 ~! w. g
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-11-16 11:22:27 来自手机 | 显示全部楼层
本帖最后由 aozima 于 2019-11-16 11:28 编辑
3 p6 x/ t; U0 }' r. l  Z
3 G7 R( C8 J& C# M+ @2 CRTC的32K晶振起振了没?
使用道具 举报 回复
发表于 2019-11-16 11:23:40 来自手机 | 显示全部楼层
本帖最后由 aozima 于 2019-11-16 11:29 编辑 6 c8 R9 r) V% p9 {5 P& z

* s8 j% \. f. H# ]: D5 t1 |9 E+ R5 I楼主从来不管乱码的吗?别人会认真看?
使用道具 举报 回复
发表于 2019-11-16 11:28:27 | 显示全部楼层
aozima 发表于 2019-11-16 11:22
, g0 k  l$ A$ p1 H& P6 R9 Y) F; CRTC要32K晶振起振了没?
: A2 @: i# l& c' ?' |
我看一下
使用道具 举报 回复
发表于 2019-11-16 11:28:52 | 显示全部楼层
本帖最后由 kuailedeluojie 于 2019-11-16 11:33 编辑 1 y$ \, F# J% u# S/ J
aozima 发表于 2019-11-16 11:23
4 h2 L9 B7 H: k/ i楼主重来不管乱码的吗?别人会认真看?
( _" q0 W. D" [* W! l
乱码的改好了
使用道具 举报 回复
发表于 2019-11-16 11:30:49 | 显示全部楼层
kuailedeluojie 发表于 2019-11-16 11:28
, f. N) C% U" x5 ^5 F5 t" P5 O我看一下
* K; A) a' X( c6 Z  }
晶振是起来了的
使用道具 举报 回复
发表于 2019-11-16 11:56:24 | 显示全部楼层

) f  X# s! a0 n3 w# e! S/ m实在不行,您要不用cubeMX 自行设置 RTC,生成 RTC 代码试试。
9 y# Y5 I+ ^. O) b2 H" Q! q8 \参考这篇文章
0 q  G& ?+ E# B3 z( H4 E% t% SSTM32Cube 学习之十二:RTC
使用道具 举报 回复
发表于 2019-11-16 12:02:09 | 显示全部楼层
MikeCai 发表于 2019-11-16 11:56, w  ^* H" W: B+ e
实在不行,您要不用cubeMX 自行设置 RTC,生成 RTC 代码试试。
( M6 N3 F# U8 a参考这篇文章
8 l. j. q5 A( U; C' X1 |; NSTM32Cube 学习之十二:RTC ...
2 \3 x, d( e: V2 w% }! B) F# x
晚点吧,先把这个问题解决啊
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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