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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。. U) o+ `) d7 z( B
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
$ S* ]/ Q, F9 X/ x) Q! V: Bvoid rtc_pre_config(void)
; U/ C# i) D4 c$ K( j+ p! m{
( V2 q' _/ j% f    /* enable access to RTC registers in backup domain */9 k; K* @# h  R2 W4 b  c
    rcu_periph_clock_enable(RCU_PMU);7 J: r. a/ @: r% o! i
    pmu_backup_write_enable();
/ S; ~  m. s  [1 t5 X( K* h7 e
#if defined (RTC_CLOCK_SOURCE_IRC32K): ]4 X7 Y) f9 i6 K1 q; l0 g
    rcu_osci_on(RCU_IRC32K);
- f' l& B2 `) z3 y9 {% b+ P9 h    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));% c9 g- K0 n& R: ~- O/ T
    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
6 M4 y; i! e3 D. P" g/ H& z    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
, e; ]1 ]2 A; i( E+ l( w    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ: Y# S% N- [3 e0 |' D
#elif defined (RTC_CLOCK_SOURCE_LXTAL)0 l& b5 `  A) F! _
    rcu_osci_on(RCU_LXTAL);
2 C/ s% M: [2 r$ Y* A5 E    rcu_osci_stab_wait(RCU_LXTAL);! R! j$ @: n/ s3 \
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);0 _2 m& X$ N$ g  S1 l: s
    prescaler_s = 0xFF;- P  X9 y) E" A, f4 E! N
    prescaler_a = 0x7F;  e" x% I9 J3 i% x
    #else/ U- L# |6 S, g4 F
    #error RTC clock source should be defined/ _0 W! g% @1 O
#endif9 L: [6 N# N4 [) m) N2 c
    rcu_periph_clock_enable(RCU_RTC);
: D  V' O. A0 ]1 ^, ?6 z! ?    rtc_register_sync_wait();
  J; ^- Z% M# r# p7 E/ `}) Q0 W& h! ?. X! B

6 |( c) A; U3 j  ^/ Y% Q. t- O% {6 C5 |5 n1 h# L
void rtc_setup(uint8_t *rtc_buf)& z3 f9 [2 y/ [( L: f
{
4 `! x. J) k; p" B    /* setup RTC time value */
. t6 m) u& V  F( Z, Y. \0 P6 O    uint32_t tmp_hh = 0xFF;6 F+ p& a. x: g  f; `2 r+ ]
    uint32_t tmp_mm = 0xFF;6 {+ j, y) E3 w. {; m/ a* E6 Y  Z
    uint32_t tmp_ss = 0xFF;
: [% w& _; e3 E  S7 F: z1 w) b    uint8_t year_data = 0;
# _8 d$ F; r4 H1 p( x1 z    uint8_t date_data = 0;* x6 L, G2 `: S) v9 g6 f* G/ O
    uint8_t alARM_date_data = 0;! \3 b, n; f4 I) w5 N8 X# F* F0 |
2 l- I( \) C; ?* l
    rtc_initpara.factor_asyn = prescaler_a;) h7 h9 v* Y& l& E! n, `2 {
    rtc_initpara.factor_syn = prescaler_s;% b% S0 m& q# s! T7 W
    year_data = HEXtoBCD(rtc_buf[6]);- |4 n& I# g$ \1 R
    rtc_initpara.year = year_data;4 t) S7 ~3 s3 e% `0 e
4 ?) C8 J8 B, q% o4 q: X' `
    switch(rtc_buf[7])1 P+ Y" N" h' c- {) ]' T
    {4 m; L9 ~, W3 L* l, p: I6 r4 `# E1 U
        case 0x01:
# A1 j/ w6 O' L            rtc_initpara.month = RTC_JAN;9 i0 X; [5 ?9 i. O* m/ ?0 V5 a+ ~
            break;
: e$ h4 u1 R# N" o; f$ S0 L  J        case 0x02:
, |( W. V: l! ~+ @9 U            rtc_initpara.month = RTC_FEB;+ K1 m. j& z! M! a7 u3 E/ i& K
            break;
( R9 w- ^0 G' B6 I$ n* `% o) y        case 0x03:* ]( |' r6 P$ }* ?
            rtc_initpara.month = RTC_MAR;
/ M* A8 ~6 P! M/ j5 d# ?  V# E            break;0 n3 x, C: K, q; j8 ]
        case 0x04:4 a$ U$ L! l- ], [0 c
            rtc_initpara.month = RTC_APR;8 u  l5 b" T. X( G
            break;
7 }$ w. y& L1 u# ]& s5 E! n3 y        case 0x05:% t4 k1 Z8 u/ P( K2 ~' _1 R
            rtc_initpara.month = RTC_MAY;! X; N5 X- C, D5 v
            break;6 o+ Y1 i7 u( ^1 `" G& S& p
        case 0x06:4 i8 x8 g" a6 F- U$ j* |
            rtc_initpara.month = RTC_JUN;& Z* D; [) W! Z  A$ X# \$ l3 V( X
            break;- p; r8 [* A5 E; n, {3 q
        case 0x07:
# j) F8 a8 f' Q) O# I; d/ @  B            rtc_initpara.month = RTC_JUL;
- U1 q, Z/ ~# S, b7 ^, M7 ~            break;6 ^. @5 w4 H! X: s* b
        case 0x08:
8 h6 n. ?4 [6 R& `8 M; X% W            rtc_initpara.month = RTC_AUG;8 w' O& h4 x: Z. p) o! Y7 v
            break;( L- Z( R1 j3 m) ]' B! j# a, A
        case 0x09:: f0 t. q6 m/ q7 t
            rtc_initpara.month = RTC_SEP;
6 K- N+ Q; |# W& b! `# @* ~            break;
1 y  f" A$ E5 w" j        case 0x0A:
. o8 Q. W7 f) ?1 D5 X            rtc_initpara.month = RTC_OCT;
+ m% \0 i; _4 G) f( f8 ?1 l            break;: G9 _( W; [8 p# z* D5 J- c
        case 0x0B:
& \, g. q3 Z! `2 z7 ?            rtc_initpara.month = RTC_NOV;
6 O- y) f- o! ~! r, d            break;, b% ]: _( E8 R
        case 0x0C:, O. d5 B+ q6 Q% b& m/ C  y
            rtc_initpara.month = RTC_DEC;
; J  ^; ^/ `% d8 S1 p+ Y            break;5 u9 s( i! \4 a" p
        default:
# O; V2 a' N9 A; p, ~* v            break;) H5 G4 F2 s" z$ G; T
    }
* ?2 ^7 S! Y2 Y# Q- c. F% Q0 n    date_data = HEXtoBCD(rtc_buf[8]);3 v- H) E' k3 g. e: [. s: ?" N
    rtc_initpara.date = date_data;
' I! ]( S5 D0 `# v    switch(rtc_buf[9])
7 T4 x6 n) i' x( u8 I9 f+ H    {
" M5 J( w, Q5 e: x# r6 @! G        case 0x01:6 [2 b* p' Y7 e
            rtc_initpara.day_of_week = RTC_MONDAY;' B, o7 r  p3 D  @7 G
            break;
5 L1 R0 ^6 P% V  s& E        case 0x02:: `3 m& M& T3 ], [/ a' ?/ W) d
            rtc_initpara.day_of_week = RTC_TUESDAY;9 a/ N+ }  D: Q) `- h, w* N* u
            break;6 o7 I4 Z/ Q& X) D5 G' \3 [
        case 0x03:
% ~9 n" Y; v! t# v9 q4 \# o/ b            rtc_initpara.day_of_week = RTC_WEDSDAY;5 F# p0 g' v3 s5 f6 ^9 a
            break;
5 e4 b, d! r. W( n1 d  v& N: X        case 0x04:6 R1 V3 B+ z3 ]! V
            rtc_initpara.day_of_week = RTC_THURSDAY;9 H4 i* m7 \- N' l: \7 l% v! h
            break;5 b! k) `  E3 N8 i- m1 x% W7 n+ e
        case 0x05:
" a! a5 W, h: y! B% w            rtc_initpara.day_of_week = RTC_FRIDAY;
( c, |( x  Q+ A1 a2 g            break;
7 r+ i4 g7 j3 R' N8 t* x) ?        case 0x06:4 K" a, m: ^$ q1 ^, ]$ a) x
            rtc_initpara.day_of_week = RTC_SATURDAY;
5 q  r2 C7 H5 L6 I2 m: o            break;4 ]2 _- p" l+ n- p+ U6 S
        case 0x07:
& G: u# ~7 o7 V2 P8 Y* L            rtc_initpara.day_of_week = RTC_SUNDAY;! }* X7 P; l' d5 e5 c& Y: @& p
            break;" V4 ~; l+ R) _$ D
        default:
/ w( r- g3 ?& N4 t0 y0 I, P5 A$ ^            break;) o* R7 G. U" R  Q6 m9 d4 Z
    }
9 i. ], @, C1 P3 j( q    if(rtc_buf[10] == 0x00)) P+ s0 ~2 h/ T- r7 O0 _
    {( K& h3 K# \$ r! i: w) U! P
        rtc_initpara.display_format = RTC_12HOUR;
6 D: y; D8 y  `4 y% Y6 c5 a; N    }5 r- p$ W% }0 a' j3 A$ b7 i
    else if(rtc_buf[10] == 0x01)  e* T/ h8 L( j2 O2 Y: d. h: n# s
    {
: x  `/ l% A9 x  S% _        rtc_initpara.display_format = RTC_24HOUR;
+ o- I* i! D- c+ j  e2 {8 }! f    }
, X# V+ {. \# h) O. ?9 g4 v    if(rtc_buf[11] == 0x00)
% Y& H: x% @7 ]0 L; G" z    {' z/ e8 y8 X" F& j9 c, @
        rtc_initpara.am_pm = RTC_AM;- z' Y! v( p: q- f8 N$ `+ C8 d: a6 k
    }
  O/ e) G1 e; r( m1 b( t3 g    else if(rtc_buf[11] == 0x01)( y9 k3 ?1 f# k! g2 E' ]7 K
    {/ ?7 m+ Z" z7 Z' ~
        rtc_initpara.am_pm = RTC_PM;, h+ j. [; e4 y: u
    }) v# j+ b3 ^" S/ J! \
    /* 输入当前时间 */
" i+ O5 I; P: I5 I    while(tmp_hh == 0xFF)2 j8 J" [$ o. l) P7 S7 W3 r; y
    {1 q$ o4 i7 U8 d( _2 A0 r; S
        if(rtc_initpara.display_format == RTC_24HOUR)* I$ D% z- ~; |$ j% E- s4 g2 y
        {
2 o  w9 ~. M" {) i" v8 x            tmp_hh = usart_input_threshold(rtc_buf[12], 23);0 I8 E" v. q" q. j
        }0 a4 S; Z8 I5 ?0 N! Y7 b
        else( S) G9 Q* k* u4 D2 q' j
        {4 f: u7 Z$ u3 e4 ~
            tmp_hh = usart_input_threshold(rtc_buf[12], 12);3 W+ Y7 g0 R- e0 j0 v7 z' h
        }
2 @0 e  j9 p! V! I# g        rtc_initpara.hour = tmp_hh;
- H* v( O' t/ r" a. t/ u- H    }
2 i2 u" ~$ Q+ a/ Z" I# p  x  G, @
    while(tmp_mm == 0xFF)" v" _2 }( g! k5 t7 A8 Q9 ^
    {
  o8 V4 x7 z7 ^0 W        tmp_mm = usart_input_threshold(rtc_buf[13], 59);
( M* d! |. \0 d- v; k        rtc_initpara.minute = tmp_mm;
: b) w& W  a3 e    }9 [4 }) z! k  ]% X$ o+ Q1 [
    while(tmp_ss == 0xFF)
+ u  J1 \! x$ q3 j/ W1 W    {
$ t5 |. E0 ?( V7 k        tmp_ss = usart_input_threshold(rtc_buf[14], 59);  X$ u1 z- L5 l8 X2 R. Q% X) ~$ C
        rtc_initpara.second = tmp_ss;
4 M9 o1 L! p( E% M) ~$ Y    }
" n# j, s" l8 ]
& i/ v" L( K6 @( \  c* g: E1 M    /* RTC current time configuration */- l. t& [) G2 `" R' w
    if(ERROR == rtc_init(&rtc_initpara))
( e+ @, p* _+ k    {1 h: R( L, T2 |1 L8 e7 C, b3 S1 y
        printf("\r\n** RTC time configuration failed! **\r\n");. ~7 _4 x  G0 {3 g6 d) R. c' T
    }0 K) I% f1 k8 }  ^
    else  z$ t1 j, D6 N
    {4 M+ j( f! }6 x5 v6 L) }
        printf("\r\n** RTC time configuration success! **\r\n");- W" Y3 s" g6 z7 @
    }
% Z# a+ e' y) ^- z8 f
8 p; u0 H/ z& n0 q    /* setup RTC alarm */! v% b/ u; P* v6 @2 ^* u4 a, e+ `
    tmp_hh = 0xFF;1 V1 ?* c; l. g3 ]7 P0 Z% c
    tmp_mm = 0xFF;/ I/ `& A, |' ~, ]0 ?* r* A( m% X
    tmp_ss = 0xFF;3 y% U8 W5 y4 b" {5 [2 Z& g
2 S8 Q* f9 v% W3 g; U5 N! H; c
    rtc_alarm_disable(RTC_ALARM0);
1 Y8 B8 y+ T$ Z* ]: w1 N    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;8 U( \1 x6 e4 g
    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
+ \9 x" v- h. R/ U    alarm_date_data = HEXtoBCD(rtc_buf[15]);, i. ^0 a: C1 _, l' |  F$ u' M
    rtc_alarm.alarm_day = alarm_date_data;
2 j( M  c& x, Y    if(rtc_buf[16] == 0x00)
% G( ]; o+ [7 X/ B/ A# r    {1 \  }9 ]0 a* f, X! k2 a, C& u( g
        rtc_alarm.am_pm = RTC_AM;3 t) }% m" y% r7 e
    }
8 `" R4 N! ~( N. E    else if(rtc_buf[16] == 0x01)
0 F0 {7 f4 T# U3 b, ?! R    {
3 Y* g. N8 Y  b7 p2 q* \. c        rtc_alarm.am_pm = RTC_PM;
. `  R' z  |: r/ E) {& v4 u    }+ m& F( `5 [$ R' Y) D
    /* RTC alarm input */6 s# j  }, X& u! K( P. j4 l
    while(tmp_hh == 0xFF): D. \0 Z- E' i& j' b
    {, k% c; H; K0 }' e+ B, `' N
        if(rtc_initpara.display_format == RTC_24HOUR)1 A* O/ F* m' Q( T$ `" x; t
        {- a1 [3 K, V9 M" ~$ S* L' h5 V& G
            tmp_hh = usart_input_threshold(rtc_buf[17], 23);
, C! s9 t0 ?  r- h        }( A% j8 F8 e+ v- c+ l6 @' X
        else  x: N8 m5 v9 a
        {2 g, x" T4 B; d- i( B; L
            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
. f$ C4 J$ e6 I# W( _9 V        }
' Y# M8 ^! H- ]0 f        rtc_alarm.alarm_hour = tmp_hh;5 w, j( r. ]; j' x6 L. a
    }: f! D2 [5 w( Q. @: A. d
  h; b5 [1 I9 Z6 N$ d8 N
    while(tmp_mm == 0xFF); U6 Q! E2 |. k. C! z7 b* ^
    {
0 x9 X8 \5 U. D8 _6 d        tmp_mm = usart_input_threshold(rtc_buf[18], 59);
, t) q/ H. m3 L        rtc_alarm.alarm_minute = tmp_mm;
: |8 y7 i5 K& Z6 z' E# u    }9 t2 M/ D, B4 F1 i. H4 @/ d
    while(tmp_ss == 0xFF)
; ^( k# p; b7 R+ D    {2 j% N) B- Q- K, Z% i" }4 d
        tmp_ss = usart_input_threshold(rtc_buf[19], 59);
/ [4 f2 i* x5 [- {6 H0 L3 q        rtc_alarm.alarm_second = tmp_ss;
1 N, N$ j: M0 r/ T) Z2 {1 l+ p    }
' F- u6 x" |6 `: u" C, A+ {0 y* }* z6 A  j; e" F
    rtc_flag_clear(RTC_STAT_ALRM0F);
3 _, }( o6 \) }3 Z+ ?% _- g' G2 \    exti_flag_clear(EXTI_17);  I" J* B9 R: ~, J) |- e$ [

, |$ S# y" |# B- P) e    /* RTC alarm configuration */$ I% G0 M. z4 d
    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
7 m5 d) P: k0 V# N6 j    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
1 M( w2 Q/ j3 U, e, c    rtc_alarm_enable(RTC_ALARM0);' P$ q6 F: y9 i' M$ h5 L6 M$ V% t

; H% z4 b" \0 a$ C: M* D. Q* r    /* RTC alarm interrupt configuration */9 ^3 D$ c8 v/ K2 w* `% E; b# z
    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
9 ^- `+ g+ D5 {# g    rtc_interrupt_enable(RTC_INT_ALARM0);0 j. [" ?+ m( G& J7 C
}
, J) f# X5 {8 y3 c
: T5 R% R; A: m& @+ e3 \2 @4 E9 Yuint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
; |' K; p5 ^) F$ l: N% `" p" P{
. q5 N" i8 A& L3 T/ P& ~0 T& }    uint32_t index = 0;
' ^$ H2 I1 `7 B5 F3 C& d  e    uint32_t bcd_data = 0;
2 O2 F5 ?4 o: L8 V" D* L8 x+ V
! y  q+ F; B5 Q4 @$ c4 D/ n7 R    bcd_data = HEXtoBCD(buffer);/ p; x6 f8 W& S! B
    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
# _+ e1 }/ }0 F8 A9 m$ v; o    if (index > value)- F0 Y) o: J3 m" x0 d* }. J: w
    {
% G0 r$ I* n' m" N- j4 T        printf("\r\n please input a valid number between 0 and %d \r\n", value);
6 o& m, Z" [6 x# G% Q0 z' J8 Q        return 0xFF;
$ q0 n, b' X2 n    }
1 K$ C: U. ~8 H0 _3 }+ L5 W1 s    return bcd_data;
  V# D/ R. I) W' l' V8 V5 O& K}0 S$ C3 H# R- x# r! ~
% S  E: j3 M+ c( W3 _) k- X8 v5 k

$ a$ `' S7 p  |$ D& e/ |unsigned int HEXtoBCD(unsigned char hex_data)+ Z9 t+ B8 o' L/ w1 |8 G' S
{* u* |7 t9 u5 ^7 ], }+ B8 R) d
    unsigned int bcd_data = 0;
  d5 X1 w# ]7 H0 e' O    unsigned char temp = 0;
) J( g' Y# V1 J. K, Y
! P  g8 f" m; U. E$ V' Q    temp = hex_data % 100;: L* x. `* A' ~' J' Q
    bcd_data = ((unsigned int)hex_data) / 100 << 8;, p. q( R( g/ v; j
    bcd_data = bcd_data | ((temp / 10) << 4);
- h6 b" t" h+ |( B    bcd_data = bcd_data | (temp % 10);$ H! c: B8 ]! y7 I. @' W8 {3 q( Z
    return bcd_data;
- X+ `1 B6 K1 z' \: r4 r' w# e) ?}0 ^" m3 P5 P' Q7 o3 Z$ _5 h! z# y* z
void RTC_Alarm_IRQHandler(void)
& o6 N" z$ |+ ~" F{5 H6 I8 @! [( `; T8 }! I5 S) X
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;- f# s" @1 p1 I. G& `' y. ?

  P. Q$ \5 f4 c: `6 s0 J/ ]* t    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
4 X7 x  ^2 S, U# F) k3 f    {
& s" N; W6 O5 ]" j) q6 x# ~# Q        rtc_flag_clear(RTC_STAT_ALRM0F);2 ?$ f' G$ N1 v( T+ ~- @
        exti_flag_clear(EXTI_17);
$ Y$ f. ]/ h& v+ c1 ^        rtc_alarm_disable(RTC_ALARM0);0 O' F/ j: F" e+ C$ {" ], f
        led_toggle(LED1);
! x1 u& }+ b2 \) v1 S    }
% Z2 i- @* B. x3 G. u# D2 E/ R7 \}, R; D/ O" R5 s  G% O

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);
, F/ k3 ?4 c5 w2 h" w& s' c! c) @5 I- `* a7 J% @
注意这句算法;8 y7 c. h) J: H( G; g* O
保证:1.  每次叫醒后,本标志被清零;
6 H+ i2 N) v2 d$ u" Y2 R         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;
) d4 _8 o  ]8 K9 U如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-14 05:48 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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