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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。
. |& `+ x& }# A, z( H% ?. h6 P8 u8 x以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。, |5 m# J  D6 y$ A4 l. w  o
void rtc_pre_config(void)
  A. `6 `6 _' j" L+ R{6 z* n+ W# p; G
    /* enable access to RTC registers in backup domain */5 K( o: Z" v: ?/ n) ^  c
    rcu_periph_clock_enable(RCU_PMU);/ X  n5 h+ s; e1 j+ g
    pmu_backup_write_enable();* v' s% M0 Y0 C2 H& d6 o9 Y# r+ ?: n
. Z6 W: i1 ~/ n) ~  H% Z
#if defined (RTC_CLOCK_SOURCE_IRC32K)7 T! p: R; e2 ~4 \
    rcu_osci_on(RCU_IRC32K);( Q' D! r; _2 H3 J) v. a0 w7 a9 K
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
1 B! I! |0 R' M" E( K& ^    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
% z0 A6 \+ X6 y% b0 W    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ6 U" i4 I5 R8 A) n3 F' g/ I2 N3 q
    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
0 {: g8 T( F! @9 Z" W2 c" r#elif defined (RTC_CLOCK_SOURCE_LXTAL)
) s, V! p+ {' Z$ t    rcu_osci_on(RCU_LXTAL);
, \  f' q& f) m5 j" [5 {6 e    rcu_osci_stab_wait(RCU_LXTAL);& `' T9 i* q, j/ e% m
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
2 g% g  w$ C0 z4 P" d4 g4 G    prescaler_s = 0xFF;
3 F& ^0 k+ x* r& T, f+ G    prescaler_a = 0x7F;1 z$ J/ \) s$ d' }* @4 W" d
    #else, Y# a6 O& H9 ]
    #error RTC clock source should be defined* }  h5 n# h7 e8 Z
#endif3 A8 ?# a3 V# P* L4 }: x5 n
    rcu_periph_clock_enable(RCU_RTC);( N/ \$ j; H$ W2 ?
    rtc_register_sync_wait();( r. |2 x6 P5 K- a) x
}$ Y0 I3 p- }6 X3 T0 R( U& [( c2 }- u8 y
4 u6 j7 L0 s. J% T5 ?& Z
& F7 s* F+ J) `) X% \$ j: R3 x5 E
void rtc_setup(uint8_t *rtc_buf)1 T* Q- y" h* b8 G" R6 j
{3 L* I4 \8 b. Q. j( ?# c
    /* setup RTC time value */
; c& m2 f+ j+ d/ _    uint32_t tmp_hh = 0xFF;% y. W& T: w7 q4 e% ^* N
    uint32_t tmp_mm = 0xFF;' ?1 N8 U- W. P6 j9 T
    uint32_t tmp_ss = 0xFF;
) {1 |. ^0 f1 h    uint8_t year_data = 0;
. z+ l5 O0 R! m    uint8_t date_data = 0;+ b( e9 |& J% l* l# }& y0 x
    uint8_t alARM_date_data = 0;
7 r1 W7 D: y2 ^' x
; f7 N5 ?; c. ^* x7 F    rtc_initpara.factor_asyn = prescaler_a;0 M! ]3 o8 t7 ^0 g% m
    rtc_initpara.factor_syn = prescaler_s;
" \6 E) A2 O4 u0 p# S6 w    year_data = HEXtoBCD(rtc_buf[6]);
4 M0 R" t" B. L  N6 i. W" B& c0 _! q    rtc_initpara.year = year_data;) ~/ e3 X+ f- J7 ]" ~! l) P; v
1 M' K) P/ ?: h
    switch(rtc_buf[7])
6 O5 ]) [4 H1 n/ l# R- r" G    {
8 }. _0 X; ^+ ^( f4 V        case 0x01:
; O$ v0 o9 P( u) Q$ p& s7 y            rtc_initpara.month = RTC_JAN;
' R( m' D' Q7 R) v+ e/ v* |# T5 i            break;
" |, p. Z2 p$ C8 B9 a3 u& O: }        case 0x02:
1 D& n7 V' H1 W; Z% o            rtc_initpara.month = RTC_FEB;$ }" L3 E2 W7 Y+ f) z& M) A
            break;
! Y4 H+ {' c# ?9 `        case 0x03:( m6 i! T, M- R) Z1 \5 b3 T
            rtc_initpara.month = RTC_MAR;
" T4 w7 a; @$ N2 p2 ~            break;
  i/ W1 D) g  B% `8 ]& ~) _        case 0x04:
2 a1 _! R. ?% z0 \4 a! [            rtc_initpara.month = RTC_APR;
5 v7 |7 |# W. Y* a! c& i  X6 H  q            break;3 D4 M8 ?: ]  ]
        case 0x05:
0 q- s4 }4 o7 r            rtc_initpara.month = RTC_MAY;% e4 l) ]. l1 ]7 I0 b5 Y) m: |$ b/ S" V& v
            break;
$ C3 A) @" E  ?. t9 E        case 0x06:6 `# h# t( o, d9 l$ l! o
            rtc_initpara.month = RTC_JUN;
