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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。3 P4 `" q4 s+ c% `9 c: A. t
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。% ~  L7 Q) P6 ?! q
void rtc_pre_config(void)
( H5 O/ |5 H* s3 f{
9 ?7 f8 t+ ?, a$ L9 B* |; B    /* enable access to RTC registers in backup domain */8 h6 ~/ X7 h* v
    rcu_periph_clock_enable(RCU_PMU);
" c: _3 t2 E! z, w6 Y2 {! r, K    pmu_backup_write_enable();
0 g0 f8 E5 V1 R. k+ s
! O$ s1 M1 [) c* i1 \5 g#if defined (RTC_CLOCK_SOURCE_IRC32K)
: U$ {3 }' G3 r4 K1 B    rcu_osci_on(RCU_IRC32K);1 g$ M' ]) {# L2 J
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
' d. ^4 g4 X% m6 m3 |    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
; N$ H) t7 j  j, X; g5 ~    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ% g! c+ n' U( ?( v! W0 Y
    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ* ^9 F2 \' @9 C. ]) Q
#elif defined (RTC_CLOCK_SOURCE_LXTAL)6 M3 `5 ~! ?5 l2 D
    rcu_osci_on(RCU_LXTAL);1 c5 X3 P6 o0 a4 S
    rcu_osci_stab_wait(RCU_LXTAL);
" K8 R1 v! A. j+ L; |% q    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);6 p: n8 z5 [* o% c9 H- E6 {( ?- g
    prescaler_s = 0xFF;
, O9 b7 e3 O2 E! W! d( @/ t    prescaler_a = 0x7F;
3 E# o: T& c- S/ M1 I; h    #else
# y# s& g/ M! H% e7 r    #error RTC clock source should be defined, _+ y4 p+ b4 \, Z4 U, \
#endif) w0 Y7 ^. H% ^: B6 w7 z
    rcu_periph_clock_enable(RCU_RTC);
) t5 H& v1 H: ]    rtc_register_sync_wait();2 t8 O' p# Q) N4 @) U
}
0 @& d7 W2 O5 m3 K+ i8 N0 y# z% v3 ~, O

