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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。
# j. R8 g9 t* e/ U$ a以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
1 t! Y8 U' n, O3 P2 n: x6 D3 @4 j) ]+ Ovoid rtc_pre_config(void)
7 M6 _$ d4 d. j{- i! K% w" z, Q7 K
    /* enable access to RTC registers in backup domain */) a: l* l( \3 [- z( J
    rcu_periph_clock_enable(RCU_PMU);# ?, h8 G; V: o, x& m1 p. ^
    pmu_backup_write_enable();
1 z( O8 ~' t9 d) I5 P% i( Z* c( [" I( r5 Q% ?
#if defined (RTC_CLOCK_SOURCE_IRC32K). Z# G9 y& H$ S! e6 ]" P
    rcu_osci_on(RCU_IRC32K);' W, W7 w$ c# \0 n( |( f$ H
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
+ {, O8 A! d7 @1 \    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);8 n; h9 n, d$ _: ?% K  x% M; i) F0 N
    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
: h# e/ }& G% m7 Q    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
# R  }, J) |7 n% @8 x) X#elif defined (RTC_CLOCK_SOURCE_LXTAL)' J3 x$ ~6 j$ T+ C6 b  [$ R
    rcu_osci_on(RCU_LXTAL);
5 @3 S0 I7 G- X2 t, [9 [    rcu_osci_stab_wait(RCU_LXTAL);
% A# l- S/ X. V    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);0 r8 n# h( c% r" a+ S: a* c" {
    prescaler_s = 0xFF;
0 P$ e7 }3 z( P    prescaler_a = 0x7F;
8 E0 C! P0 \; W; C. l    #else
9 I2 \! Q. y. a$ c. {9 a    #error RTC clock source should be defined. j( a2 r, ?9 C9 K
#endif
- V: j* c1 i4 t4 Y    rcu_periph_clock_enable(RCU_RTC);4 I) ]9 R  z" Y, b  Y
    rtc_register_sync_wait();
, z0 E  q# E/ Q1 @}$ B4 s; G  g. \2 q$ T! J; S

' i$ s5 V" @$ T4 S# C; K- N6 R- {8 M  f  J0 K1 }( n( ]
void rtc_setup(uint8_t *rtc_buf)
0 _! Q) p; Y0 c+ }) q{
" s7 Z$ X' S! I' V- @    /* setup RTC time value *// x8 C9 I/ F5 S
    uint32_t tmp_hh = 0xFF;
! ?7 S% _% w. Q( y9 ^2 N    uint32_t tmp_mm = 0xFF;$ x( E" A2 x0 \( w% o, f
    uint32_t tmp_ss = 0xFF;1 I0 B& J3 k& b3 M
    uint8_t year_data = 0;
& N  N: _  B; T! y    uint8_t date_data = 0;
# u$ q  f# y$ ^! d' c) N3 N5 l' W    uint8_t alARM_date_data = 0;
) @( U- }6 ]3 V3 }
& f. \9 x8 r* j$ d# L    rtc_initpara.factor_asyn = prescaler_a;( h+ X7 K' ~& J' f# i9 ~$ J
    rtc_initpara.factor_syn = prescaler_s;
  I1 M% {6 [: J    year_data = HEXtoBCD(rtc_buf[6]);) n! {4 X" P, D) }6 Q: p9 o
    rtc_initpara.year = year_data;
7 r) p5 N$ {0 d, Y% v
/ D9 r/ d; U! e8 N7 {    switch(rtc_buf[7])7 W! V5 t$ E0 J. `- N. i( Z5 u- o7 }
    {0 h3 X5 ~& E2 ^3 V' b& I
        case 0x01:* z: t$ }8 ?& ^0 \# b% q( Y
            rtc_initpara.month = RTC_JAN;
& }0 D8 b& t+ A            break;) }( t% j; l& {% S- J5 t* q
        case 0x02:
: x# I  L' V+ V3 A            rtc_initpara.month = RTC_FEB;& N9 y2 `% K! K. ~  ]6 [7 o# i$ y$ t1 H
            break;7 Q) X5 O% V- F9 k7 B
        case 0x03:
  |. K& P  q7 s1 H            rtc_initpara.month = RTC_MAR;
* @$ W" ^  U6 T" }7 r. K* p/ Z. L            break;
; i$ ]- D, ?- y- G/ B2 Q; @$ Q        case 0x04:
) p& v- n* C9 c            rtc_initpara.month = RTC_APR;
! b" v. H3 x! D            break;
2 O" t# K5 h0 ?; f        case 0x05:' x5 \8 `1 \$ b2 A4 X# p, _
            rtc_initpara.month = RTC_MAY;' B: m1 ~5 Y7 y. D
            break;0 i" Q7 p- I' m1 \7 \
        case 0x06:; ?, Z) \  \$ }& Q
            rtc_initpara.month = RTC_JUN;