; t) w" f5 G2 s3 g' P0 ^            break;. Y: h: @% J. e/ |7 K3 m
        case 0x07:
$ v8 X. S4 r2 F            rtc_initpara.month = RTC_JUL;3 K: f1 g# }& z9 \) d; z$ v- T
            break;; F4 m' D0 O$ {
        case 0x08:! T8 k) R: X5 N  l! ?
            rtc_initpara.month = RTC_AUG;, Q5 Y2 I* m7 o5 m) s
            break;
7 T" Y- X) x! Y/ W6 h        case 0x09:4 o5 h! |8 Z: A, r8 N
            rtc_initpara.month = RTC_SEP;
0 v6 e7 j, Q2 r$ j1 H+ E            break;& G. D9 k5 d% W- `6 {
        case 0x0A:
7 }! c/ {) _7 w" i8 n9 e; h# U            rtc_initpara.month = RTC_OCT;
7 Q- U4 a1 Q+ Y' J# i" q+ T# _/ O            break;3 _) ^; r2 y9 C5 t: |6 L0 C2 C( N
        case 0x0B:6 M# u( K! D& j. g: F. S  y  L" }
            rtc_initpara.month = RTC_NOV;9 E9 C7 k2 A8 w
            break;6 T5 ^  k9 g# H( f
        case 0x0C:1 m/ y& m+ V+ b* b
            rtc_initpara.month = RTC_DEC;
  U$ H7 J1 F. G  [) `            break;
* x: s4 b( a! @' ^/ S        default:
$ `% K$ Z& Z" n  f* r+ ]6 E8 S; ?# Y            break;
; i5 M( Z% E: s  I. Q    }5 P$ h5 t$ B0 a% G; ]
    date_data = HEXtoBCD(rtc_buf[8]);
2 q8 F% `( v& Z. [    rtc_initpara.date = date_data;; ^! `; {' R5 N/ R  c# y
    switch(rtc_buf[9])" A1 V. J7 B% [8 I7 W1 j
    {& z7 {$ I% l7 C! \, H
        case 0x01:6 ]; r: w. B2 d( U" x; k
            rtc_initpara.day_of_week = RTC_MONDAY;' {- ?: A; S8 S6 m  v5 y
            break;. k* G- B( |6 x8 c8 ~
        case 0x02:
! s& J, i, F! O8 ?7 c            rtc_initpara.day_of_week = RTC_TUESDAY;
5 D; c( {! x3 O& _  O9 j            break;
  q& r: N: }) S  Q, @; U, o2 a        case 0x03:, x0 O, c& Y/ G7 T, N. m
            rtc_initpara.day_of_week = RTC_WEDSDAY;
; C4 o% X$ E( P6 [7 |' y, |            break;
- S7 z$ m3 B7 C        case 0x04:: W/ @. n* o6 k& a' L
            rtc_initpara.day_of_week = RTC_THURSDAY;
) I$ s* ~3 p# S3 S8 @2 k            break;& P( ]9 E9 q/ }5 s8 m
        case 0x05:
: u5 B2 u( d! `" k4 N: R            rtc_initpara.day_of_week = RTC_FRIDAY;
2 m0 w! T3 e+ {7 o            break;
* i$ ^5 H% q4 L0 p6 x        case 0x06:
# I" \" R# e7 ?, a; m            rtc_initpara.day_of_week = RTC_SATURDAY;
! k3 B9 M- x9 W% z* h1 w6 v( F" [            break;
9 F# t8 C7 [3 c7 V4 H        case 0x07:
; o: w) c, y& L2 j  p            rtc_initpara.day_of_week = RTC_SUNDAY;6 X9 s' l7 m, Y1 n- P% p& R
            break;$ ?0 C) t  y: L: }7 h. C
        default:
) Q- v9 B. X% j' H! n. }% `            break;5 f# j/ P+ t% M. q5 y
    }
