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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。
+ f& H, D2 L2 y# {. O以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
1 B& m4 a% c; H1 b; H9 ]3 l0 K7 j% }void rtc_pre_config(void)( O% H$ j1 p6 Z' s. V! ]
{$ z$ S. ~5 J8 H- Q3 z: o) O
    /* enable access to RTC registers in backup domain */
* O7 K6 {; C5 w, Y. s1 U    rcu_periph_clock_enable(RCU_PMU);
7 O6 F6 [# z% ~7 T4 V$ h9 K" g3 [    pmu_backup_write_enable();+ t4 Z3 b4 p, H
" @6 S, ]% C! J- a: v2 K
#if defined (RTC_CLOCK_SOURCE_IRC32K)
" x( i9 t& L# x6 O' e) m) D, z    rcu_osci_on(RCU_IRC32K);# ]. {( d7 `4 G: J1 h  M
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));- B. X8 m+ t; T' h# n) a  f
    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);: Z* O' n2 b% p; ]9 N
    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
6 T( S) G: f& K( l( t3 U1 b. u    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
3 j1 o' g; P# u# L#elif defined (RTC_CLOCK_SOURCE_LXTAL)! `2 W" H$ R/ L" j; I! Q* s
    rcu_osci_on(RCU_LXTAL);" Q2 R! p/ C6 k' a) a  I2 S
    rcu_osci_stab_wait(RCU_LXTAL);+ ~' z, g3 ?  H: v5 ]
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);0 z/ v, Q# \( J8 i; K
    prescaler_s = 0xFF;
# _6 O; v& f7 S) r# _5 h1 i: z    prescaler_a = 0x7F;$ [, \' \( z! ^% ^+ }) `
    #else6 p3 p6 Q0 u/ k  q# t8 A
    #error RTC clock source should be defined2 m% ^6 s. E6 X% u
#endif
$ j* O. @+ c$ f, H. R. r& Z* T0 D5 s! V    rcu_periph_clock_enable(RCU_RTC);, A  J& o7 `' A2 {7 E/ e
    rtc_register_sync_wait();
; q; |  h* }% G}: W, e2 H- B1 Y. {! i- M! u* ]- U

, n3 f. ~$ X/ I6 ~
# Z3 [* }- H& @% `# h5 h# ?4 [void rtc_setup(uint8_t *rtc_buf)
0 N6 i4 d4 t  e5 M{
& P& r0 ]( s; N: n) _; u    /* setup RTC time value */$ ^$ a: k' ]: Y
    uint32_t tmp_hh = 0xFF;
( ^4 g! r" F+ j4 H    uint32_t tmp_mm = 0xFF;0 Z& {  l. a& T  J; |$ U
    uint32_t tmp_ss = 0xFF;
' z, C* ~) W5 H: `0 m    uint8_t year_data = 0;1 W4 ^; C7 z0 D4 n# V" v
    uint8_t date_data = 0;
4 C- E# T4 i  @    uint8_t alARM_date_data = 0;
+ M+ E. {8 ^$ ^7 w- `! r4 ?1 W# J3 d- K& Z9 c
    rtc_initpara.factor_asyn = prescaler_a;: M2 N* F- a6 ?7 P5 I* x
    rtc_initpara.factor_syn = prescaler_s;
) h. M% I; b; a3 X% r    year_data = HEXtoBCD(rtc_buf[6]);
0 o$ q* \# [' }( N6 X6 [+ F& N    rtc_initpara.year = year_data;
* j( D, v4 p6 f& v( _' _( h1 b' i) u" c& Z2 b1 ~1 ^
    switch(rtc_buf[7])- H" m: ?* `" z5 ]7 h6 A- {* P4 B) o
    {
. v3 `. w  j# M" J3 a( e3 c3 r        case 0x01:
7 d6 ]( Q; C, \$ `. j            rtc_initpara.month = RTC_JAN;
' U) A! j2 V, d+ u: W* u) R6 ?1 }, m            break;
& Z4 c: S. l6 T* F( M' L/ ~6 t        case 0x02:
. X$ G% J, K' B$ s  s0 z8 Z            rtc_initpara.month = RTC_FEB;0 v: E- I4 \0 ]0 g. k
            break;
; H- ?1 _1 C5 O+ t, v7 Q        case 0x03:
( O9 d. _; O' ]( t9 c            rtc_initpara.month = RTC_MAR;
; Q! j/ `0 S3 v' W# r! x+ J- r            break;; K( J! f9 [9 d1 A  ?5 l8 U9 r% ?
        case 0x04:
: d0 _0 @, J( r; K1 z/ Q            rtc_initpara.month = RTC_APR;" J4 Y6 u. @+ U8 \
            break;: h9 e, b, q- A+ q- ?$ z" Y1 y/ e
        case 0x05:
0 W9 ^+ q8 C3 p8 Q; \9 R            rtc_initpara.month = RTC_MAY;
- h+ Y5 D% ^" _- D, c" I7 O. W, R            break;
2 D/ t8 k0 H1 s/ g        case 0x06:# m+ u  Y8 L. u; e, X- i' \
            rtc_initpara.month = RTC_JUN;* I, o* M( b3 W
            break;
" q4 X" l4 I2 U5 U/ j9 r        case 0x07:
( v1 h( Q! N+ p4 [2 r* U            rtc_initpara.month = RTC_JUL;. B, T; R' g  [# u, J3 Q
            break;# m8 h  y: D6 k) v. V! p) O/ X( ^0 S
        case 0x08:
6 h& J' z$ k" J) t" O+ _8 \            rtc_initpara.month = RTC_AUG;
5 e3 a% d) G+ P$ F; n            break;  G5 _) t# T! a" F9 ~% |5 s) y
        case 0x09:
6 Y" s- \: J9 @' d            rtc_initpara.month = RTC_SEP;$ ]4 `9 v$ d9 m8 |$ Z
            break;
* |% ?3 l* o2 u$ b+ w9 H        case 0x0A:# L& U/ a& N' `3 `* O. P
            rtc_initpara.month = RTC_OCT;
& ~3 b2 v9 F! ~# Z- G4 H) S. e8 Z1 T            break;& i+ ?* W* c  V2 Y
        case 0x0B:& }* S. P$ w/ Z7 H" Q
            rtc_initpara.month = RTC_NOV;
: ^5 A  P% M  h! m            break;
4 g3 w( q: ]$ ^( U: W        case 0x0C:* I# c  Z5 ^+ S7 V8 {. b
            rtc_initpara.month = RTC_DEC;
3 S) x" H& b+ f6 w- n; F( m) U            break;& x- l) X8 O% w9 e; i5 l
        default:. t; j& C" w1 l) J
            break;2 \& y+ |* t  \9 T: q# i
    }% l+ y, z3 G: O, J0 u* T
    date_data = HEXtoBCD(rtc_buf[8]);; e& _# s, K5 _$ A2 ~; }8 J: n
    rtc_initpara.date = date_data;
! f- X: z7 y0 Z  H+ F3 a    switch(rtc_buf[9])
9 a/ k! ~5 ^  r9 R/ t8 ^    {
9 `! `: j4 W: U* d9 N4 ^' {        case 0x01:
/ w: ?& M3 e  J, C- d            rtc_initpara.day_of_week = RTC_MONDAY;
% U6 F) u6 I4 D/ W5 f            break;
+ E- y& f2 a* {& j        case 0x02:* g- E3 |8 q4 ?2 M8 l
            rtc_initpara.day_of_week = RTC_TUESDAY;% n; t* a6 }; v1 g% y1 J
            break;. g9 C( H# W# ^* M, A7 K
        case 0x03:  ^" `- D. ^+ a+ Y* e
            rtc_initpara.day_of_week = RTC_WEDSDAY;" z; l5 `! c" F7 g  x! M
            break;* r$ F5 {, V8 r& r6 c3 ^! A+ y/ }
        case 0x04:; N4 k0 P4 d. K7 F. s% ]9 _# U
            rtc_initpara.day_of_week = RTC_THURSDAY;
+ O7 P1 w, r$ l: j! _8 c            break;
9 q( [" O8 q  q" g        case 0x05:2 [; P4 w# q( y2 P, Z! D
            rtc_initpara.day_of_week = RTC_FRIDAY;
: D0 q3 k5 o5 b; A9 |# r" v            break;
1 ?$ g5 z' V* h- }3 }, w9 W2 q        case 0x06:( K3 P( }( k7 ~  g
            rtc_initpara.day_of_week = RTC_SATURDAY;! A  S) U4 N0 I
            break;/ M6 G+ e( }2 i4 O/ U" h
        case 0x07:
2 V8 m( ^0 Z3 w1 o! I( O; J! x, i$ {            rtc_initpara.day_of_week = RTC_SUNDAY;
  O6 e# [- t5 w# Q; Z" `            break;
& L; C& ]. G# T# B        default:
0 h* m, Q. M+ |            break;
9 s9 R8 z9 D' j  Q" f& b    }" ]# M$ x8 ~6 a. p# W, N
    if(rtc_buf[10] == 0x00)5 S9 }/ M" Z4 _! G8 A, v
    {
: O( t8 x1 U2 m        rtc_initpara.display_format = RTC_12HOUR;/ |  v: j$ {9 p" f4 a3 H7 g3 D/ Y
    }
* B7 x4 P6 J' `0 n; V, |# n2 S    else if(rtc_buf[10] == 0x01)
- }/ k' O' b- t& v    {
: K& v  y7 f; s        rtc_initpara.display_format = RTC_24HOUR;
5 G% Z% E$ }6 ?. V    }
( X7 x5 ]. h& N: w* g    if(rtc_buf[11] == 0x00)1 q8 o- g" h: D6 L+ a
    {
) ]& Z. a0 f: y) P4 i        rtc_initpara.am_pm = RTC_AM;2 p- W5 [2 C& M* ^8 l4 b& o
    }
1 r- a  s: }/ ?4 B. B+ v, l    else if(rtc_buf[11] == 0x01)
7 m8 T; T) k# Y% X& w    {7 P3 X+ f4 P' H% w
        rtc_initpara.am_pm = RTC_PM;
8 }! N5 f2 j4 t/ U! S* Z    }4 q! i6 K  D/ Z; u
    /* 输入当前时间 */  g+ O* \" |( x- \
    while(tmp_hh == 0xFF)( n, g! K* F7 ], F. S$ [
    {6 n. o+ E8 w' C" y- s
        if(rtc_initpara.display_format == RTC_24HOUR)3 E6 q& g3 ?3 |! j
        {& s0 O* P4 A, E5 ~# }
            tmp_hh = usart_input_threshold(rtc_buf[12], 23);( K0 O7 i# E" ], y0 G  \. M
        }
/ [. R; [7 Z9 k% _* N        else( v" T6 }4 z, {; H
        {
: l! G3 ~7 T/ j2 n" s. ?/ [            tmp_hh = usart_input_threshold(rtc_buf[12], 12);# t' g) T' j- X7 k) a4 z2 ^
        }$ m+ N1 W5 x5 z  W! |3 C
        rtc_initpara.hour = tmp_hh;
$ r! c/ R+ k  D" v    }
  Q5 Z6 W4 D, q- t' ?" |9 r' y3 P9 Z- M% L& h
    while(tmp_mm == 0xFF)
0 `& h- E, W3 q! Q. d    {
" p% h1 ]# d, J) v        tmp_mm = usart_input_threshold(rtc_buf[13], 59);! x4 J& \, H2 u% T4 ~- ?
        rtc_initpara.minute = tmp_mm;
9 q- B" ?% h0 g    }2 B) }! z- x  E0 I
    while(tmp_ss == 0xFF)3 J" H1 Q* I5 @: `
    {* U9 n) c7 N8 W/ z0 v4 c1 F
        tmp_ss = usart_input_threshold(rtc_buf[14], 59);
2 a! [' x1 [7 c" @" \2 M        rtc_initpara.second = tmp_ss;, I' D. U) [% p: Q1 W; ?4 I
    }
% d5 O2 F: ]# X( O( F
6 u, \: q7 m" E    /* RTC current time configuration *// {/ v/ x0 a* ]
    if(ERROR == rtc_init(&rtc_initpara))% Q' S  A. S, V& ~5 V5 M
    {
$ P# u" V4 r: d  k        printf("\r\n** RTC time configuration failed! **\r\n");" g4 O$ \7 o( c+ r* T0 r
    }
* [/ C0 Q3 v$ A5 C7 ^    else4 B7 w# G2 L8 x8 [. N
    {
  p$ B0 X& X8 V" y* Q  J/ L- `        printf("\r\n** RTC time configuration success! **\r\n");
* i7 C# m0 ~+ G* c6 W    }8 H! T% L: Q4 f6 H: v9 _
6 Y! g, j% `8 K' [
    /* setup RTC alarm */
" }. \! O3 }& P: r' p! G2 `! q4 b1 ^    tmp_hh = 0xFF;2 n  c2 g% e0 u& w
    tmp_mm = 0xFF;) v+ X# i- j& Q! @# c" e8 _9 j
    tmp_ss = 0xFF;$ j" j' U9 Z* M3 k: C2 B- [

, }( o" ]; A" U# ^. D5 I    rtc_alarm_disable(RTC_ALARM0);
* \" {# J/ E8 v    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;# B5 L" S% p$ s/ ]6 L( @2 k
    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;4 i- |) k1 F  r" X2 P8 D1 u
    alarm_date_data = HEXtoBCD(rtc_buf[15]);
' _: ?! [: i# \& T0 W! w    rtc_alarm.alarm_day = alarm_date_data;
! p" @3 s/ [7 C8 M! C8 i; m    if(rtc_buf[16] == 0x00); D5 C. _6 P& M7 Y/ N# S
    {+ s, c+ ?( H# y& J" c% h! E% V  l
        rtc_alarm.am_pm = RTC_AM;- {& h5 Z2 w5 y7 d+ a
    }
7 W' B4 f. {% Q) R4 k    else if(rtc_buf[16] == 0x01)' J: j  I  l  e; O3 e( ]
    {
$ Y3 G$ Y* L6 [( U        rtc_alarm.am_pm = RTC_PM;. p  m$ r5 r2 A; E9 c  U9 U; m) Z
    }( ]6 z6 I6 r  A! N" H# I/ k5 M
    /* RTC alarm input */
9 h0 L8 u$ r1 k0 k& G    while(tmp_hh == 0xFF)
4 }7 p4 l* W7 g. n    {5 y/ t! [8 f; R5 F! d9 M
        if(rtc_initpara.display_format == RTC_24HOUR)5 T5 d+ I  l3 j* }" D
        {( `9 f2 J* \7 I) t5 \
            tmp_hh = usart_input_threshold(rtc_buf[17], 23);
, V# k$ E4 r) t        }& n* h7 M3 w# F6 c- v, H# u
        else: k: `7 m7 h& i  l+ L7 {* p
        {
) S: g5 _' p: o3 }, f1 O            tmp_hh = usart_input_threshold(rtc_buf[17], 12);+ ]  v: p2 _9 }7 ^5 m) `3 _
        }
3 x! F% z! n4 \        rtc_alarm.alarm_hour = tmp_hh;
- N# d2 F, z( p# [2 n$ L0 \    }
8 A9 H5 ], X/ X4 L0 z% }9 H5 z( v% [9 _) S6 R
    while(tmp_mm == 0xFF)
% s; d: M3 Z9 d5 H) X  v    {$ e- R' |0 B9 X* R; h8 c1 y5 A
        tmp_mm = usart_input_threshold(rtc_buf[18], 59);8 c/ a* C% _9 {# @$ z
        rtc_alarm.alarm_minute = tmp_mm;( o; x! v! t; h9 w- w/ X
    }) D% x7 c3 c8 ?  u7 @8 Y
    while(tmp_ss == 0xFF)
# n6 N/ I4 X" C8 s    {
$ X9 c/ p1 P( O        tmp_ss = usart_input_threshold(rtc_buf[19], 59);
$ O! F; H! Q# s2 Y3 k        rtc_alarm.alarm_second = tmp_ss;
* P4 q7 M- s/ @$ u2 r. ?2 X    }
- W& g4 }5 ~) A) _: m( g
. q2 r( h6 s$ g: ?# S    rtc_flag_clear(RTC_STAT_ALRM0F);* Z5 ~( z0 d" T0 @, J  x
    exti_flag_clear(EXTI_17);
1 m% Z  q. F- I$ @* D1 p/ i. |/ C
    /* RTC alarm configuration */
3 F4 ~' p% H% _    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);) E; l7 K" E" U' }
    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
  _" g7 J2 B2 B( j- A    rtc_alarm_enable(RTC_ALARM0);% d% n7 Q  U6 {

; r% {/ A' }( d7 o- M8 Q    /* RTC alarm interrupt configuration *// U  j% b6 N5 b' l
    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
5 ?% V1 a0 _% h    rtc_interrupt_enable(RTC_INT_ALARM0);
# C* }. p! F. \/ s}' Y8 a. a5 E' x! r- l! {% o

1 M$ t" k. Z1 k  A0 s; C3 uuint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
. L( D4 n: D: M: a' O( v{6 F2 z8 @1 @. q3 J' Q* [+ ^
    uint32_t index = 0;
7 A; r- I# q9 m    uint32_t bcd_data = 0;
5 g- ^2 M' j& ~+ q! u) P
" s( ^- E' s/ |! Q, i' }    bcd_data = HEXtoBCD(buffer);
( c4 i$ x9 N9 R9 C# w    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
- v. |: h" q: c1 g* e    if (index > value)
3 I9 g6 P: G" P/ i1 K1 G4 o    {
0 i" j4 x. Z' e2 m9 O        printf("\r\n please input a valid number between 0 and %d \r\n", value);9 M8 A) W7 g/ A) r' M
        return 0xFF;
3 g8 f0 F' }) W  g6 Y0 t# ^9 F    }' e* E  k) y, d  W) O
    return bcd_data;
4 ^& B) p2 ~% N* m}1 x; X0 F6 Q9 `+ m7 G1 d

* |3 ^+ L" l+ P2 b+ x% Z+ W3 ~" o& u& ?
- J2 f7 Q4 U5 d% Z; q2 ~unsigned int HEXtoBCD(unsigned char hex_data)6 ~8 \+ k. b) A& A( I; _% R9 ~8 ^! W
{
/ A7 z2 v& z  ^) G. l) G    unsigned int bcd_data = 0;2 d" s" L" w5 W5 }' N! J$ S( A6 j
    unsigned char temp = 0;
3 v7 D) R  s1 o* l5 b# d2 @2 v& ]5 u7 ^  D0 P' O/ O2 {  E
    temp = hex_data % 100;
! B4 |; i& ]: D+ c3 c, {    bcd_data = ((unsigned int)hex_data) / 100 << 8;
" t/ f9 j7 }6 q/ W' U& R: A8 |0 A  |    bcd_data = bcd_data | ((temp / 10) << 4);. z7 ?( j+ v6 ?4 X
    bcd_data = bcd_data | (temp % 10);  @, k8 L6 C; i2 u# A' y
    return bcd_data;/ }" _* O5 D3 D9 b
}
4 t+ k7 H$ D2 O1 S; Hvoid RTC_Alarm_IRQHandler(void)# b3 `( a5 L3 A. j6 y& H7 o
{3 L8 D* B9 I1 i! D' m9 O
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
3 a. t+ q! o1 [5 j
- t4 M$ p1 [- l: Y/ F& L) `9 U/ E    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))1 e7 F% b) {% z% q9 m
    {* g  Q" k4 Z7 T6 m1 f
        rtc_flag_clear(RTC_STAT_ALRM0F);
& C' X! k5 |% F6 [0 k" M7 h" @        exti_flag_clear(EXTI_17);% ^4 Q! K# b$ [/ ~% B& k! f4 p
        rtc_alarm_disable(RTC_ALARM0);
' J- J3 V4 N. Z' a! L# `& q8 ?        led_toggle(LED1);5 |5 g3 e3 G" y+ {  Z! ~
    }  f% i9 _0 s/ h' u- R. s7 }
}+ a5 T& `! I  ]+ s7 e6 i/ w5 ?+ U

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);
6 v1 F" G3 E: Q6 C) a8 m
/ f+ y6 e  a% \! B3 n注意这句算法;
5 U- g3 l4 {2 R1 ~5 N. y保证:1.  每次叫醒后,本标志被清零;
4 ?9 h8 ~) R: i6 z0 g  T         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;
0 R' N3 c" r$ |, Y/ l如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-11 22:18 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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