# G. _) D" }9 T  z, \            break;
# _7 V% y; d1 X! W" y3 I+ |  D) t$ b        case 0x07:
0 J) n7 W" x3 m            rtc_initpara.month = RTC_JUL;
# s9 i' h0 N: q1 X* @            break;2 G* u1 V" @  A$ s
        case 0x08:
) v3 s# Z* R) R8 m1 R* a# \            rtc_initpara.month = RTC_AUG;" d% Y* F' R" s
            break;
1 l* g( ^+ Z7 [* I        case 0x09:
0 j  F+ A' z7 f* _            rtc_initpara.month = RTC_SEP;
# k, W* w0 \  W+ e            break;; `1 B/ d3 l% k0 ^1 \
        case 0x0A:9 |) R( J$ ^1 x# I# H- \8 M/ i: \
            rtc_initpara.month = RTC_OCT;
3 G+ k. K! Q' K# I            break;7 z* f- x$ s1 Q- b
        case 0x0B:
$ n( P# H* t0 l            rtc_initpara.month = RTC_NOV;
, [6 }1 O( e; j, ?            break;
- g6 p% y0 b3 i. P% d% B& |  v7 J0 o        case 0x0C:8 X5 T, k8 ?  ?5 L$ u8 v. [  o
            rtc_initpara.month = RTC_DEC;
5 B* l* R" J1 _6 n8 F            break;9 t" ^% d1 `) z" i- h: W
        default:
! Y4 w# i- D  y9 E            break;
% n  N5 G) e5 I    }
, Y1 P! Q- C2 M3 [$ j3 H    date_data = HEXtoBCD(rtc_buf[8]);5 Q" L' \( h3 ~3 l$ z! S
    rtc_initpara.date = date_data;2 G( Z/ b+ ]& w0 [% Q
    switch(rtc_buf[9])+ u6 k4 p1 P( I  E3 d2 |; y; C$ p6 n
    {
) ~( y) A+ @& J; `( j5 b        case 0x01:
! J8 k8 t' M: c; N- c            rtc_initpara.day_of_week = RTC_MONDAY;  l4 ^+ U0 U% o! Q1 Q
            break;2 z3 ]: k; d5 X
        case 0x02:
$ q6 w# |+ m/ B; H& {            rtc_initpara.day_of_week = RTC_TUESDAY;
( k% C+ U5 }5 e: p/ g8 k: m            break;4 }, K' u# R8 R) T: h  O
        case 0x03:* P4 q6 o7 {7 R: n. ^9 m
            rtc_initpara.day_of_week = RTC_WEDSDAY;% }# p) U: _/ n  I( |6 I4 A
            break;
" A' b8 ]: i: z, w. U9 e& {: |        case 0x04:
; \. R, e9 }1 z' p) h: E            rtc_initpara.day_of_week = RTC_THURSDAY;
1 P6 A$ E, p* D7 X" x            break;
4 `9 ?: I" s5 g; t        case 0x05:# F8 |6 z, I+ ]+ K4 K$ `# U! n; w* @6 b
            rtc_initpara.day_of_week = RTC_FRIDAY;
" J0 z) C: X: @/ [, f4 m            break;
* J1 W' b" z- U, B$ \# l4 N3 Z        case 0x06:
6 C  y0 n  S6 X( _, ?            rtc_initpara.day_of_week = RTC_SATURDAY;
" b- C9 {8 F0 |2 Z2 r8 q/ f3 o; ^: k            break;
: Z2 A. m; m5 A( e# x        case 0x07:; l& E9 Q. M7 M8 a2 |% j% A, p1 I
            rtc_initpara.day_of_week = RTC_SUNDAY;
! ~. W7 P2 v3 i* S4 C            break;
" t- v8 |" `* {: R- h' x& B        default:. `+ W* |+ ~8 R
            break;
- p7 p9 N3 T% Q1 l2 N# X! R    }
: W( [. P, y- \/ Y. r6 h  P: h1 t3 g    if(rtc_buf[10] == 0x00)
% z: x. C, U: Q6 x    {
# T; h& y( U0 _, ?* v) l        rtc_initpara.display_format = RTC_12HOUR;. K5 `$ r! J7 E+ J
    }
/ X, }) N8 x+ G4 x! A+ X    else if(rtc_buf[10] == 0x01)" y3 N0 z* w. ~& ?9 v4 ~+ b
    {
! i+ S1 w% V* c4 _3 ~        rtc_initpara.display_format = RTC_24HOUR;
$ {! t  u' w5 {8 C4 Q    }' O+ r  I4 t: C2 U# {. w& h2 o# X: N
    if(rtc_buf[11] == 0x00)
2 k9 D( H9 s4 C9 i9 I; B    {
6 l) b8 M  V& }  t! {. o! T        rtc_initpara.am_pm = RTC_AM;
  t. w: j& i% E1 g2 a5 b  g    }
# L  k3 P, k' I6 V- ^    else if(rtc_buf[11] == 0x01)1 p9 c4 {% V( }& F7 q6 z1 b  U
    {* H' j$ y; f2 s* n" J5 y
        rtc_initpara.am_pm = RTC_PM;; k5 K) c6 q7 b" T
    }3 I0 b* d7 j8 d* l' |+ _
    /* 输入当前时间 */' b  J4 j8 a. k/ t: Q; o5 M
    while(tmp_hh == 0xFF)
2 ^2 X* O" C; z( g: N4 C    {* `$ K4 w/ q& S( U3 J
        if(rtc_initpara.display_format == RTC_24HOUR)
5 S. I+ X1 u7 i        {* f+ r  D! p" c& W& E3 {% X
            tmp_hh = usart_input_threshold(rtc_buf[12], 23);
9 l4 L$ t) k4 z- b* C' `        }" Q5 O1 ]9 X* z  L' O
        else9 k+ z$ \* g" {
        {
  I) _- D' v5 f1 \( `! C7 Z            tmp_hh = usart_input_threshold(rtc_buf[12], 12);# {: z$ N* M/ t; }% u3 c5 e/ z& X0 S- G
        }) W; t1 Y" m) c/ I& R1 ]4 M
        rtc_initpara.hour = tmp_hh;* x& H9 r, y0 P# |% @5 n
    }
8 Z/ a5 p9 o+ T% `0 T: G
# r# c8 f. }, X# E! F+ H* o    while(tmp_mm == 0xFF)
5 x- Z0 }5 E# O& X2 g    {5 e. w. e/ ]; Z
        tmp_mm = usart_input_threshold(rtc_buf[13], 59);
5 \  Q0 k' \. A  q) V/ V: d        rtc_initpara.minute = tmp_mm;: ^4 [+ [! g& k# w! {
    }
2 ?' b* t2 L/ a! [( F    while(tmp_ss == 0xFF)( O2 V* D% u( b3 b
    {
6 H7 m, [5 f0 d4 z0 u        tmp_ss = usart_input_threshold(rtc_buf[14], 59);
: z# f7 a6 \* m- Z; Q        rtc_initpara.second = tmp_ss;
7 o2 K3 V; n# h% v* n    }2 {6 ]+ J( ], Z5 g) a- Z! S% m1 c

& w( h# v" c8 c  d3 c8 Z# K1 m    /* RTC current time configuration */
! Y  y* c2 W4 [    if(ERROR == rtc_init(&rtc_initpara))$ e+ t4 M7 L5 ^
    {
/ T/ P. f" o) D0 e" A        printf("\r\n** RTC time configuration failed! **\r\n");8 A7 Q6 `* E5 ?( X1 X
    }
1 S# i( n3 r/ @# D) M    else
% t4 D3 B* p- N( D6 K    {
8 I5 v' ]4 b2 D+ |        printf("\r\n** RTC time configuration success! **\r\n");
3 v8 u# g8 f' R: l! ]" v+ Z    }
  L) y  B! `! r* J' C
2 o' a( R4 }0 @4 F- E  @    /* setup RTC alarm */" [. J- o; n% C  {' \  F2 N
    tmp_hh = 0xFF;
2 I* o# z5 }1 R, w! @    tmp_mm = 0xFF;
4 P' D$ z1 M/ I    tmp_ss = 0xFF;/ _) B) C6 e4 g/ [
9 x. @+ g: a8 y0 q3 b
    rtc_alarm_disable(RTC_ALARM0);
% Q7 k, Q- C1 \4 K4 l$ U    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;- j& j, K' {; _* H1 z: s
    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
* c2 `. y% _3 _+ _" G/ |    alarm_date_data = HEXtoBCD(rtc_buf[15]);
. ]" h1 J# t1 ?$ U    rtc_alarm.alarm_day = alarm_date_data;
# O3 z' [- f  V6 b    if(rtc_buf[16] == 0x00)- w! m# T" f7 h3 c2 ]
    {
  {- n+ o( e3 ?- M2 Y0 U# f. B        rtc_alarm.am_pm = RTC_AM;
4 T3 Z) Y, @' q    }, C& d7 K/ v9 Y; p
    else if(rtc_buf[16] == 0x01)
$ H; b- N1 w' n0 v- r    {3 k5 y$ b' @6 `& q  [1 `
        rtc_alarm.am_pm = RTC_PM;0 e' x: |; p8 Q3 V
    }2 V) H( m$ ]! l: J0 N/ Z
    /* RTC alarm input */
( M9 a3 M% I3 K* {; Y    while(tmp_hh == 0xFF)- l- O& t$ M1 V. n3 u+ O
    {
1 r- E& |5 s7 |, r% b' n        if(rtc_initpara.display_format == RTC_24HOUR)% o- q$ ]) H7 N0 {) `
        {
) o" E: s5 p( Q! M  n) A& \$ S            tmp_hh = usart_input_threshold(rtc_buf[17], 23);  z" }) Q0 `7 a& k0 z  J4 p
        }4 z7 F: a3 K) u" Z& \8 S' H% N
        else! o/ B, f. X. [. }7 N) v9 Z
        {; K# ^  y9 g( u2 t1 L) f/ O
            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
, u2 e% N) s7 [5 L4 x5 e        }
/ N( z* @9 A' L: ^6 Q- n) p        rtc_alarm.alarm_hour = tmp_hh;" C3 U7 C6 e! d% a) C
    }
1 h0 c9 o6 ?1 }
- p# F5 ^$ X$ u6 y- `    while(tmp_mm == 0xFF)# m/ ~# h3 M" ]1 J- q) I5 U
    {* O. E  ^5 N* U
        tmp_mm = usart_input_threshold(rtc_buf[18], 59);
1 }+ T, @7 D$ ]2 P# }# E        rtc_alarm.alarm_minute = tmp_mm;
0 i/ e2 e: r6 Y4 [    }
! G, j% x7 W; W    while(tmp_ss == 0xFF)
" B' v( s; a) G3 ^    {& y6 K" s; E# ^* U
        tmp_ss = usart_input_threshold(rtc_buf[19], 59);
: k6 ]' w! H9 r* r0 o0 w        rtc_alarm.alarm_second = tmp_ss;' b) h7 g& T0 L7 o
    }( m) N" F' m5 y7 L8 ^. S