! p4 R) r0 V+ u2 N    if(rtc_buf[10] == 0x00)# g0 Z8 \) D) V. y" g
    {
0 m/ e' k3 ?1 |8 z* _        rtc_initpara.display_format = RTC_12HOUR;, q4 V9 r0 O9 N! Z
    }$ c, [) \. S  I0 _9 {' y
    else if(rtc_buf[10] == 0x01)
7 I5 g5 r, k" E    {% P* h8 k! H8 K1 Q2 |
        rtc_initpara.display_format = RTC_24HOUR;
# h- D" A. j; R4 P( x+ I3 |    }
' O+ o7 D) l: ]3 A    if(rtc_buf[11] == 0x00)5 \; W0 L4 c3 e0 c
    {
+ S0 ]$ E! _3 v0 p* t        rtc_initpara.am_pm = RTC_AM;: z$ }: j" t& ]
    }" B/ Q/ [# o6 y4 M
    else if(rtc_buf[11] == 0x01)
1 L6 \7 _! W6 v9 j: h0 {    {
: d" J  D4 B3 z: Z9 C- T! {  a* s) |        rtc_initpara.am_pm = RTC_PM;5 y9 N( C& ]" L6 `- E. N
    }
1 G) v/ S' v5 I. Q* T  {( j% h' j    /* 输入当前时间 */
5 U$ l7 V; w  V; l# _+ H: `1 Z    while(tmp_hh == 0xFF)
8 A/ m; R8 C3 S; ]6 I    {' B  T* \$ z% h  N8 D; Y0 D
        if(rtc_initpara.display_format == RTC_24HOUR)7 v& M5 j: [+ ~; o
        {
2 {( W7 A' P/ v( n. r; ]6 H5 C/ v            tmp_hh = usart_input_threshold(rtc_buf[12], 23);; R9 f" E9 a1 r: A8 v. k
        }+ l* @7 E6 \+ S! M) Q+ ^
        else
; [3 G$ |! l6 H' i3 k7 i        {9 Q- m- r& x) Q8 _4 x6 D# C
            tmp_hh = usart_input_threshold(rtc_buf[12], 12);
. Z/ F1 K+ ^; e; W0 s        }
/ }# ~$ h6 Z5 Q; x+ l$ v4 |+ e2 u2 z        rtc_initpara.hour = tmp_hh;
5 I" U7 d5 I7 W+ `    }& N% V& t& Z  I
) K" a) a% @8 ~! u4 ?
    while(tmp_mm == 0xFF)7 q! A! N6 X( L* \7 x
    {5 ?6 y: G/ X/ M; Y# ~3 }, j
        tmp_mm = usart_input_threshold(rtc_buf[13], 59);. w0 d! l2 m& m1 j! ^
        rtc_initpara.minute = tmp_mm;
5 v" m( d& Y& e6 e% W2 E    }5 N2 _6 W& h1 z; r8 d4 U
    while(tmp_ss == 0xFF)
* }, u5 M# C6 h" T    {
+ s) t6 O& o' ^. v2 g3 H- S/ n        tmp_ss = usart_input_threshold(rtc_buf[14], 59);
# K+ t0 A- h7 l        rtc_initpara.second = tmp_ss;. B, q7 q* M0 k9 o# \$ T
    }+ C% Z- r/ K* V3 \& l4 q5 {
6 p' |' K: h/ ]) C( L+ D
    /* RTC current time configuration */
$ S: U* g, w$ ?) ~4 d    if(ERROR == rtc_init(&rtc_initpara))+ [% S. Y: J' Z5 e8 @
    {
- U9 f4 m% n7 l        printf("\r\n** RTC time configuration failed! **\r\n");
  ?: L' d# o( J4 c2 }7 D/ ]    }
7 i3 P4 B0 t( v* f8 s    else
. M; z7 J4 O' m6 r2 e    {
7 k# W/ ?# J5 J; N5 b        printf("\r\n** RTC time configuration success! **\r\n");
6 V! b, i- ~: V$ S    }
+ U- {3 t) V' O& X0 @4 N
2 M3 f0 |! m1 Q2 z$ N3 ~3 U    /* setup RTC alarm */& z. ^4 l6 h+ s" m# F$ E( g5 ]( F+ ?# q) D% [
    tmp_hh = 0xFF;2 `4 C- l5 d1 W- b+ b( Y
    tmp_mm = 0xFF;
  {) N. F$ x1 I0 u, H$ v5 N    tmp_ss = 0xFF;6 u! B5 R7 V- x

4 x; X/ f3 F) `0 R4 K    rtc_alarm_disable(RTC_ALARM0);% G, O' ~0 [9 X7 H) X* |% r6 c) \* Y
    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
4 N3 ?8 ~1 Z4 X+ o- L    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;" @8 {- t% m* @- Q
    alarm_date_data = HEXtoBCD(rtc_buf[15]);: j2 l8 e# U# L- r, `
    rtc_alarm.alarm_day = alarm_date_data;2 L+ Z* \, S/ N0 |0 c. e  r6 _! g" t
    if(rtc_buf[16] == 0x00)  u( H4 X0 Q7 a5 a9 M* _
    {6 X; P  U+ Q9 @) ?' u
        rtc_alarm.am_pm = RTC_AM;* B+ P3 |5 z7 x- b( E! ~
    }
& D% N! |$ Y6 a3 ]$ i* p    else if(rtc_buf[16] == 0x01)# S! W. L; b# ]1 S
    {% _8 L" g/ A& W
        rtc_alarm.am_pm = RTC_PM;
/ O0 A: G% \, I' o& J    }
5 f! @) I+ O3 _. A0 K6 T    /* RTC alarm input */
8 _9 ?+ Q9 q3 k( J# W4 j    while(tmp_hh == 0xFF)
6 B; O6 N- W1 ~& r1 k1 N) ?2 H    {
7 M9 |0 w0 R# _/ P. y# g1 K! Q        if(rtc_initpara.display_format == RTC_24HOUR)
: Z# H0 ^. |) t% u        {; `( D5 x" D& V
            tmp_hh = usart_input_threshold(rtc_buf[17], 23);3 ^) r8 X: V) U: a1 q3 G
        }8 e' z* j) _% w8 m4 Z! v9 M
        else
