| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。1 e3 K3 J$ R* y 
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。 
" M. J  w* R  _+ qvoid rtc_pre_config(void)+ |& V% C. D3 {' V5 K 
{ 
6 t  w" ?; O+ |9 b! y! a" q    /* enable access to RTC registers in backup domain */# u5 z9 l  o  l: ~ 
    rcu_periph_clock_enable(RCU_PMU); 
" o, ?- b" g* B9 [    pmu_backup_write_enable(); 
$ C& J: ^: R6 m) D/ z 
$ {3 j( H6 X6 ]$ W. u; z#if defined (RTC_CLOCK_SOURCE_IRC32K) 
& }& t: a8 c7 [, ], L( v( k3 v1 d    rcu_osci_on(RCU_IRC32K);8 @. e/ w( {; W7 j 
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K)); 
- k% d. k) K; w7 o$ s- c  |    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);$ p/ p3 e; s6 V, m$ R, n) y7 C 
    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ 
& {, D  ^" a7 ~; h    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ 
$ G# d9 I4 L1 t#elif defined (RTC_CLOCK_SOURCE_LXTAL) 
" c* D6 ~4 X; y0 w    rcu_osci_on(RCU_LXTAL);* l  ^# V3 t6 D6 j) c2 ]1 v6 i2 D6 Q 
    rcu_osci_stab_wait(RCU_LXTAL);4 Y; O' d+ z/ i" Y8 I; M 
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);& T9 `0 n! F6 j) G7 i' p( G% V 
    prescaler_s = 0xFF;+ \; L  l" `6 O  b# S 
    prescaler_a = 0x7F; 
& x3 c) c, z, N# k+ T/ D    #else( z! T; a/ z0 @: S9 Q' G 
    #error RTC clock source should be defined 