% n/ [6 t+ \3 I4 r
    rtc_flag_clear(RTC_STAT_ALRM0F);, ?: z: x' b8 S! \
    exti_flag_clear(EXTI_17);8 r' R, z, s* g) g, y5 ?  I2 F

4 p* N! U# \" l- L$ f+ J* [" h    /* RTC alarm configuration */
6 }( f. q; E* S% R0 L    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
6 v2 i: @0 ^# V9 b) L* V    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);. R& T1 _/ Q+ x0 C0 ~
    rtc_alarm_enable(RTC_ALARM0);/ H% b& N- R3 ~9 }% u8 A6 s

# ?0 T$ p. ]( H0 Z, V! I    /* RTC alarm interrupt configuration */' A% l/ B4 t, v0 A! X
    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);" F2 t2 B1 e! w) `, C3 O
    rtc_interrupt_enable(RTC_INT_ALARM0);
1 I8 u5 w4 {$ K& B( _; p5 j6 [. H}
8 l) L3 Z- K' Y# z+ Z) W: [( w+ n- W* ?( D
uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
* V) r5 n1 w9 F' g5 b/ Q{
+ c+ y) x9 |: T% D; o: n    uint32_t index = 0;# f. S! n- ~& H6 \4 T
    uint32_t bcd_data = 0;