; @! l6 o# K( Q# C: n        {
0 h3 {: C! T- s: M            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
1 l0 a) K9 @3 j/ N        }$ F) K% o8 I' ]& [. S3 \5 L
        rtc_alarm.alarm_hour = tmp_hh;
# G! q0 s  E* A4 G4 q' s' J) Y* X    }
/ t2 }% D2 S' b7 Y% e8 O0 {. {. a7 B+ Z5 N0 c6 j" c
    while(tmp_mm == 0xFF)
, L- V8 ~$ f+ ~5 J5 M4 @    {, Q+ ?: N3 E1 ]5 i
        tmp_mm = usart_input_threshold(rtc_buf[18], 59);
$ i- J7 E/ }( U% }# Y* g% M. o        rtc_alarm.alarm_minute = tmp_mm;% F0 X8 B  v" B- q* u8 V8 M) ^/ N
    }
) @; V9 A( r6 h+ S6 T1 \    while(tmp_ss == 0xFF)5 }  Q4 K, q# i8 F9 o
    {6 I! l8 T2 a  b. @4 Y) j
        tmp_ss = usart_input_threshold(rtc_buf[19], 59);" Q0 e( H( X# C5 S9 ^/ A
        rtc_alarm.alarm_second = tmp_ss;
* r. k" s% _7 e9 E9 @    }* B, I- i: f7 Z5 v  _$ p8 m
' Q! L* E) m: o: E
    rtc_flag_clear(RTC_STAT_ALRM0F);
