找回密码
 注册
关于网站域名变更的通知
查看: 503|回复: 3
打印 上一主题 下一主题

GD32F4系列,RTC闹钟如何设置成每天固定时间起作用?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-10-13 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。1 e3 K3 J$ R* y
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
" M. J  w* R  _+ qvoid rtc_pre_config(void)+ |& V% C. D3 {' V5 K
{
6 t  w" ?; O+ |9 b! y! a" q    /* enable access to RTC registers in backup domain */# u5 z9 l  o  l: ~
    rcu_periph_clock_enable(RCU_PMU);
" o, ?- b" g* B9 [    pmu_backup_write_enable();
$ C& J: ^: R6 m) D/ z
$ {3 j( H6 X6 ]$ W. u; z#if defined (RTC_CLOCK_SOURCE_IRC32K)
& }& t: a8 c7 [, ], L( v( k3 v1 d    rcu_osci_on(RCU_IRC32K);8 @. e/ w( {; W7 j
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
- k% d. k) K; w7 o$ s- c  |    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);$ p/ p3 e; s6 V, m$ R, n) y7 C
    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
& {, D  ^" a7 ~; h    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
$ G# d9 I4 L1 t#elif defined (RTC_CLOCK_SOURCE_LXTAL)
" c* D6 ~4 X; y0 w    rcu_osci_on(RCU_LXTAL);* l  ^# V3 t6 D6 j) c2 ]1 v6 i2 D6 Q
    rcu_osci_stab_wait(RCU_LXTAL);4 Y; O' d+ z/ i" Y8 I; M
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);& T9 `0 n! F6 j) G7 i' p( G% V
    prescaler_s = 0xFF;+ \; L  l" `6 O  b# S
    prescaler_a = 0x7F;
& x3 c) c, z, N# k+ T/ D    #else( z! T; a/ z0 @: S9 Q' G
    #error RTC clock source should be defined
2 r& r, ]* f! l+ [& V9 p#endif
6 t# q2 l7 G6 g- ]/ w+ K    rcu_periph_clock_enable(RCU_RTC);7 f; k  x) v# |7 L
    rtc_register_sync_wait();
6 g8 V7 u* J5 Q3 G+ n0 [}
: m1 c" H6 |7 X4 O0 K8 V2 {0 u
2 k0 o& E$ S; y( u7 A6 [
% w1 [1 n6 s3 w5 d6 V$ M* kvoid rtc_setup(uint8_t *rtc_buf)
8 F7 v! f4 X- [2 d/ d; w- o{- v0 l% A5 O3 W3 J4 O
    /* setup RTC time value */4 [; u( k; @  {7 J* F7 U3 L
    uint32_t tmp_hh = 0xFF;
. m1 I7 P: Q0 t5 o+ ]    uint32_t tmp_mm = 0xFF;
5 \1 v/ ?) m" F- l    uint32_t tmp_ss = 0xFF;
* k0 y+ [3 D+ N    uint8_t year_data = 0;% ?. |! J% B' Q- k
    uint8_t date_data = 0;4 O* V: `9 S/ s+ y4 k4 ~# h
    uint8_t alARM_date_data = 0;
: G3 k. d, e+ q/ a9 [" U* v  Y1 @( w
    rtc_initpara.factor_asyn = prescaler_a;2 J2 Z& r* D* |0 Z9 U/ A8 F
    rtc_initpara.factor_syn = prescaler_s;
+ i" b- h" H+ Q. {% F/ ]    year_data = HEXtoBCD(rtc_buf[6]);
2 E" z1 ]( f4 G3 B( I9 G% e    rtc_initpara.year = year_data;
) z7 @3 a' u! b& M# i8 M
# m" g$ g! Q" i' a    switch(rtc_buf[7])
0 k; N! U. w, `- C    {, l! I$ k9 ^# a& L: N8 N% H
        case 0x01:: H: p) P2 b; i7 l
            rtc_initpara.month = RTC_JAN;
( x2 {+ \$ N3 [& D  @9 \9 \            break;' a/ S& Q( W* F6 J& w# B
        case 0x02:7 S9 T% p0 E) z+ L% A3 h
            rtc_initpara.month = RTC_FEB;( W1 ]* y* L4 u' q* T
            break;! G5 A+ A7 S, a& C0 s& E
        case 0x03:0 n5 V* H. @' V% R- F% x( `( L( f
            rtc_initpara.month = RTC_MAR;  H# A# B( M5 D' U5 v8 x9 n
            break;- N! x- l. o+ D
        case 0x04:
+ x& S% \! w3 T0 C2 x3 `            rtc_initpara.month = RTC_APR;
: ?; s* D! z* s/ }            break;
% r9 Z! ?/ U+ f/ U, `. R+ y# e8 ]! D        case 0x05:
  o; b9 K( \3 D3 {" V0 \8 M            rtc_initpara.month = RTC_MAY;
1 s- t7 R3 Q8 `            break;, O4 v& Z7 R; @
        case 0x06:9 f* V7 C: v5 W8 {. d
            rtc_initpara.month = RTC_JUN;3 F- ~$ ]8 h1 Z' W& G) Y$ W" G
            break;
7 M8 c# c: C  g1 w        case 0x07:
4 d- ^- w  l% U7 n$ s3 K# l            rtc_initpara.month = RTC_JUL;
% `( V0 h; i* r            break;
0 l4 N" D, V8 F5 i4 e# C' ^        case 0x08:) f3 ~5 y' g: z8 i. ?
            rtc_initpara.month = RTC_AUG;
1 v" a7 j3 C' N            break;
, d. l* Q, L- S+ C* y& b( x  K% j9 M        case 0x09:
, B0 K! p2 A; ]5 I) ~            rtc_initpara.month = RTC_SEP;
9 V% ]6 D6 q* ~( [0 T  f& s. L5 k9 K            break;
. ~. ?: [, m3 w. A2 A9 I        case 0x0A:
0 R: _5 c$ E$ @! [            rtc_initpara.month = RTC_OCT;
; Z; m6 l1 |1 J8 A& d+ w' x7 K            break;
1 w7 m* R* ]" U5 X9 P4 P        case 0x0B:( Y4 L1 A6 c5 l' S/ t9 p& R
            rtc_initpara.month = RTC_NOV;) e3 S7 d, X' P
            break;3 B1 U7 {3 y0 j  s! D# i3 o! B6 `0 g' X
        case 0x0C:1 d+ S/ a# b/ \6 h/ P  Y. ]  T
            rtc_initpara.month = RTC_DEC;% [, @! I6 z  z
            break;4 f) n( {4 z1 _" v6 ]6 i: X: \" S
        default:- y" r1 t) m( U" ^+ V/ T
            break;
( [, d9 V! n4 k# |    }
  D5 w  p, c3 g  Q5 C0 c    date_data = HEXtoBCD(rtc_buf[8]);" U9 t+ e; z# P
    rtc_initpara.date = date_data;) S% T" m3 H0 ]. R
    switch(rtc_buf[9]); M$ C# C" Y' p7 ]+ Y. z
    {3 i& z2 e) n- \9 ?
        case 0x01:
0 T* J# c6 a+ ?8 @  [# ?; [) J+ {            rtc_initpara.day_of_week = RTC_MONDAY;
0 ^+ _  }* O! ]+ B# _            break;7 v6 a. x4 i5 q8 y$ r6 S
        case 0x02:
8 Y/ g  b$ f+ }3 s3 l            rtc_initpara.day_of_week = RTC_TUESDAY;& p$ ~7 z" d& w9 a8 O* \
            break;
  b; M8 n3 S$ d; u* ]+ i) x9 M) A        case 0x03:, T" `& `; S7 P2 h/ b! t7 H+ }
            rtc_initpara.day_of_week = RTC_WEDSDAY;3 e+ I% t  W3 @2 _
            break;% N$ u; I; t9 c9 }$ ~
        case 0x04:; h& S& f& F% n* u0 m' Z
            rtc_initpara.day_of_week = RTC_THURSDAY;
0 w1 {' C; p& {0 G+ L: g            break;4 G" U* y0 v; u( C, G( g8 m3 Z
        case 0x05:
  X& A) Z. n' ]+ f7 z& d- M            rtc_initpara.day_of_week = RTC_FRIDAY;
% Q" j+ |" i8 F( B6 `* X. a            break;5 D9 l) [! E; f) q( Q% W. [
        case 0x06:; \& S; P# W; P- ?# u( R
            rtc_initpara.day_of_week = RTC_SATURDAY;' d$ X! O* z2 b- |2 A, r
            break;
! f/ x2 L9 ~# ~4 L        case 0x07:: l% a/ v4 g$ v' u9 Z2 M$ Z- g3 Y$ j
            rtc_initpara.day_of_week = RTC_SUNDAY;
: g; j! R- W) e            break;
1 Y5 U  e* R& k! B) A) @9 c' t& s        default:9 H+ j6 g( u* ]1 y6 E, K
            break;& E$ U" ]. A( A% @9 ]7 x- i
    }/ l5 b# y; c. Y$ q! W% H* `
    if(rtc_buf[10] == 0x00)
7 b; x, C7 X3 x    {8 p2 R; J  j/ ]  Y: S# J8 ?1 ~8 O$ d
        rtc_initpara.display_format = RTC_12HOUR;2 c% g; z8 i4 J! _, }6 v$ f
    }
- @! o, `* A# z4 L5 h& N( S+ u, _! e    else if(rtc_buf[10] == 0x01)
7 n: k5 h8 p5 @6 i: ?    {
1 W& o" a" w5 R        rtc_initpara.display_format = RTC_24HOUR;
3 x* T; w; T+ Z! _) U    }
2 G1 n2 y' B- w$ e    if(rtc_buf[11] == 0x00): v" M: a0 o, D( r, l# w
    {
2 S, s: q/ b0 o; [  C; l' ]' I: t        rtc_initpara.am_pm = RTC_AM;
: `" ^/ m2 W7 J( E/ ?    }
7 |, m0 A! B% p% Q/ h  d    else if(rtc_buf[11] == 0x01)
3 C9 V- }5 r; o. m+ e4 N9 _4 o+ _9 a    {
: p$ f! v+ @! z; w9 j  e7 }* h% y        rtc_initpara.am_pm = RTC_PM;% `$ Z4 X& |+ m9 z1 A
    }3 _$ s; _1 K+ C# C8 X
    /* 输入当前时间 */
- G) b9 A4 G0 U1 h. D7 l    while(tmp_hh == 0xFF)+ c9 W5 S2 o2 b! M$ q. S
    {- N0 b: S( T6 N4 J: Q: C* K
        if(rtc_initpara.display_format == RTC_24HOUR)( Y: u; X0 V4 C; s+ A
        {. F7 ^+ p" E& R0 f
            tmp_hh = usart_input_threshold(rtc_buf[12], 23);3 w9 O/ ^; P1 Z6 s$ ?
        }( M6 u9 v# B" m9 m4 }& ~' E
        else
+ a# ^/ ~7 U2 K        {- }6 d4 j; N1 X
            tmp_hh = usart_input_threshold(rtc_buf[12], 12);$ l6 ?! s; f* X8 R
        }
' N$ G3 G' p6 |  G        rtc_initpara.hour = tmp_hh;6 I# q! @2 {! }0 X% o) b$ z' Z
    }1 ~+ J0 C- t) `) p

9 ]* ?1 j2 j5 D2 T5 |9 f! [! M. q    while(tmp_mm == 0xFF)
/ [) `. S5 ]* i  S    {6 Q. m) F$ V! X+ J
        tmp_mm = usart_input_threshold(rtc_buf[13], 59);
' f" c  b& Y/ L8 w  I: Z/ z2 w6 q. i, y9 G        rtc_initpara.minute = tmp_mm;/ y: s1 y# T7 s" x/ o
    }! W! Y$ |3 X+ ?7 Y
    while(tmp_ss == 0xFF)- @. A1 N0 P5 L, u3 k9 k; I
    {
! X. W) L' x4 V        tmp_ss = usart_input_threshold(rtc_buf[14], 59);
6 Y% h! |5 p* P        rtc_initpara.second = tmp_ss;- r( w- T3 z% w  [  a5 k
    }
( w* y5 h1 O" ?' k2 y0 |7 g" ^+ k" M, v
    /* RTC current time configuration */
& \8 s: D% V  {7 j    if(ERROR == rtc_init(&rtc_initpara))1 I* A8 M5 W/ k0 X& \( H( B
    {$ I! f6 ?% o/ v: j. L! F
        printf("\r\n** RTC time configuration failed! **\r\n");
6 Q( |: j# }7 e0 y# R/ ~  C, o    }
1 j; Y6 f1 V. w8 N: q    else
$ c% r9 F6 M: {' X$ r4 |- V    {
* k. P. {$ T5 w  Z        printf("\r\n** RTC time configuration success! **\r\n");
" o  g: I- u+ D# q  ^    }; g, h* Z& S" N, M$ p8 F

" q3 V- {  Z( |4 {5 j8 t( P; M    /* setup RTC alarm */4 D$ o% e- c+ ^+ i$ d+ H+ z4 t
    tmp_hh = 0xFF;" G4 q, u3 }4 k7 b! D7 ^' F
    tmp_mm = 0xFF;' m2 l' \" Z3 n& ^
    tmp_ss = 0xFF;% s) C+ {) J4 e7 j4 Q) F' h! U( h
1 i" ^5 h7 k" m; _
    rtc_alarm_disable(RTC_ALARM0);
, {& v  E4 q' {- S/ P: e* [    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
% \0 U7 l6 c! l0 X    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
" _/ O. m) c6 g! E* B6 Z    alarm_date_data = HEXtoBCD(rtc_buf[15]);' c8 L8 @( t' f. a% `6 X
    rtc_alarm.alarm_day = alarm_date_data;
& A' T9 Y% B* M, Q  C$ @# }    if(rtc_buf[16] == 0x00)
0 l3 v! k6 U" u7 e$ @5 k5 A0 V; d    {  {9 S. |9 g' K, F" x
        rtc_alarm.am_pm = RTC_AM;# `! g- {) y  z* s7 V- P, R
    }
" E% a- U( T: l1 y% A7 w! c( W; M    else if(rtc_buf[16] == 0x01)
! P5 `$ g( ^- S3 K9 s( C; R$ e: b' i    {
+ d" O) k$ a' h0 b2 ^        rtc_alarm.am_pm = RTC_PM;
2 @# b% |! o5 X    }1 ~% T% y& H& J8 r- i7 A
    /* RTC alarm input */
. r/ s( n& \  X8 ~* K, q    while(tmp_hh == 0xFF)% v& G6 [' O0 ?( n# U+ ?3 r
    {
0 n4 Y5 \; f  n8 x9 J# ^6 q        if(rtc_initpara.display_format == RTC_24HOUR)
0 T3 U8 f4 c& t6 \& D        {
1 l6 o- g' S0 {3 Y- Q9 w: Y) ^6 p            tmp_hh = usart_input_threshold(rtc_buf[17], 23);5 H. T- }6 b% h' X! z' E, d, f5 g
        }& L! P1 m5 Y9 M* Q
        else
2 d" x& q0 Q0 c        {
' f4 Z- V& ]: x! z* d2 {" h$ g            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
7 Q& o+ p$ G  x7 x' E. I        }8 B: p8 x5 D0 y5 G0 N$ b
        rtc_alarm.alarm_hour = tmp_hh;9 P$ b* `* u) d1 j
    }
4 c  u# d1 ?& v3 L1 G* d
8 A6 p. f& Q) i: _+ J9 @8 ]3 o0 \    while(tmp_mm == 0xFF)
. E. ~  p1 O$ t( y    {
4 Z6 |$ A! ^" m6 Q        tmp_mm = usart_input_threshold(rtc_buf[18], 59);
  h% o( i+ }1 E        rtc_alarm.alarm_minute = tmp_mm;
, U  j4 x' l  @    }) o6 Z% W6 g5 {' R4 O! {7 s
    while(tmp_ss == 0xFF)
4 Z* r! }. i8 ~# M' o    {: @8 ^2 }3 d& l0 @
        tmp_ss = usart_input_threshold(rtc_buf[19], 59);) ~8 X% Q! F; \' o2 ^7 I4 K3 M
        rtc_alarm.alarm_second = tmp_ss;  I7 R* H/ ?. y% o5 ]
    }
% w, I/ H2 j9 K
  d! B% B# U$ t( z& H    rtc_flag_clear(RTC_STAT_ALRM0F);
! I6 j+ q5 p. X# |, |! F! _    exti_flag_clear(EXTI_17);
6 [- x6 h: Z! v1 t$ b8 ?& ]% G( X9 j  O9 j& d8 Y
    /* RTC alarm configuration */; x- u# W7 i: g8 b
    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
, V4 @" @6 N+ u/ I4 c    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
3 r/ ?: F5 M" }% N% e  M/ R7 k* _* i    rtc_alarm_enable(RTC_ALARM0);
! p, P$ J. [' ^# {9 P$ a4 G  z+ z5 A) Z4 c' F  t
    /* RTC alarm interrupt configuration */
* _6 F' w1 X: ~* L    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
4 R+ f2 m5 {& O" d) l" O    rtc_interrupt_enable(RTC_INT_ALARM0);
( k4 s7 h: U; ?}
6 F/ t+ @* D) \# {5 P
- X* @7 ~& J& q0 Z3 I  G) H7 Puint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
! N4 t3 I3 M6 {1 [7 C. k1 q# A0 \{
: |$ t8 b# G3 M, Q    uint32_t index = 0;
: e7 u' r" o' Z4 j8 K1 h$ J+ w    uint32_t bcd_data = 0;
7 b' _, J2 C$ E2 G- }. \# V# @, g$ Q8 S) ?: V( d; J5 Z  n+ |$ q
    bcd_data = HEXtoBCD(buffer);
% O/ |! }) _1 E4 J- w% v    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);4 n3 h# D& j% l: E3 U( m% Y
    if (index > value)7 Q9 f3 f$ E9 ^. a
    {& w% d" m7 ~! L  l& {7 Q. E
        printf("\r\n please input a valid number between 0 and %d \r\n", value);
- _! |% K) W; `- q7 L        return 0xFF;
1 A3 S7 k" L* B. j    }
' m. P  M: G) _" |' Z9 _    return bcd_data;
) [7 ^0 N9 |# m- R  f: \5 t9 [' A}, V/ l% A( L0 q. `

" |; F; J; a' M8 W% s* q& T8 g' ~$ t! l
unsigned int HEXtoBCD(unsigned char hex_data)! q8 k: S& H1 [1 V4 O3 d
{* f7 F9 Z2 \; @6 X- a. u& T' C
    unsigned int bcd_data = 0;
9 l  @" h( k# b7 t% o; N    unsigned char temp = 0;
& X- v% e% z" o8 I- c/ L% z
0 R8 l9 ]6 h0 C, h# s4 c, c5 t    temp = hex_data % 100;
. p* G' Z, w# h. D7 k& }% l    bcd_data = ((unsigned int)hex_data) / 100 << 8;/ e" B: s; \+ |* ~, @9 W
    bcd_data = bcd_data | ((temp / 10) << 4);
- d7 w) X) x7 _: B0 n6 T    bcd_data = bcd_data | (temp % 10);) n: y) `- R, ~+ y
    return bcd_data;7 N' K4 B2 G7 m' V/ a: Q
}2 e8 M) t7 j0 v; V
void RTC_Alarm_IRQHandler(void)
) g6 @8 \& r& H% s% s{* f! ~  v% J- l: m$ r& Z
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;! B6 \3 B/ w# p) @4 a5 O' w
( F$ o7 C# o$ R) ~+ r
    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))7 }2 K! r" S6 ~5 N% |3 d! m1 |, ?
    {
' ?0 d. `. W, e# R  K3 V7 f        rtc_flag_clear(RTC_STAT_ALRM0F);4 M6 u8 C7 G# R7 n& j  }  ]
        exti_flag_clear(EXTI_17);  d$ f+ l  g0 h* |' B+ E3 l  S
        rtc_alarm_disable(RTC_ALARM0);/ B" ~) n: b. @
        led_toggle(LED1);& U$ _5 U, n/ A5 x4 C: D7 ?7 b
    }
$ a: Q5 i7 u7 }5 W9 ^' f}
2 I% \+ O: V# \  S9 Z' O

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);: C7 L# X1 f9 ]% W

3 v  q. Y; M8 R; d2 T& P  m. i注意这句算法;2 b* U  u  }. F/ ^3 b
保证:1.  每次叫醒后,本标志被清零;/ V5 G* W5 V, i% e7 O
         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;2 s/ J3 {7 V7 F7 Q' p
如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

4#
发表于 2022-10-13 14:12 | 只看该作者
用函数 rtc_current_time_get(&amp;rtc_initpara);可以获取当前时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-4 11:10 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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