! G2 `( o; P5 H$ r  R$ k) F3 |) t3 c7 f
    bcd_data = HEXtoBCD(buffer);
2 [- e- W# N( w8 _    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);* o) k- }1 g) c9 ^1 Q- o
    if (index > value)
2 s. r9 q# p" P4 n' A3 G' j    {  A+ f1 t  ~$ L4 [. T$ j) B
        printf("\r\n please input a valid number between 0 and %d \r\n", value);
( N; Z0 C0 [  X0 {3 ~- O3 l        return 0xFF;4 {! R9 t! S  C+ T: M' b, S
    }
3 n1 t6 t# c9 _. p7 z% @+ Z' J4 U    return bcd_data;
5 Y+ a6 z* b0 |0 d}
$ Q! E" d; h1 w5 Y+ n' Z
5 j+ e! J: F) Q( ?; M& ?/ [4 }+ ?1 y) i- e9 I6 i8 ]
unsigned int HEXtoBCD(unsigned char hex_data)
9 m$ z" s/ l& e; I# x+ Z  o  X+ B{
& x+ ?3 a1 h0 ?# o    unsigned int bcd_data = 0;3 t. A2 o) F: u1 S7 m
    unsigned char temp = 0;
* {' _% _- e2 ^2 r5 N" `! [- I# E& t% |9 ]
    temp = hex_data % 100;, `4 a- f: R3 c( R/ S
    bcd_data = ((unsigned int)hex_data) / 100 << 8;
. |2 R7 C* b8 v3 A    bcd_data = bcd_data | ((temp / 10) << 4);
. `4 v6 J! a) t3 T1 t/ m    bcd_data = bcd_data | (temp % 10);
9 |+ u, I/ Z5 Y, A# v4 {* b    return bcd_data;
! {' l/ g: ]: D. m* k+ T4 u' h}
7 Y5 z8 l: p$ z9 z, ~! Tvoid RTC_Alarm_IRQHandler(void)# V" y0 b- }- H0 u( H
{
, ]0 v3 K2 m( o    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
) q# a) S" N. e7 j" U% _6 P( R  ~( w" Z2 H# l9 X& H
    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
+ V6 B2 p) E' l" L" s2 w    {; _2 k; H: _+ j& [: q
        rtc_flag_clear(RTC_STAT_ALRM0F);
+ _- y" a7 Y& r4 S% Q7 R1 r2 V$ I: Y        exti_flag_clear(EXTI_17);5 Q2 p% Q& y/ D1 H, t4 I
        rtc_alarm_disable(RTC_ALARM0);
! d' Q5 R. w( x2 J8 {  @        led_toggle(LED1);
6 A5 p+ O' b1 q0 }% b9 s    }
8 x* x8 j. n% ^}5 v0 B! u2 J$ o5 O' n6 `  ]

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);. P; N. u6 j- K" I  M0 A

7 y1 x, @' W8 s4 c注意这句算法;6 \0 p' v* D1 n1 b8 T. o
保证:1.  每次叫醒后,本标志被清零;/ T* P! W: t+ a) s$ p- ~
         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;1 @; v' V: K! T0 q! h4 x) A6 z
如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-18 13:02 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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