2 r& r, ]* f! l+ [& V9 p#endif 
6 t# q2 l7 G6 g- ]/ w+ K    rcu_periph_clock_enable(RCU_RTC);7 f; k  x) v# |7 L 
    rtc_register_sync_wait(); 
6 g8 V7 u* J5 Q3 G+ n0 [} 
: m1 c" H6 |7 X4 O0 K8 V2 {0 u 
2 k0 o& E$ S; y( u7 A6 [ 
% w1 [1 n6 s3 w5 d6 V$ M* kvoid rtc_setup(uint8_t *rtc_buf) 
8 F7 v! f4 X- [2 d/ d; w- o{- v0 l% A5 O3 W3 J4 O 
    /* setup RTC time value */4 [; u( k; @  {7 J* F7 U3 L 
    uint32_t tmp_hh = 0xFF; 
. m1 I7 P: Q0 t5 o+ ]    uint32_t tmp_mm = 0xFF; 
5 \1 v/ ?) m" F- l    uint32_t tmp_ss = 0xFF; 
* k0 y+ [3 D+ N    uint8_t year_data = 0;% ?. |! J% B' Q- k 
    uint8_t date_data = 0;4 O* V: `9 S/ s+ y4 k4 ~# h 
    uint8_t alARM_date_data = 0; 
: G3 k. d, e+ q/ a9 [" U* v  Y1 @( w 
    rtc_initpara.factor_asyn = prescaler_a;2 J2 Z& r* D* |0 Z9 U/ A8 F 
    rtc_initpara.factor_syn = prescaler_s; 
+ i" b- h" H+ Q. {% F/ ]    year_data = HEXtoBCD(rtc_buf[6]); 
2 E" z1 ]( f4 G3 B( I9 G% e    rtc_initpara.year = year_data; 
) z7 @3 a' u! b& M# i8 M 
# m" g$ g! Q" i' a    switch(rtc_buf[7]) 
0 k; N! U. w, `- C    {, l! I$ k9 ^# a& L: N8 N% H 
        case 0x01:: H: p) P2 b; i7 l 
            rtc_initpara.month = RTC_JAN; 
( x2 {+ \$ N3 [& D  @9 \9 \            break;' a/ S& Q( W* F6 J& w# B 
        case 0x02:7 S9 T% p0 E) z+ L% A3 h 
            rtc_initpara.month = RTC_FEB;( W1 ]* y* L4 u' q* T 
            break;! G5 A+ A7 S, a& C0 s& E 
        case 0x03:0 n5 V* H. @' V% R- F% x( `( L( f 
            rtc_initpara.month = RTC_MAR;  H# A# B( M5 D' U5 v8 x9 n 
            break;- N! x- l. o+ D 
        case 0x04: 
+ x& S% \! w3 T0 C2 x3 `            rtc_initpara.month = RTC_APR; 
: ?; s* D! z* s/ }            break; 
% r9 Z! ?/ U+ f/ U, `. R+ y# e8 ]! D        case 0x05: 
  o; b9 K( \3 D3 {" V0 \8 M            rtc_initpara.month = RTC_MAY; 
1 s- t7 R3 Q8 `            break;, O4 v& Z7 R; @ 
        case 0x06:9 f* V7 C: v5 W8 {. d 
            rtc_initpara.month = RTC_JUN;3 F- ~$ ]8 h1 Z' W& G) Y$ W" G 
            break; 
7 M8 c# c: C  g1 w        case 0x07: 
4 d- ^- w  l% U7 n$ s3 K# l            rtc_initpara.month = RTC_JUL; 
% `( V0 h; i* r            break; 
0 l4 N" D, V8 F5 i4 e# C' ^        case 0x08:) f3 ~5 y' g: z8 i. ? 
            rtc_initpara.month = RTC_AUG; 
1 v" a7 j3 C' N            break; 
, d. l* Q, L- S+ C* y& b( x  K% j9 M        case 0x09: 
, B0 K! p2 A; ]5 I) ~            rtc_initpara.month = RTC_SEP; 
9 V% ]6 D6 q* ~( [0 T  f& s. L5 k9 K            break; 
. ~. ?: [, m3 w. A2 A9 I        case 0x0A: 
0 R: _5 c$ E$ @! [            rtc_initpara.month = RTC_OCT; 
; Z; m6 l1 |1 J8 A& d+ w' x7 K            break; 
1 w7 m* R* ]" U5 X9 P4 P        case 0x0B:( Y4 L1 A6 c5 l' S/ t9 p& R 
            rtc_initpara.month = RTC_NOV;) e3 S7 d, X' P 
            break;3 B1 U7 {3 y0 j  s! D# i3 o! B6 `0 g' X 
        case 0x0C:1 d+ S/ a# b/ \6 h/ P  Y. ]  T 
            rtc_initpara.month = RTC_DEC;% [, @! I6 z  z 
            break;4 f) n( {4 z1 _" v6 ]6 i: X: \" S 
        default:- y" r1 t) m( U" ^+ V/ T 
            break; 
( [, d9 V! n4 k# |    } 
  D5 w  p, c3 g  Q5 C0 c    date_data = HEXtoBCD(rtc_buf[8]);" U9 t+ e; z# P 
    rtc_initpara.date = date_data;) S% T" m3 H0 ]. R 
    switch(rtc_buf[9]); M$ C# C" Y' p7 ]+ Y. z 
    {3 i& z2 e) n- \9 ? 
        case 0x01: 
0 T* J# c6 a+ ?8 @  [# ?; [) J+ {            rtc_initpara.day_of_week = RTC_MONDAY; 
0 ^+ _  }* O! ]+ B# _            break;7 v6 a. x4 i5 q8 y$ r6 S 
        case 0x02: 
8 Y/ g  b$ f+ }3 s3 l            rtc_initpara.day_of_week = RTC_TUESDAY;& p$ ~7 z" d& w9 a8 O* \ 
            break; 
  b; M8 n3 S$ d; u* ]+ i) x9 M) A        case 0x03:, T" `& `; S7 P2 h/ b! t7 H+ } 
            rtc_initpara.day_of_week = RTC_WEDSDAY;3 e+ I% t  W3 @2 _ 
            break;% N$ u; I; t9 c9 }$ ~ 
        case 0x04:; h& S& f& F% n* u0 m' Z 
            rtc_initpara.day_of_week = RTC_THURSDAY; 
0 w1 {' C; p& {0 G+ L: g            break;4 G" U* y0 v; u( C, G( g8 m3 Z 
        case 0x05: 
  X& A) Z. n' ]+ f7 z& d- M            rtc_initpara.day_of_week = RTC_FRIDAY; 
% Q" j+ |" i8 F( B6 `* X. a            break;5 D9 l) [! E; f) q( Q% W. [ 
        case 0x06:; \& S; P# W; P- ?# u( R 
            rtc_initpara.day_of_week = RTC_SATURDAY;' d$ X! O* z2 b- |2 A, r 
            break; 
! f/ x2 L9 ~# ~4 L        case 0x07:: l% a/ v4 g$ v' u9 Z2 M$ Z- g3 Y$ j 
            rtc_initpara.day_of_week = RTC_SUNDAY; 
: g; j! R- W) e            break; 
1 Y5 U  e* R& k! B) A) @9 c' t& s        default:9 H+ j6 g( u* ]1 y6 E, K 
            break;& E$ U" ]. A( A% @9 ]7 x- i 
    }/ l5 b# y; c. Y$ q! W% H* ` 
    if(rtc_buf[10] == 0x00) 
7 b; x, C7 X3 x    {8 p2 R; J  j/ ]  Y: S# J8 ?1 ~8 O$ d 
        rtc_initpara.display_format = RTC_12HOUR;2 c% g; z8 i4 J! _, }6 v$ f 
    } 
- @! o, `* A# z4 L5 h& N( S+ u, _! e    else if(rtc_buf[10] == 0x01) 
7 n: k5 h8 p5 @6 i: ?    { 
1 W& o" a" w5 R        rtc_initpara.display_format = RTC_24HOUR; 
3 x* T; w; T+ Z! _) U    } 
2 G1 n2 y' B- w$ e    if(rtc_buf[11] == 0x00): v" M: a0 o, D( r, l# w 
    { 
2 S, s: q/ b0 o; [  C; l' ]' I: t        rtc_initpara.am_pm = RTC_AM; 
: `" ^/ m2 W7 J( E/ ?    } 
7 |, m0 A! B% p% Q/ h  d    else if(rtc_buf[11] == 0x01) 
3 C9 V- }5 r; o. m+ e4 N9 _4 o+ _9 a    { 
: p$ f! v+ @! z; w9 j  e7 }* h% y        rtc_initpara.am_pm = RTC_PM;% `$ Z4 X& |+ m9 z1 A 
    }3 _$ s; _1 K+ C# C8 X 
    /* 输入当前时间 */ 
- G) b9 A4 G0 U1 h. D7 l    while(tmp_hh == 0xFF)+ c9 W5 S2 o2 b! M$ q. S 
    {- N0 b: S( T6 N4 J: Q: C* K 
        if(rtc_initpara.display_format == RTC_24HOUR)( Y: u; X0 V4 C; s+ A 
        {. F7 ^+ p" E& R0 f 
            tmp_hh = usart_input_threshold(rtc_buf[12], 23);3 w9 O/ ^; P1 Z6 s$ ? 
        }( M6 u9 v# B" m9 m4 }& ~' E 
        else 
+ a# ^/ ~7 U2 K        {- }6 d4 j; N1 X 
            tmp_hh = usart_input_threshold(rtc_buf[12], 12);$ l6 ?! s; f* X8 R 
        } 
' N$ G3 G' p6 |  G        rtc_initpara.hour = tmp_hh;6 I# q! @2 {! }0 X% o) b$ z' Z 
    }1 ~+ J0 C- t) `) p 
 
9 ]* ?1 j2 j5 D2 T5 |9 f! [! M. q    while(tmp_mm == 0xFF) 
/ [) `. S5 ]* i  S    {6 Q. m) F$ V! X+ J 
        tmp_mm = usart_input_threshold(rtc_buf[13], 59); 
' f" c  b& Y/ L8 w  I: Z/ z2 w6 q. i, y9 G        rtc_initpara.minute = tmp_mm;/ y: s1 y# T7 s" x/ o 
    }! W! Y$ |3 X+ ?7 Y 
    while(tmp_ss == 0xFF)- @. A1 N0 P5 L, u3 k9 k; I 
    { 
! X. W) L' x4 V        tmp_ss = usart_input_threshold(rtc_buf[14], 59); 
6 Y% h! |5 p* P        rtc_initpara.second = tmp_ss;- r( w- T3 z% w  [  a5 k 
    } 
( w* y5 h1 O" ?' k2 y0 |7 g" ^+ k" M, v 
    /* RTC current time configuration */ 
& \8 s: D% V  {7 j    if(ERROR == rtc_init(&rtc_initpara))1 I* A8 M5 W/ k0 X& \( H( B 
    {$ I! f6 ?% o/ v: j. L! F 
        printf("\r\n** RTC time configuration failed! **\r\n"); 
6 Q( |: j# }7 e0 y# R/ ~  C, o    } 
1 j; Y6 f1 V. w8 N: q    else 
$ c% r9 F6 M: {' X$ r4 |- V    { 
* k. P. {$ T5 w  Z        printf("\r\n** RTC time configuration success! **\r\n"); 
" o  g: I- u+ D# q  ^    }; g, h* Z& S" N, M$ p8 F 
 
" q3 V- {  Z( |4 {5 j8 t( P; M    /* setup RTC alarm */4 D$ o% e- c+ ^+ i$ d+ H+ z4 t 
    tmp_hh = 0xFF;" G4 q, u3 }4 k7 b! D7 ^' F 
    tmp_mm = 0xFF;' m2 l' \" Z3 n& ^ 
    tmp_ss = 0xFF;% s) C+ {) J4 e7 j4 Q) F' h! U( h 
1 i" ^5 h7 k" m; _ 
    rtc_alarm_disable(RTC_ALARM0); 
, {& v  E4 q' {- S/ P: e* [    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK; 
% \0 U7 l6 c! l0 X    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED; 
" _/ O. m) c6 g! E* B6 Z    alarm_date_data = HEXtoBCD(rtc_buf[15]);' c8 L8 @( t' f. a% `6 X 
    rtc_alarm.alarm_day = alarm_date_data; 
& A' T9 Y% B* M, Q  C$ @# }    if(rtc_buf[16] == 0x00) 
0 l3 v! k6 U" u7 e$ @5 k5 A0 V; d    {  {9 S. |9 g' K, F" x 
        rtc_alarm.am_pm = RTC_AM;# `! g- {) y  z* s7 V- P, R 
    } 
" E% a- U( T: l1 y% A7 w! c( W; M    else if(rtc_buf[16] == 0x01) 
! P5 `$ g( ^- S3 K9 s( C; R$ e: b' i    { 
+ d" O) k$ a' h0 b2 ^        rtc_alarm.am_pm = RTC_PM; 
2 @# b% |! o5 X    }1 ~% T% y& H& J8 r- i7 A 
    /* RTC alarm input */ 
. r/ s( n& \  X8 ~* K, q    while(tmp_hh == 0xFF)% v& G6 [' O0 ?( n# U+ ?3 r 
    { 
0 n4 Y5 \; f  n8 x9 J# ^6 q        if(rtc_initpara.display_format == RTC_24HOUR) 
0 T3 U8 f4 c& t6 \& D        { 
1 l6 o- g' S0 {3 Y- Q9 w: Y) ^6 p            tmp_hh = usart_input_threshold(rtc_buf[17], 23);5 H. T- }6 b% h' X! z' E, d, f5 g 
        }& L! P1 m5 Y9 M* Q 
        else 
2 d" x& q0 Q0 c        { 
' f4 Z- V& ]: x! z* d2 {" h$ g            tmp_hh = usart_input_threshold(rtc_buf[17], 12); 
7 Q& o+ p$ G  x7 x' E. I        }8 B: p8 x5 D0 y5 G0 N$ b 
        rtc_alarm.alarm_hour = tmp_hh;9 P$ b* `* u) d1 j 
    } 
4 c  u# d1 ?& v3 L1 G* d 
8 A6 p. f& Q) i: _+ J9 @8 ]3 o0 \    while(tmp_mm == 0xFF) 
. E. ~  p1 O$ t( y    { 
4 Z6 |$ A! ^" m6 Q        tmp_mm = usart_input_threshold(rtc_buf[18], 59); 
  h% o( i+ }1 E        rtc_alarm.alarm_minute = tmp_mm; 
, U  j4 x' l  @    }) o6 Z% W6 g5 {' R4 O! {7 s 
    while(tmp_ss == 0xFF) 
4 Z* r! }. i8 ~# M' o    {: @8 ^2 }3 d& l0 @ 
        tmp_ss = usart_input_threshold(rtc_buf[19], 59);) ~8 X% Q! F; \' o2 ^7 I4 K3 M 
        rtc_alarm.alarm_second = tmp_ss;  I7 R* H/ ?. y% o5 ] 
    } 
% w, I/ H2 j9 K 
  d! B% B# U$ t( z& H    rtc_flag_clear(RTC_STAT_ALRM0F); 
! I6 j+ q5 p. X# |, |! F! _    exti_flag_clear(EXTI_17); 
6 [- x6 h: Z! v1 t$ b8 ?& ]% G( X9 j  O9 j& d8 Y 
    /* RTC alarm configuration */; x- u# W7 i: g8 b 
    rtc_alarm_config(RTC_ALARM0, &rtc_alarm); 
, V4 @" @6 N+ u/ I4 c    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0); 
3 r/ ?: F5 M" }% N% e  M/ R7 k* _* i    rtc_alarm_enable(RTC_ALARM0); 
! p, P$ J. [' ^# {9 P$ a4 G  z+ z5 A) Z4 c' F  t 
    /* RTC alarm interrupt configuration */ 
* _6 F' w1 X: ~* L    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING); 
4 R+ f2 m5 {& O" d) l" O    rtc_interrupt_enable(RTC_INT_ALARM0); 
( k4 s7 h: U; ?} 
6 F/ t+ @* D) \# {5 P 
- X* @7 ~& J& q0 Z3 I  G) H7 Puint8_t usart_input_threshold(uint8_t buffer, uint32_t value) 
! N4 t3 I3 M6 {1 [7 C. k1 q# A0 \{ 
: |$ t8 b# G3 M, Q    uint32_t index = 0; 
: e7 u' r" o' Z4 j8 K1 h$ J+ w    uint32_t bcd_data = 0; 
7 b' _, J2 C$ E2 G- }. \# V# @, g$ Q8 S) ?: V( d; J5 Z  n+ |$ q 
    bcd_data = HEXtoBCD(buffer); 
% O/ |! }) _1 E4 J- w% v    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);4 n3 h# D& j% l: E3 U( m% Y 
    if (index > value)7 Q9 f3 f$ E9 ^. a 
    {& w% d" m7 ~! L  l& {7 Q. E 
        printf("\r\n please input a valid number between 0 and %d \r\n", value); 
- _! |% K) W; `- q7 L        return 0xFF; 
1 A3 S7 k" L* B. j    } 
' m. P  M: G) _" |' Z9 _    return bcd_data; 
) [7 ^0 N9 |# m- R  f: \5 t9 [' A}, V/ l% A( L0 q. ` 
 
" |; F; J; a' M8 W% s* q& T8 g' ~$ t! l 
unsigned int HEXtoBCD(unsigned char hex_data)! q8 k: S& H1 [1 V4 O3 d 
{* f7 F9 Z2 \; @6 X- a. u& T' C 
    unsigned int bcd_data = 0; 
9 l  @" h( k# b7 t% o; N    unsigned char temp = 0; 
& X- v% e% z" o8 I- c/ L% z 
0 R8 l9 ]6 h0 C, h# s4 c, c5 t    temp = hex_data % 100; 
. p* G' Z, w# h. D7 k& }% l    bcd_data = ((unsigned int)hex_data) / 100 << 8;/ e" B: s; \+ |* ~, @9 W 
    bcd_data = bcd_data | ((temp / 10) << 4); 
- d7 w) X) x7 _: B0 n6 T    bcd_data = bcd_data | (temp % 10);) n: y) `- R, ~+ y 
    return bcd_data;7 N' K4 B2 G7 m' V/ a: Q 
}2 e8 M) t7 j0 v; V 
void RTC_Alarm_IRQHandler(void) 
) g6 @8 \& r& H% s% s{* f! ~  v% J- l: m$ r& Z 
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;! B6 \3 B/ w# p) @4 a5 O' w 
( F$ o7 C# o$ R) ~+ r 
    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))7 }2 K! r" S6 ~5 N% |3 d! m1 |, ? 
    { 
' ?0 d. `. W, e# R  K3 V7 f        rtc_flag_clear(RTC_STAT_ALRM0F);4 M6 u8 C7 G# R7 n& j  }  ] 
        exti_flag_clear(EXTI_17);  d$ f+ l  g0 h* |' B+ E3 l  S 
        rtc_alarm_disable(RTC_ALARM0);/ B" ~) n: b. @ 
        led_toggle(LED1);& U$ _5 U, n/ A5 x4 C: D7 ?7 b 
    } 
$ a: Q5 i7 u7 }5 W9 ^' f} 
2 I% \+ O: V# \  S9 Z' O |   
 
 
 
 |