. [; c  g3 E7 Q% U( P& x! R7 Z    exti_flag_clear(EXTI_17);" D8 Z7 B+ E/ x6 D; W) v$ B
  Q5 b5 m" M  M) u+ S* K
    /* RTC alarm configuration */% v1 b% V& o8 k8 w! d/ ^
    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
. u) Q% Q' Z8 C3 Z" G    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);5 _, B9 @" E& R/ [
    rtc_alarm_enable(RTC_ALARM0);  c' I( X  U7 M" S2 x% C
: I4 b# V2 z& u7 M+ E$ h
    /* RTC alarm interrupt configuration */% W! u' `0 \7 p
    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
; J  G8 a9 v, m1 K/ o    rtc_interrupt_enable(RTC_INT_ALARM0);4 O6 [4 `6 H* G7 c  g5 G9 Q# v
}
0 l  D: f- a5 }0 P' ]2 K2 `. ]4 t$ _- d  G8 Q* A3 {6 ~" t; ^
uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)0 w( @  R( {" F% G0 y6 w
{& F* R! B1 M' A% c- j3 d! {) W, Y) L
    uint32_t index = 0;; |9 H  h5 b! Z0 T# b
    uint32_t bcd_data = 0;# D0 m- B) V3 _" S
! k! `7 n  ?3 V' t2 L
    bcd_data = HEXtoBCD(buffer);6 ^9 P& U: C' ?2 F2 O
    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);" `0 K4 x2 o- W, `9 J) l$ P4 H
    if (index > value)& F4 J, B9 o% a7 x  H
    {. g0 w$ l; I$ p/ F5 k
        printf("\r\n please input a valid number between 0 and %d \r\n", value);: [; O5 [, T' t
        return 0xFF;
: Q3 |" B+ R# A* H0 }    }! T# G$ t0 x4 ^1 i" F
    return bcd_data;$ H. P& |% `7 Q) r, I: p  z+ c( Q% N
}
, k6 G0 c7 f. T+ l* f! N9 E  Y% R: y& i% a7 ]5 s& o. f
4 ]3 l* W3 a, M8 o' B$ I
unsigned int HEXtoBCD(unsigned char hex_data)- ]$ |" i5 Q) o/ v1 b; }
{' K: z1 T- l! X+ R( C, @) t
    unsigned int bcd_data = 0;
) i; V8 P$ i) y$ g6 l    unsigned char temp = 0;5 ~( ~8 o& j% [3 ~+ q
  V8 F! Z  T" h: \5 Y. p7 K
    temp = hex_data % 100;
" x3 W3 ]; T: ^% {; a0 n2 B    bcd_data = ((unsigned int)hex_data) / 100 << 8;- I+ ?( h  ~. j9 i& N/ K
    bcd_data = bcd_data | ((temp / 10) << 4);
& y6 Z6 _1 Q2 c' a6 p% O    bcd_data = bcd_data | (temp % 10);
* T! \! ^! t9 Y# t9 h8 p5 x* Y5 e+ g    return bcd_data;- T0 u1 i8 n5 v( [0 I
}
$ Y( R) G  e5 B8 v1 [void RTC_Alarm_IRQHandler(void)
& G) l9 ~% Y0 [$ V4 E- ]  Q{
8 ^9 d$ ?2 W5 A4 J0 ?& F    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
% x$ Q5 L  u: \' d7 r6 X# ?8 S8 z- K! `1 O) N* I2 s+ W9 D
    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
7 O' X; s# m) N3 A  \9 _    {
, q  A( v/ j. `4 D1 m, H+ @        rtc_flag_clear(RTC_STAT_ALRM0F);
& \- M$ a& i. u( H/ R& U9 t5 j" n        exti_flag_clear(EXTI_17);
' Z! t2 d8 S# M! r6 b$ P; i$ ]        rtc_alarm_disable(RTC_ALARM0);
! u+ n( t& A  U8 m$ i0 b        led_toggle(LED1);
  e) E% U" `+ Y: x' \( u& Q: b    }
. O9 G/ k. f6 J' F) w" p' E! t/ G/ M3 C}5 p1 e5 c6 \0 t6 I7 [) x# z0 v

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);
6 v2 N/ W6 i3 u6 p9 u
8 T: e( c( _0 M5 c4 P: d" N注意这句算法;
+ Y6 }# q! E9 [6 x! m, J& f保证:1.  每次叫醒后,本标志被清零;0 ~  n# [* E* O- a4 |
         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;$ t0 K3 J7 z$ U% D
如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-7 07:46 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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