0 O+ h7 d( E3 @. Mvoid rtc_setup(uint8_t *rtc_buf)
5 x* t, D1 x4 P8 P# ]7 k{; }8 _  J8 G1 e/ u
    /* setup RTC time value */% G. f5 E# B/ D) S6 G* Z6 a
    uint32_t tmp_hh = 0xFF;' f8 }3 i2 K: }1 [1 }7 E% `
    uint32_t tmp_mm = 0xFF;
0 A0 _9 O# N6 t5 s* C4 B    uint32_t tmp_ss = 0xFF;% h# E3 B1 X0 s9 N7 z* u  Q
    uint8_t year_data = 0;- l1 y- v4 F# R# I# l" ?9 q
    uint8_t date_data = 0;! Y* j3 S8 i* c/ n: L. l* S
    uint8_t alARM_date_data = 0;& \+ y% O- c1 x+ T$ S
, u7 Y- e! s$ F- t" S
    rtc_initpara.factor_asyn = prescaler_a;
- L! m0 j" h$ H4 ^    rtc_initpara.factor_syn = prescaler_s;
# e& t( R; }, Y( }3 e, u    year_data = HEXtoBCD(rtc_buf[6]);
+ z8 t& m0 j$ C# P2 ^    rtc_initpara.year = year_data;4 p8 L' \  \' J5 y

; [' J( X. A! ]    switch(rtc_buf[7])5 \: ?; P; s: k4 [/ _, L4 d$ o" H
    {
0 U' R5 V. i9 x* C9 W2 ~        case 0x01:4 P5 t# X+ p6 K4 w7 P
            rtc_initpara.month = RTC_JAN;
; e8 J$ G  Z. Q, Q/ Y" z            break;0 a6 I& l5 w. Y* Z: |- q
        case 0x02:  o) @1 `; N$ J  V
            rtc_initpara.month = RTC_FEB;6 B( B. |& Y. z
            break;
1 p" r1 ]% E3 B        case 0x03:% [. ?  y& P1 j9 z3 |+ G9 n
            rtc_initpara.month = RTC_MAR;+ N6 ^0 D+ x; a7 l
            break;
  c5 l6 p+ J5 g1 @. X6 U/ E6 Y        case 0x04:
' W1 S5 R5 K# C  w$ x, r' }, s            rtc_initpara.month = RTC_APR;- P/ T' ^3 |/ n$ R4 C  n
            break;) c$ d& S+ t" W. l
        case 0x05:
- Q  m6 F) q. C. Q! Z; ^            rtc_initpara.month = RTC_MAY;
* t7 d9 w; _5 d5 K* T3 D5 D4 a3 z  Q. ?            break;
: i( _& S/ s# J        case 0x06:& S. N7 q+ y& p8 G
            rtc_initpara.month = RTC_JUN;
2 O: ?! d. x! d- d            break;% L$ e( `2 ?/ |; N9 L1 e9 A
        case 0x07:- h! ]% I( Q) A' ?9 d- {1 C- Q$ q
            rtc_initpara.month = RTC_JUL;- ?6 M: H# w1 D; q# s5 ?
            break;
& k- s0 e  P1 T4 S        case 0x08:
, d7 M7 W$ `7 {3 p) S6 \0 Z. ?' l, a            rtc_initpara.month = RTC_AUG;
! g1 x, |8 b1 y, H. {4 n            break;
$ B) o( H/ e6 u* }* i        case 0x09:. f6 m3 m! r  n1 [9 X1 g
            rtc_initpara.month = RTC_SEP;* u; X8 c8 J+ p0 q4 Y
            break;' A8 L6 V1 u8 R' x% o' j
        case 0x0A:+ |! \: k1 X; J3 `' K( X! ^
            rtc_initpara.month = RTC_OCT;
* r5 g: u' w( Y" n, s* `3 j% c6 q            break;
( m1 O  ~3 x) }9 d  _5 I9 W        case 0x0B:) c/ I1 J. b* M5 B0 E
            rtc_initpara.month = RTC_NOV;& |% b* v+ l2 [8 ~2 l+ y9 C
            break;
2 ]; s7 `' I, _8 Y        case 0x0C:
* t6 d% {2 Q. P, q: A; z) y" g            rtc_initpara.month = RTC_DEC;
- D6 X3 B, {) J/ N0 \& g, {2 k0 a% ]            break;: |% A/ q  T/ j7 u% S. N0 I; n
        default:$ k5 ^% S% `! h# {: {
            break;
0 S0 y# P) G  p# \    }/ D; _7 _1 @6 ~/ [+ Y5 @7 u/ n
    date_data = HEXtoBCD(rtc_buf[8]);8 P. ^* t8 O, u& G4 ~+ K
    rtc_initpara.date = date_data;
) W$ E# f( W) R* p  g6 I    switch(rtc_buf[9])
) ]" a- D+ z1 r' T4 f$ ^  ]# b2 s' O$ y    {( d- N! V& o+ J7 c
        case 0x01:% R* _/ Z. Q. b" U- `9 o
            rtc_initpara.day_of_week = RTC_MONDAY;
2 F$ v2 `- @, d) r; y8 G5 [0 e' r1 v            break;& r6 `$ @8 E. t" h9 z# j3 B
        case 0x02:
/ _2 T/ ^8 {4 ~# P            rtc_initpara.day_of_week = RTC_TUESDAY;
6 z) M2 V$ x% Z8 Y$ {            break;: b3 _: z5 _% [1 r+ C( p& T9 H: p2 F
        case 0x03:* D; g8 ]* {. b& ^: p8 r
            rtc_initpara.day_of_week = RTC_WEDSDAY;
5 h# a$ Z  c4 |4 A( e2 v            break;
" q% [6 v2 ~: J* I* |# `        case 0x04:7 y* L' }3 G& I2 J* N& B
            rtc_initpara.day_of_week = RTC_THURSDAY;
8 M) o2 F$ v) i* h$ R" y            break;
5 J% }6 I8 T: a; [! p; J        case 0x05:9 D7 I6 n- @1 s" ~) Z- m4 @! |7 E
            rtc_initpara.day_of_week = RTC_FRIDAY;7 d  l$ [  _4 y  A+ e5 {$ N
            break;7 j! `5 _- H/ ], ^3 v
        case 0x06:: f% B* M# }# f- ~+ z- J5 I
            rtc_initpara.day_of_week = RTC_SATURDAY;) `7 H( _7 G% r6 v
            break;8 h: @: D5 z; q- |
        case 0x07:
2 s  z3 h3 g" J            rtc_initpara.day_of_week = RTC_SUNDAY;2 s: b' L: K' Z& i3 G9 D/ a% u
            break;
& v( W# s; B3 D" Z* D: S        default:
; ^8 h! M6 i  q& \2 }            break;
- n& [/ @8 j; \7 U8 E. m    }
( q3 h" F5 y( o    if(rtc_buf[10] == 0x00)
; n3 L. V% r1 d: ~    {' J- B3 u* b) h' v  E) J  ~) j
        rtc_initpara.display_format = RTC_12HOUR;
" `+ _+ A4 g" [* r$ v) a    }% |. y/ d7 }6 p+ {8 I
    else if(rtc_buf[10] == 0x01)- F" V- t5 O  r& c
    {
) |9 H/ h1 I! O6 l& X        rtc_initpara.display_format = RTC_24HOUR;; Q# H  Z- N6 l+ t
    }
" e( w( H7 q, f    if(rtc_buf[11] == 0x00)
# u9 ^! s# a) b9 N    {: A8 b& S" n* G' E& v
        rtc_initpara.am_pm = RTC_AM;
0 a: m7 N( N' o! O    }) {; o( j: U, ~1 u0 N% O6 f3 G
    else if(rtc_buf[11] == 0x01)7 b( L" B7 ^: G( C  R
    {
" E) b: W4 x+ R' d& w( v2 a( C/ D        rtc_initpara.am_pm = RTC_PM;
1 a7 z. I* n+ N" t    }
7 ?5 m: F) b% Z3 R, `' d$ S5 l    /* 输入当前时间 */: W) p3 Y7 A* h# b& ]( S  ?3 Q
    while(tmp_hh == 0xFF)
9 M& `! ^9 m9 u# d    {
4 Q2 {/ T0 X7 r        if(rtc_initpara.display_format == RTC_24HOUR)
2 j# W; a6 p- O+ I" A2 U- v% z; s% u        {
3 U/ |8 }8 T# I8 R2 y7 L9 d            tmp_hh = usart_input_threshold(rtc_buf[12], 23);
. N' y! ?- h7 [$ r0 i% G  L        }
; F7 q: s- M. q        else, {/ k5 C; d7 {* R/ D2 U
        {# R+ k: F+ I  G$ X+ k
            tmp_hh = usart_input_threshold(rtc_buf[12], 12);
0 w; ]+ p" \" S/ I' }        }7 t2 z9 O$ P& `/ ]7 f4 a) e
        rtc_initpara.hour = tmp_hh;1 N0 s! n# a( E! u- {' m; [
    }
: S( \; g/ A, e: e' E5 H8 \' c6 m) Q, _! D7 J: T! n# r- r! X
    while(tmp_mm == 0xFF)$ Z, b% t: t: D0 C0 ]/ |7 U
    {
& S% R$ ^- X/ ]  U5 I0 t7 u3 w        tmp_mm = usart_input_threshold(rtc_buf[13], 59);7 b, f! Q5 U5 E; U6 {, G
        rtc_initpara.minute = tmp_mm;: G% n9 P% g% K% `9 E( {
    }. }' E& ~9 R# c$ p1 q; Y& P% K
    while(tmp_ss == 0xFF)2 g' R3 O! j' r  _% L. r
    {
. B; F8 ~) K6 o        tmp_ss = usart_input_threshold(rtc_buf[14], 59);2 c/ z% v4 W  J  v- J. j" o
        rtc_initpara.second = tmp_ss;- G+ @: \7 m, W& K8 h, J
    }
+ m, f. X4 L6 I2 |8 y
! U9 E1 q: W! ]. G8 u8 D    /* RTC current time configuration */
2 n7 d7 q, V- `. B9 l8 ?. }    if(ERROR == rtc_init(&rtc_initpara))
+ r* T( i/ M$ w0 w    {; U; L; {8 g& m# T' k
        printf("\r\n** RTC time configuration failed! **\r\n");9 f3 q9 M& g4 A$ C, c
    }
" c* ]' R* u. _, s' ]6 ~1 w% k    else
' k7 E% `) b( ^& ~( K    {" T& h! {! f( m
        printf("\r\n** RTC time configuration success! **\r\n");
, g$ Y0 p! h: K' e8 `  d0 _    }
* Q$ @* @3 V1 i( m4 m9 ]* ]) A) N6 C  t! \
    /* setup RTC alarm */
. V& B% P: w& o) V2 s7 l: ^    tmp_hh = 0xFF;
9 Z5 U. \5 X( F' V& z9 c    tmp_mm = 0xFF;. C, O( r: p$ S; E* l
    tmp_ss = 0xFF;
) h9 {8 p) W- U2 w+ ^
6 g# k6 w/ J( e- X$ \    rtc_alarm_disable(RTC_ALARM0);9 x  h& P+ h( ^, _1 {
    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
$ O& ^/ z( f. I7 V    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;, G7 k0 ~/ G+ O1 c& E
    alarm_date_data = HEXtoBCD(rtc_buf[15]);
3 F9 z: N% ^# V9 R) n: R    rtc_alarm.alarm_day = alarm_date_data;* y+ `! m& o* k+ Y1 i2 u. e
    if(rtc_buf[16] == 0x00)
8 p7 x  _4 Q/ O' z    {
2 z5 |2 W3 f, D: z( C  s        rtc_alarm.am_pm = RTC_AM;
0 `+ x/ u! J! w- z    }
- I! g* n/ |& [" x/ Y/ P    else if(rtc_buf[16] == 0x01)) ]+ l4 n1 Y% r6 ?5 m" x' U
    {( k! j8 A5 Q. C7 K) h, |
        rtc_alarm.am_pm = RTC_PM;
: X& D1 p( Q2 C, O% b; K    }+ f. c7 X! G, ]3 g  ?
    /* RTC alarm input */  _& g% l6 G1 E4 a" x( V
    while(tmp_hh == 0xFF)) {1 k: k, ~0 V2 n: E; x5 d
    {
4 m+ m5 `- e/ r+ r9 V* g( B        if(rtc_initpara.display_format == RTC_24HOUR)
' n9 ?# I. w; B- ?4 x        {
, i5 d6 _. i$ E! ?: ]            tmp_hh = usart_input_threshold(rtc_buf[17], 23);
' j, }% G. H& w7 n% _        }2 h9 w; t. W1 ]6 Y6 J
        else
$ |' j8 `% P+ y# A8 l6 m7 c# P        {
( h+ H' e7 g* c1 z" n/ M1 v3 Q            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
: w  w+ N3 ~2 _+ ]3 m1 K        }+ `4 M9 A9 t1 C4 L
        rtc_alarm.alarm_hour = tmp_hh;9 N3 Q% ^$ X/ e" \1 J$ e& x# h2 z
    }
% C4 w9 Z; a% v8 T2 g7 S8 N; N) y, q6 |# W' @
    while(tmp_mm == 0xFF)
) }: L( }! P) T: |    {7 w4 e3 `, Z- y$ Z2 h! u
        tmp_mm = usart_input_threshold(rtc_buf[18], 59);. q! Z- x" J; _5 \0 `. i
        rtc_alarm.alarm_minute = tmp_mm;( H+ r$ b- W+ P- s! Q
    }
- T6 @) z* E3 u: m( m$ G4 X  {    while(tmp_ss == 0xFF)# ]$ T+ z# x* R1 o7 E5 }" r; D  X
    {
* I; v- }/ v% a" u4 x        tmp_ss = usart_input_threshold(rtc_buf[19], 59);4 m1 y$ M# g# I# {! F
        rtc_alarm.alarm_second = tmp_ss;
* N4 _/ \  `3 x    }
  |( D7 a/ R) |% d( P6 k& s# `. c! Z# S8 E: u) ?  ~1 s
    rtc_flag_clear(RTC_STAT_ALRM0F);
, k  C$ Y+ @: b9 `0 a" m& Z* O    exti_flag_clear(EXTI_17);
  ?$ D7 y( l' C. ^7 [" r. Y* O
6 m7 Y0 A7 P) e9 J8 f# y" _    /* RTC alarm configuration */, A; k1 |  X+ G
    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
% c( d2 r* _: I6 b" h    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
/ c5 X6 W0 s( R% r; T' o4 s    rtc_alarm_enable(RTC_ALARM0);+ d+ {) z/ b/ D  G) {5 r

7 V$ d- D3 k% r7 M2 W& C    /* RTC alarm interrupt configuration */
" \: ?8 r. h: b8 i! f) N    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
9 Z: w9 ^/ Y0 c5 h    rtc_interrupt_enable(RTC_INT_ALARM0);& M1 D" k8 `/ P! x# Z+ B: S
}6 I3 w% Z3 ]* C* C0 e5 S

* F; z+ Y0 P$ B- \0 J( x6 A5 ]uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
7 j' y. k: U+ q/ p4 ^{
+ z0 t- C3 E4 T0 s0 Z    uint32_t index = 0;
& |: T9 R  _$ j  m    uint32_t bcd_data = 0;
( h: Z( }3 }2 T; o" t% h; u' _0 S; v) t$ ?% Q
    bcd_data = HEXtoBCD(buffer);# V/ r0 P$ b- U$ S" D
    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
# X/ o, F0 m8 X4 @4 o0 ^    if (index > value)
, x0 h: b; v/ S5 g% J4 _    {8 E& }6 y1 I9 w5 U# K# T
        printf("\r\n please input a valid number between 0 and %d \r\n", value);
. t9 s( ^* N/ m6 x/ k8 G        return 0xFF;5 t- B( `# J& r  o: p6 L
    }
* g+ P1 N9 x6 o5 W1 G    return bcd_data;
; f2 B  ]& v* H1 @  T" A/ g1 p}
3 o" n. F0 y# Y6 V3 H) b0 i
# J; W, G- [2 h* o6 m
% Q% }( j  }8 P, Uunsigned int HEXtoBCD(unsigned char hex_data)/ J& X) N$ S7 G7 T$ h
{4 Y+ `  q+ A' S
    unsigned int bcd_data = 0;
) ~4 C+ t. D# s    unsigned char temp = 0;( a: D0 ?, m4 v( _- M' [+ T! W

, J' j9 A& d5 K6 T. n* l    temp = hex_data % 100;1 L- `0 o# ?) P- E# E) j  n& n
    bcd_data = ((unsigned int)hex_data) / 100 << 8;
" j: p4 B9 R* J1 T5 |. E  f    bcd_data = bcd_data | ((temp / 10) << 4);9 h( [8 V$ J, D7 N2 K0 r
    bcd_data = bcd_data | (temp % 10);
) I7 \2 V' \1 v! B    return bcd_data;8 [( b: w5 f) f6 _/ [% k
}  v" ]8 O2 F  V: g$ r; A. \* U+ \
void RTC_Alarm_IRQHandler(void)
; i( b5 i* c) w) K{% h' G8 G& z, {9 L/ D
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
1 h$ H8 Y0 A9 f' F8 I% I' l# u2 s; g+ e5 D( T) R5 Y$ R
    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
; g9 X8 P1 H, j) i, s9 }3 M    {- M$ z  \2 q+ y
        rtc_flag_clear(RTC_STAT_ALRM0F);
6 p) O- u' y! `        exti_flag_clear(EXTI_17);+ ]. l( C: r) o* ^1 t
        rtc_alarm_disable(RTC_ALARM0);- l9 R! R& O7 g9 e+ x7 I. f* A
        led_toggle(LED1);
6 o. ^% h$ g2 r- W$ ^5 {& m9 P    }
9 x& T9 q6 u% G}" g6 ~0 p( C% k, S1 R

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);
! _5 g- x& q0 P) i, G" \) v9 U6 j& Q
注意这句算法;( ?, {& u1 P0 p3 Y
保证:1.  每次叫醒后,本标志被清零;
; _: U; ?0 c; s8 W! X         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;
! E2 D0 E: z) {# X1 G& p# H如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 05:50 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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