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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。( W9 k- h* x* `- s1 R! S, P9 m6 j$ v
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
2 }' ^1 ~) B5 E8 u( ]4 _0 f# ?void rtc_pre_config(void)9 b0 J' g, R4 L" v5 l/ w
{0 N# G; W$ N4 G8 F; }
    /* enable access to RTC registers in backup domain */
! g! S. m3 O0 f/ j6 G" Z0 G    rcu_periph_clock_enable(RCU_PMU);
% u1 m0 r; [$ F    pmu_backup_write_enable();
$ ^  I. C5 s- S6 g0 I
( O5 q- M8 {- l  g$ ~#if defined (RTC_CLOCK_SOURCE_IRC32K)! N* S- B& a% _: C: [0 C% z- v" i
    rcu_osci_on(RCU_IRC32K);' w8 ]4 b# `( D$ Y9 q. _4 P
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));- I- K3 Z$ ^9 Z/ V- p+ W+ U8 w/ d+ }
    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);  c, B+ |( G( U2 _9 ?
    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
, p# L0 {5 J; w7 r3 P% C! W0 \0 P7 P    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ1 M5 E7 g( X/ b: V) N
#elif defined (RTC_CLOCK_SOURCE_LXTAL)
+ V) f( Q" E! W- c0 @6 w6 t! C    rcu_osci_on(RCU_LXTAL);- e- v( V* }; X0 @
    rcu_osci_stab_wait(RCU_LXTAL);
; h8 s5 X8 v$ P* X* ]0 `* k    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
9 R' k. v! O, \- K$ _- l5 P$ A" R    prescaler_s = 0xFF;
& E8 D$ _0 I4 [1 L2 w  s    prescaler_a = 0x7F;- M* ?" k. Y1 ^! V) X8 ~2 k
    #else
0 z3 S2 n, ?: {. E    #error RTC clock source should be defined  ^5 Q+ k+ C2 G: w% K1 q) Y  Z
#endif1 D2 M/ t7 v( y& C1 ^8 Z
    rcu_periph_clock_enable(RCU_RTC);% e, X! ~# S# x6 a
    rtc_register_sync_wait();5 ~# e4 {  L* p7 a% l8 o
}0 V3 t6 d* Z8 B" Z% w5 Y3 ~

8 F$ H. u( @/ e% A3 d5 {$ r' P$ p; N% B% j" E
void rtc_setup(uint8_t *rtc_buf)
3 c/ p* O- m6 @) s{% X' v. A+ E4 k2 @1 T
    /* setup RTC time value */) |( Q  y6 x; u/ b1 R
    uint32_t tmp_hh = 0xFF;
) G( m9 i+ Y$ \3 F. D4 a' h; g' d) K: R    uint32_t tmp_mm = 0xFF;. \& X+ X) i8 D/ b7 y8 Z
    uint32_t tmp_ss = 0xFF;% F8 {' Q3 F( }: l" f9 x
    uint8_t year_data = 0;
, L$ P8 K6 |. O/ F    uint8_t date_data = 0;
3 E4 A" E3 O& |  [# d5 G    uint8_t alARM_date_data = 0;
1 B3 D( d" n+ A2 P4 j
6 I/ e3 m! q$ P- t! N    rtc_initpara.factor_asyn = prescaler_a;
- m8 y3 S/ b8 i% d    rtc_initpara.factor_syn = prescaler_s;  N& n9 S& T. U: Y( K6 o+ N4 L
    year_data = HEXtoBCD(rtc_buf[6]);$ p2 g3 h( r: v( J7 K/ O
    rtc_initpara.year = year_data;
! X# G6 g. c+ @9 B; D6 v1 ], S+ M: [7 }$ L( {0 H
    switch(rtc_buf[7])
: J: T- T3 Z, `. Q  u+ P! P0 I    {
6 F& F8 R) x& |3 _9 Y        case 0x01:
' F$ Y- ~: y; T            rtc_initpara.month = RTC_JAN;
; W' M0 I9 N8 W6 ~& h/ L            break;
' h: ~1 X; |; e  x5 K        case 0x02:; Z4 s. j: j$ ]7 R0 l# d
            rtc_initpara.month = RTC_FEB;
$ K/ c1 P# j8 ]3 H: _            break;$ C+ l0 {' {+ o0 M6 X8 l
        case 0x03:( S  {6 M% s6 F: Q, m
            rtc_initpara.month = RTC_MAR;- w. ?$ f, I3 N
            break;7 ]& k, b- g& _" y) {
        case 0x04:
6 _& n* b# I9 X            rtc_initpara.month = RTC_APR;
% u4 D' c) F, A7 L1 l" L! T* @            break;
' Q9 x$ X, @6 c        case 0x05:! d, c4 W( n+ P( i( D7 i3 K3 u
            rtc_initpara.month = RTC_MAY;7 X  \* S& t8 b; r6 S
            break;
( Q! R9 i$ e/ ?& _; E) S6 J5 j        case 0x06:
& m; Y/ V$ ^7 u* {            rtc_initpara.month = RTC_JUN;
4 P& a/ J# r6 ?            break;; f: y5 s# _7 \7 `
        case 0x07:6 H. K; ~6 m6 {1 Y  O+ f! `
            rtc_initpara.month = RTC_JUL;
/ _, p. E! _4 o0 b/ Y; x8 C  L            break;
, v3 [5 V* c7 m3 m0 S        case 0x08:7 I5 |" V8 _0 f& c* \* ?) |3 @
            rtc_initpara.month = RTC_AUG;
+ D6 g+ y9 x. T$ b, ~            break;
8 P8 V( t, H( d1 m! D  r        case 0x09:/ T0 M" h, ?1 u7 c6 @" H6 N
            rtc_initpara.month = RTC_SEP;: d- ?( V* r/ L+ Q- G
            break;
( q$ }( f5 U. W% a! E        case 0x0A:! _' O6 w0 x# W7 X
            rtc_initpara.month = RTC_OCT;
3 c9 N" J4 [( Z& ^9 t            break;6 @& b$ o/ O) U5 m
        case 0x0B:
+ @, F, T2 B; ~% S" {            rtc_initpara.month = RTC_NOV;
* g$ Y- l6 @9 |" ]; R            break;
4 e: c+ G& t) e' g        case 0x0C:8 @5 n- ?- |( t4 a6 {4 v/ h( X8 g
            rtc_initpara.month = RTC_DEC;2 u0 E. Z9 L6 J: b
            break;! W2 z% `. V6 i% r% V+ v- y  L
        default:
: [2 }& a: n8 @            break;
  Y( @& C! J- s. S/ ^    }% X# m# B! X, D! |: n
    date_data = HEXtoBCD(rtc_buf[8]);
  O& l. v8 M6 {2 T( I    rtc_initpara.date = date_data;7 @1 U2 [% d" x4 y7 e( y- m. L: [
    switch(rtc_buf[9])  v2 D6 M! y$ Q
    {( Y/ @/ B2 s5 w$ t+ ~
        case 0x01:/ l' v3 f; V. H7 |4 a) g
            rtc_initpara.day_of_week = RTC_MONDAY;
! k5 Y7 D" E9 P, d0 y8 |            break;
4 C- w7 Q& X" i0 M        case 0x02:2 Q1 B. u" ~9 r- G0 x/ ]' h, m
            rtc_initpara.day_of_week = RTC_TUESDAY;$ a5 |- p/ {& e: v% r2 C1 X
            break;
: Z- A7 X4 O. s8 z) K& Y# M, h4 |; t        case 0x03:
3 @: t& [: S- Z1 ~  c            rtc_initpara.day_of_week = RTC_WEDSDAY;! G8 J/ u# r% i' \
            break;3 t2 m1 E, A: T- R8 p( S# V
        case 0x04:
9 ^, e0 u, E' S1 j8 L            rtc_initpara.day_of_week = RTC_THURSDAY;
5 f: t6 H: n( Z% g            break;* h0 u  B$ Q( o7 H& k' A+ V
        case 0x05:
7 y/ |9 x& T0 b; ^* E9 ~            rtc_initpara.day_of_week = RTC_FRIDAY;
2 d! z; l* y+ ?0 E            break;
+ A& `8 w2 |7 P) i( L0 T        case 0x06:
/ e, r4 p  p  C; ^2 v            rtc_initpara.day_of_week = RTC_SATURDAY;
0 o+ ]; n2 y7 Y/ L3 Y. N' I            break;1 w7 a' Y, p: ?( d
        case 0x07:
+ v% J* z: t. W& C1 H# z            rtc_initpara.day_of_week = RTC_SUNDAY;
) R1 l- c6 P$ T* E$ t+ Q$ h; B            break;
  {! y$ \) s: i+ g3 L% l        default:
5 l$ B8 u% w, W5 c            break;" t# H) a0 i4 M' v8 ?' Q  q$ w
    }
9 z+ a8 `: X% I    if(rtc_buf[10] == 0x00)
4 L- G0 ]" T2 d- a1 R) N, @    {
4 I# r! ~7 _% X4 ~; `        rtc_initpara.display_format = RTC_12HOUR;) g# }, F  e1 L0 p$ J/ \2 Q
    }
( j8 E" \  O: R! g9 s    else if(rtc_buf[10] == 0x01)
. O! Q$ {# _8 d  x    {
% q9 V( v8 m$ s        rtc_initpara.display_format = RTC_24HOUR;
1 `; x( `6 K5 I" F) R6 t% N6 y    }( C# A7 i. c: ]
    if(rtc_buf[11] == 0x00)
3 D2 r3 }: G6 V1 Z    {( D: u* U( s3 K& f
        rtc_initpara.am_pm = RTC_AM;: {8 \# M7 l; k" h
    }( P/ X% J0 g. I( _$ o8 p
    else if(rtc_buf[11] == 0x01); J: ^9 U0 r/ c
    {' o8 d/ h5 Z, N# B$ Z. d; ^
        rtc_initpara.am_pm = RTC_PM;
1 K7 A. M; y& c" ^, C6 @    }. D* L- O3 K% b  U( k- b; n: h
    /* 输入当前时间 */
! i/ {0 w8 W5 A, }! t$ ~, H8 O    while(tmp_hh == 0xFF)
, }' W7 y- {/ d    {
/ Z6 o: E: z, l# k# S: J        if(rtc_initpara.display_format == RTC_24HOUR)
. B* O) W2 C/ _3 `1 S2 n        {
$ O6 Z& s+ |4 C# O% a            tmp_hh = usart_input_threshold(rtc_buf[12], 23);& r5 r, T0 N: N5 C, s& N" Z7 I
        }
4 M2 C( p! u% |1 ?        else) e% A" {, u* t0 g: @
        {# {, s% T  j, Y( y
            tmp_hh = usart_input_threshold(rtc_buf[12], 12);
8 ~3 h6 Z; d+ J: Z        }
# `$ M( y' x) p! W        rtc_initpara.hour = tmp_hh;8 K; u: Y/ E  J; c, t
    }
% @2 |: _# [8 r1 l1 V( m+ @0 Z- J7 d* Y
    while(tmp_mm == 0xFF)
$ P; u4 k, ]( O    {3 H1 Q. t$ K% c4 k5 E* L( X
        tmp_mm = usart_input_threshold(rtc_buf[13], 59);% `: D: j/ z2 A" J1 p
        rtc_initpara.minute = tmp_mm;
( _9 F( A* {1 `4 Z0 Y& D: M    }! p& a1 j( g3 V' A: {0 d
    while(tmp_ss == 0xFF)
9 K- D# ^+ m+ }* Y; b& f5 j    {
% J4 K6 i; |+ h% T' a4 s        tmp_ss = usart_input_threshold(rtc_buf[14], 59);4 s. ^) L5 X9 r0 Z( s( \; V
        rtc_initpara.second = tmp_ss;+ T9 v; T, D# f! ]( v* Y! i
    }
9 [! ?- ~1 S: o9 z8 q  |
  l' T# I6 g( V( \2 u+ Y7 Q! g' C    /* RTC current time configuration */
! A( z! k0 `6 r9 D0 `    if(ERROR == rtc_init(&rtc_initpara))
! x, B" n5 c+ ^7 t    {
6 `' Y  f" Z* \9 \% _. z        printf("\r\n** RTC time configuration failed! **\r\n");& O7 q5 [+ _, G3 u% L
    }& V3 z5 |' W' ~! C: w
    else& ^# g7 |9 ~" h8 W  T* I' t$ l: R, t
    {
$ }" v8 [* _4 `7 Q        printf("\r\n** RTC time configuration success! **\r\n");
( l; Z6 f+ h0 f7 x: a1 F3 R    }' ?+ M) I. I1 X3 F* s. f

* C) `+ w1 G2 u    /* setup RTC alarm */
3 Q" L9 L" ?' n' _    tmp_hh = 0xFF;
; f3 |( Z/ E  g5 C/ S; L    tmp_mm = 0xFF;+ x* x" X, ^9 J
    tmp_ss = 0xFF;
: u! _5 K# C# r9 ?+ S- }( A5 z  x
    rtc_alarm_disable(RTC_ALARM0);# y% V1 N; g3 B$ a) s! h
    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
5 P6 R" H; d9 [7 s% t    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
5 I% {" p  d& y6 b1 }2 K& F    alarm_date_data = HEXtoBCD(rtc_buf[15]);
% c0 }6 y* B6 O* V% Y: t    rtc_alarm.alarm_day = alarm_date_data;* @1 Y+ L- ]1 R  ~6 Q: X
    if(rtc_buf[16] == 0x00)  G& G  q+ F9 X7 x
    {" h7 g9 j% ]. Y- ]
        rtc_alarm.am_pm = RTC_AM;
* E! D  o1 V3 Y& Z$ \0 k    }
, T' k  k; G. V0 n" Y' O    else if(rtc_buf[16] == 0x01)
2 R# B; O7 S$ t  ]    {$ `; I+ C9 D2 z0 p* [3 F) V
        rtc_alarm.am_pm = RTC_PM;1 k1 T3 ~9 v$ h& U; |% Z
    }) _8 ^' z0 g+ k& M5 N6 ~6 ]* Z6 h
    /* RTC alarm input */5 f& }: O' O& X6 X4 U
    while(tmp_hh == 0xFF)
' c' s% |9 a& T6 o9 A    {
# p, r5 e2 H; H! @( S1 X) d        if(rtc_initpara.display_format == RTC_24HOUR)
( D. z( y/ r' L  _2 a* f" A( [        {; T. G$ h9 [" ]$ i. G1 b
            tmp_hh = usart_input_threshold(rtc_buf[17], 23);- j# s% K4 a6 q4 Z( R  Q
        }, g! g) N! m5 V$ U- X
        else
( a% l3 W) L2 l8 j" t) @        {" K# `" J. A  A, }. L2 S' I
            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
- b4 J; z! d) b0 }! I& C6 s        }4 C9 H6 C; t6 l+ @
        rtc_alarm.alarm_hour = tmp_hh;
6 \/ t5 P6 z% z3 C- f% C3 Y, S    }
6 }1 J( n7 c; W; i4 n% u" E- s0 v8 c% V
    while(tmp_mm == 0xFF)
* P1 e" A: t. J    {8 I2 R  W& I) N, H4 {% H
        tmp_mm = usart_input_threshold(rtc_buf[18], 59);
& M; |9 R& A6 ~% O$ I        rtc_alarm.alarm_minute = tmp_mm;
! N+ q/ s& h+ P9 I* T8 P4 F# B2 V    }
, I0 Q# c- O2 J  O$ W" r- ?    while(tmp_ss == 0xFF)
, X' R7 O2 ^" K& f    {
: q; m' |- i, W! p" ~" D        tmp_ss = usart_input_threshold(rtc_buf[19], 59);9 p) a) h2 U8 L3 r
        rtc_alarm.alarm_second = tmp_ss;8 ?5 |+ J9 ^( t: _6 I: I4 A
    }
# \# v+ u1 ]8 G; e" z
7 _  c7 o# R  T. y9 E  R1 e, g    rtc_flag_clear(RTC_STAT_ALRM0F);8 B! d; j8 s$ U2 U: k' q6 o
    exti_flag_clear(EXTI_17);
; c3 V) k, n$ @% }8 f3 a! C2 T$ J  e; i( F5 ~
    /* RTC alarm configuration */
; z! K: l' g6 o( d; F  }    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
+ F2 }+ ^4 U. i7 `    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);8 e6 h$ B, \* ?" i' D
    rtc_alarm_enable(RTC_ALARM0);
: L- f; }( S/ v  G9 C
3 B. s9 p% V/ ], G9 U& {! ?4 p    /* RTC alarm interrupt configuration */" G% j4 F+ k; U3 t3 p/ N
    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);) J: z4 z; n8 ]- D  a( s
    rtc_interrupt_enable(RTC_INT_ALARM0);4 n8 t' d, l$ }2 P  D
}8 [1 q3 M0 d4 y1 g$ K+ L
, C+ Y. A) N" t9 n3 t7 H
uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)2 F8 t0 P; i+ F. ~
{
' `" {* ~8 c  |& n; }    uint32_t index = 0;
" M6 O9 s  w- o  s    uint32_t bcd_data = 0;
+ D; u& L" G/ r+ v' h$ ?& Y4 o7 I5 w$ L& u" z
    bcd_data = HEXtoBCD(buffer);
5 N; C6 M% I7 M- P6 {    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
. y2 k/ Y& S' t9 m0 H    if (index > value)) }" R6 g8 p- ^5 h! M4 ?
    {
4 \8 ]/ w2 {# s2 Y5 K! b        printf("\r\n please input a valid number between 0 and %d \r\n", value);, \) |( Z4 R! ^' Q7 q: i: h5 K$ m
        return 0xFF;
  x- L, U  `5 w9 o; [6 W, h% k    }. R0 Q. _, j& y( O
    return bcd_data;# S0 _0 L7 \& a) c
}
* }/ o/ t' f, D- z: P5 h6 n, i0 F# f7 }! E) E
9 p3 ~& o, B6 c
unsigned int HEXtoBCD(unsigned char hex_data)& s3 T8 c: Q$ b9 q! x3 B
{
  h, u% w) D/ P' t& M    unsigned int bcd_data = 0;
9 H) I; a- ?( s9 {/ o    unsigned char temp = 0;
  V0 G4 ^! I9 X8 ]+ C3 B- m3 _& ?
    temp = hex_data % 100;
/ ^; p! p+ C4 `) [2 m+ w6 M" r7 y. o6 C$ X    bcd_data = ((unsigned int)hex_data) / 100 << 8;
  m( y% I5 C9 n; k) ^4 U( l5 |4 ^    bcd_data = bcd_data | ((temp / 10) << 4);
4 F: M" D5 b, o6 q5 t    bcd_data = bcd_data | (temp % 10);
/ T% c! F: C9 A) W2 t% V& Q    return bcd_data;
" ]7 l9 J- N6 @}
7 D# ]  C7 J! yvoid RTC_Alarm_IRQHandler(void)$ x/ T2 B0 ~  d; r
{
# ^) i! p9 p6 ^9 g7 S- r    BaseType_t xHigherPriorityTaskWoken = pdFALSE;! E! N7 L& U, F; L4 x; E# s8 J- S

0 _/ J8 G* J+ y- V7 L7 |* K2 C    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
0 R, I) u. f6 S0 I4 k& U0 L, X    {/ x* b! q1 {9 N& a( W
        rtc_flag_clear(RTC_STAT_ALRM0F);
( \" c# @: ]& T8 L& ^. K' c, ?        exti_flag_clear(EXTI_17);' m) p0 v3 g1 z! a  ]
        rtc_alarm_disable(RTC_ALARM0);
& }, t6 M9 N2 }5 z" X        led_toggle(LED1);& {" E' L% A- d2 @/ t3 a/ |
    }
" O& h* v# y/ u}. e) q+ Y0 {3 p" F% y7 H. Q; q

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);6 Q7 X! R! S# [9 e( W# V

6 B* t% v: H* M; w注意这句算法;; K1 \3 n9 ^& Y' h
保证:1.  每次叫醒后,本标志被清零;
0 U+ |: n8 q. S; X2 l4 b         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;$ P+ q% Y4 |$ J1 X$ ]/ Q8 _
如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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