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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。# Q3 }# D: n% W/ I
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。" W) u+ n' Z* V
void rtc_pre_config(void)& a0 h" b# W, a! W3 h" @6 L
{& A( }' O2 f  F$ X* a3 y
    /* enable access to RTC registers in backup domain */
. Y& A% f# |  w% I7 J# A    rcu_periph_clock_enable(RCU_PMU);
. P) W# B: u2 g# ]' f5 M! {) f2 `* i    pmu_backup_write_enable();  N+ Y/ p& c2 V
1 ]! X/ a3 \3 y6 K* U' U; a( n; x/ Q
#if defined (RTC_CLOCK_SOURCE_IRC32K)
) f; m; z, Z, C$ |6 b/ g+ ?    rcu_osci_on(RCU_IRC32K);
  Y: d4 k- E+ t: r& }8 {    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));4 X1 N. e6 @- l+ D9 o
    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
: s9 `! ?6 F6 E7 K; j    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
8 Z! r- P8 C' Q0 Q    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ" E  g/ o* p: `4 P! f" I- E# V8 g1 L
#elif defined (RTC_CLOCK_SOURCE_LXTAL)8 C5 y: A- @/ a4 I' k! V4 K
    rcu_osci_on(RCU_LXTAL);4 j4 Z" @! L. c
    rcu_osci_stab_wait(RCU_LXTAL);
. _3 V4 v& \2 k: e2 B$ X' g    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);0 d# @& `3 ]& H; [
    prescaler_s = 0xFF;
4 ?) O5 s/ D( n    prescaler_a = 0x7F;# Y9 i4 p' F! V( A# d8 ]
    #else7 z1 f  R5 ?9 j# b
    #error RTC clock source should be defined
' w1 E5 k5 a5 ]: M6 \3 I$ C3 l0 s8 r#endif, t" w7 A* @7 s* f; B. ~
    rcu_periph_clock_enable(RCU_RTC);* ?' M; P! i! _
    rtc_register_sync_wait();
2 r1 F, _9 C8 C7 k0 ?  b* T$ J4 _}/ W7 X) |3 ^! P! d
2 `* C! b7 O" Y( p0 ]- I3 h
7 l8 `% e( m7 J  E1 w% K
void rtc_setup(uint8_t *rtc_buf)$ ~4 o% g- C2 P% T
{, r: i1 Q$ U; R5 {. |3 H, J* g' S! e; ^7 b
    /* setup RTC time value */
+ M' x/ ?8 L) b" [* q$ E/ g3 K3 B    uint32_t tmp_hh = 0xFF;' @8 x. P2 W- J! N9 I7 r
    uint32_t tmp_mm = 0xFF;
7 a7 O+ `8 q/ ?5 D5 q    uint32_t tmp_ss = 0xFF;
. k9 W# \% D8 p* x, E    uint8_t year_data = 0;
3 `7 U2 q) j6 g/ p5 \6 d; B    uint8_t date_data = 0;" ]: T- k) w! a1 x9 Y
    uint8_t alARM_date_data = 0;
& e& V  B/ ]6 D( Y
1 ?' c2 c( I5 w) r$ B    rtc_initpara.factor_asyn = prescaler_a;
/ [9 Y: `  D$ K4 G9 `( x: P    rtc_initpara.factor_syn = prescaler_s;
4 Z3 r/ y, N8 v- v6 M$ _. d2 ]    year_data = HEXtoBCD(rtc_buf[6]);/ r" Z. o! e* h- p% b* l% |
    rtc_initpara.year = year_data;& k  y/ W# w+ N0 l8 h3 C
8 k. ?$ d4 i  u6 ~/ _: T
    switch(rtc_buf[7])
( M) Y$ R% b: M  [/ C# W2 A! L/ d    {5 A4 x; B9 w' L: m: p( a" p
        case 0x01:- C; f# c% V  m) x5 C( O0 O- |/ @
            rtc_initpara.month = RTC_JAN;
% @. T4 ~; J. F+ k            break;7 Q5 a9 ^: ^( T6 F) d  y2 t
        case 0x02:
" `0 Q3 n" N; z+ e9 g            rtc_initpara.month = RTC_FEB;
! U% V1 J7 W+ f% S- I( z            break;: |# P2 D8 e& O) q* T. m) v
        case 0x03:
# g& h: w) K, w) T# N            rtc_initpara.month = RTC_MAR;0 W6 `8 Y7 z( N" T4 `$ r' Y
            break;5 @# J' y1 i  k" \
        case 0x04:! f3 }, V- G% J! U
            rtc_initpara.month = RTC_APR;
2 L% {- m* G6 ?            break;- d1 R4 V1 s& U3 q) ^- `
        case 0x05:2 q$ D/ G! V" y6 X$ z; @0 a, H  E
            rtc_initpara.month = RTC_MAY;8 ]' F6 \/ ]8 e  |9 _5 N% E$ w5 I
            break;
3 C1 S' I$ e9 L( @5 _% |% L        case 0x06:
+ O5 r, ?$ j  ^6 ?  B8 N8 N+ ]            rtc_initpara.month = RTC_JUN;
7 l6 h$ D9 o( p. V7 C            break;
( K8 T7 `+ ~* r: }0 |+ K8 P' Z/ s5 h        case 0x07:% F* t* g! {# R$ l
            rtc_initpara.month = RTC_JUL;
" K( ]# u% O/ y$ B; g            break;
( N2 A- u4 T' m8 G& @        case 0x08:
3 H, ?3 N$ p1 E* W0 J            rtc_initpara.month = RTC_AUG;$ a4 y/ c$ X( {
            break;
, n* Q3 _" h" v* ?        case 0x09:7 l6 H2 N- {/ R1 r1 s
            rtc_initpara.month = RTC_SEP;( F' s8 o+ k* S* e/ m: g  V
            break;
8 M2 R) }/ Y% T( @+ y2 v4 a  v        case 0x0A:+ u* X9 ^& y) g; }/ a" }
            rtc_initpara.month = RTC_OCT;2 z( a' C; [5 d# Z
            break;
3 C& z2 K) H% B" x        case 0x0B:
6 B) @# G5 V( K) Y            rtc_initpara.month = RTC_NOV;/ K3 j; D' n) C# J8 |
            break;" \1 q" J- X9 T0 g1 e: r
        case 0x0C:
: L. x' j! c7 P9 a, `8 P            rtc_initpara.month = RTC_DEC;( s+ Z3 h( f+ b5 u1 i
            break;
) F% I0 S% Z5 [; t  n+ g7 J        default:! c* Z- g' Y" A; F3 O# R
            break;
$ p0 ?9 U2 i0 w$ l    }
8 p2 b. `0 p' e2 p, |- D    date_data = HEXtoBCD(rtc_buf[8]);5 A) K+ o$ `2 o4 ^
    rtc_initpara.date = date_data;
; f, B# d8 {+ e( a) N) V, n    switch(rtc_buf[9])
3 B+ |" A. U' T2 T/ @    {
2 D  u5 r& E* e/ }, {+ e; x* d        case 0x01:6 G8 B7 f6 H8 R; F. P
            rtc_initpara.day_of_week = RTC_MONDAY;
# U, B! X  w2 B0 p6 ]            break;
# |4 y' F0 y6 g        case 0x02:! {* d) X) ~* q# W$ x% W1 m
            rtc_initpara.day_of_week = RTC_TUESDAY;
* O  ~/ b' Q' g% f# p9 I* d            break;" Y  S4 Z% {% A% W
        case 0x03:
" e* |2 A  ^# g. t; M2 f2 J            rtc_initpara.day_of_week = RTC_WEDSDAY;* l  z* q6 l+ k$ ?/ D) r2 I
            break;( O1 S* F" j& P( Z0 {% ?* p
        case 0x04:
1 }' R5 s6 x4 {( X% ^            rtc_initpara.day_of_week = RTC_THURSDAY;
' \7 s1 ^' w5 ?# D$ f/ n' s6 s            break;& P/ D6 m0 u2 A  ]+ x( V
        case 0x05:
/ c. \7 w$ ?( T3 ^' e            rtc_initpara.day_of_week = RTC_FRIDAY;/ F. o% e" t6 a" x. j
            break;3 D/ X# r8 O. `% ?& Y/ f- K
        case 0x06:7 E8 y% V5 }$ r  {
            rtc_initpara.day_of_week = RTC_SATURDAY;/ O" g& [, m& G+ T: d* u3 e$ |
            break;
  ^$ H$ N- [9 U        case 0x07:( S) h2 x" c$ O
            rtc_initpara.day_of_week = RTC_SUNDAY;# z1 F5 Y+ `) S- z: s" Z9 K
            break;
# V: d8 U& f* Z) t% M, r7 ?5 U        default:
5 p* m: @" F* |3 Q4 m            break;
! u) Y- m6 H/ e" J$ Y8 n( p4 `    }
/ y# c- ?: h" w  ?    if(rtc_buf[10] == 0x00)
7 p: @% }# V( O2 G    {7 O  f) w2 B. b, [4 a! x
        rtc_initpara.display_format = RTC_12HOUR;- d  j8 _- v+ x  f0 L
    }3 z( w+ v" p7 E  W- F% F0 y* v
    else if(rtc_buf[10] == 0x01)+ Y* z- M9 [- m, Q9 i! {
    {
+ J) V. V( S& P- A8 S3 D. [        rtc_initpara.display_format = RTC_24HOUR;
9 Z8 d3 z( c) F, j/ _9 t    }
" M, L0 V0 ^- l4 j    if(rtc_buf[11] == 0x00)8 f8 l3 I6 T5 c6 n% X
    {
) H" s! T8 s4 j& h' d9 A* N        rtc_initpara.am_pm = RTC_AM;
# z7 [9 c: I! @' c    }( w( Y( y, m/ g/ Z: e  ~+ j3 z
    else if(rtc_buf[11] == 0x01)
: b/ b" n4 w% Q1 A9 W( L; ?    {
# \" ^. w6 Q/ i2 T9 ~        rtc_initpara.am_pm = RTC_PM;7 ^6 l3 Q( d! v6 h6 N8 M
    }
" D* J& {$ V- c4 C, A( V    /* 输入当前时间 */1 \. p, c9 x) J
    while(tmp_hh == 0xFF)
! }& h' d7 d# K) b; l- {    {
$ d0 n+ e' _$ A+ j( W        if(rtc_initpara.display_format == RTC_24HOUR)
: w3 V  m$ s/ ]3 D        {& u7 |/ J, y5 t8 R- h0 O" N
            tmp_hh = usart_input_threshold(rtc_buf[12], 23);
/ C. P# d  t% C/ y6 F' u8 a        }# {% M6 m- ?7 i$ O
        else
6 `1 _6 V3 I' l4 U6 d& N        {
6 B# o# {8 E" ~$ Z. @            tmp_hh = usart_input_threshold(rtc_buf[12], 12);
& n& e& i9 L8 K; ^        }9 H1 i# f! e- v3 b
        rtc_initpara.hour = tmp_hh;
3 G- ^2 V7 {, @& M# M) ]" L    }
( R: x5 Z: X* @% @
6 ^% X; s7 k8 F" P    while(tmp_mm == 0xFF)/ z/ E0 l6 Q" `3 C3 U% v
    {0 q2 ?2 x' G" O  |5 o9 a
        tmp_mm = usart_input_threshold(rtc_buf[13], 59);/ a- D+ W4 r! X7 ?) D- N1 G* L
        rtc_initpara.minute = tmp_mm;% I( x' ?3 d9 l- V* y& Y' M" d( \
    }
6 P! D+ `% \4 ^* L$ b5 v; e    while(tmp_ss == 0xFF)2 j; P) s! s: n# x
    {/ N0 i- R& z, G  c3 v7 ~
        tmp_ss = usart_input_threshold(rtc_buf[14], 59);* m$ Q: W6 ?4 z
        rtc_initpara.second = tmp_ss;
9 _: A0 H% Q7 X. f3 l    }
) R$ _9 t, A6 A# p6 s+ Z9 l6 y( t
7 _7 C  S+ c! C0 R    /* RTC current time configuration */' Z* b. A' b* Q* `2 u
    if(ERROR == rtc_init(&rtc_initpara))  O8 l) ^/ h) d8 f# C
    {
, A* ~1 y9 N2 C" j" @/ l$ x        printf("\r\n** RTC time configuration failed! **\r\n");
# {8 M8 e3 }' [- F6 T- I# `# F    }  U0 Y' P: b8 i! i! L
    else8 Y, q) V: d6 R# w$ Y* w$ j% }
    {0 T$ A( p1 P( D/ @5 Z' C& N
        printf("\r\n** RTC time configuration success! **\r\n");: I, H7 k, r! t8 t
    }
5 w- }1 ~3 z5 c6 `0 k! }3 J
- d& T& k* y5 h; W) A    /* setup RTC alarm */5 R/ }: I  k8 y' A1 m9 ^9 K
    tmp_hh = 0xFF;3 Y3 x6 m% _; v" M4 @
    tmp_mm = 0xFF;
: J0 Q4 {( J9 R% U+ ^  x    tmp_ss = 0xFF;
) ~# i* N+ N; z$ a; R% r
9 g6 d" |) R: j3 J* C    rtc_alarm_disable(RTC_ALARM0);
( Q! M; q  @  _) ]2 X    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;! K% [" H6 q4 Y& ~
    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;0 p: \  y- A/ t" i( g) j
    alarm_date_data = HEXtoBCD(rtc_buf[15]);8 e5 n. d9 i4 h, X, u0 k" E
    rtc_alarm.alarm_day = alarm_date_data;
9 J. a4 O9 G) p) a3 T    if(rtc_buf[16] == 0x00)
. H' v/ L* u" \& ?7 m  ~8 a5 J    {
- A# A: W( \! ^  L; }. L: [        rtc_alarm.am_pm = RTC_AM;* z4 f# U1 K  Z" a# N
    }# w/ u* a) `7 n
    else if(rtc_buf[16] == 0x01)& N$ U# D8 W8 _2 g: J! E9 H
    {
* o8 `: k0 s7 W, J        rtc_alarm.am_pm = RTC_PM;; `: w6 ?) o7 |1 T8 _( \
    }8 F3 ?$ I. V* _/ V7 o" M! w
    /* RTC alarm input */
8 E% m* p* p8 z. h, ?# H2 u    while(tmp_hh == 0xFF)
  n/ Y) w' p/ V    {
" J: ~) W$ {; c. m( z        if(rtc_initpara.display_format == RTC_24HOUR)
% d9 a, X/ _  W+ j2 X        {) Y* c1 U0 \, K$ k0 P7 h% {
            tmp_hh = usart_input_threshold(rtc_buf[17], 23);
. T  t/ O5 \2 n6 E5 \: ~( m4 p        }
3 b; f. j; F0 F8 _( @6 |% k        else8 R/ K1 h  v6 u8 L
        {
, S* |1 w) |4 ]: F9 @, O, N' Y9 [1 k            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
$ `8 Y5 o  Y) e: p* J4 a        }% W; L( w. `2 z7 u/ y2 g% M" Q
        rtc_alarm.alarm_hour = tmp_hh;
' I/ a% o! m% I1 E7 b    }9 i$ c+ `* b3 S3 _6 V) P
& }# I# _6 a6 z" ~4 m* }  j) C
    while(tmp_mm == 0xFF)' K1 ~5 N$ x" s# ^8 Z/ s* F
    {/ P7 W* L+ s. B0 h
        tmp_mm = usart_input_threshold(rtc_buf[18], 59);
# G0 o& E- E; l9 j2 i% h9 O1 T' v        rtc_alarm.alarm_minute = tmp_mm;; N: R; V$ n4 j
    }
, b7 r9 O6 U4 t5 f    while(tmp_ss == 0xFF)
+ X3 A  v6 i& ^4 T: @( C7 H' f7 M    {8 L: J5 q4 |: ]0 I. M' e
        tmp_ss = usart_input_threshold(rtc_buf[19], 59);& J% ?% v2 p2 Y8 t  Q* q- o
        rtc_alarm.alarm_second = tmp_ss;5 n5 E4 V' i' }
    }
2 H* w7 M  K3 Y* m
, I. u  X8 V! S% C& j    rtc_flag_clear(RTC_STAT_ALRM0F);7 X$ h- s% g. ]$ a
    exti_flag_clear(EXTI_17);; ?* }6 [- |# z7 t( H- s
, D/ i# j- x# U1 E$ @. y: M. ?
    /* RTC alarm configuration */0 `& O1 p% ]+ `" Q
    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
# f' H' }+ }4 `' B3 Z% C- v    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
3 C3 E6 C( @8 o6 ~, ]6 ~" @    rtc_alarm_enable(RTC_ALARM0);
( n1 I) \9 f. ~2 c0 ?: I$ v$ Z- {
/ X6 f1 L  d! C" ?    /* RTC alarm interrupt configuration */& @* k+ b# m8 p0 n( [5 T
    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);( Z+ `# P% Q' Z4 Y3 O# b2 C/ ?
    rtc_interrupt_enable(RTC_INT_ALARM0);
6 H; W. D5 o4 |9 l' Z6 v+ w0 I}1 m# L, `/ N0 v0 \
( y- S4 F# ~/ q9 @0 x
uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)& d) Y6 H4 Z# r- }( J: n  j, `5 k
{; }3 f4 L/ T+ Z
    uint32_t index = 0;
1 t/ k) H8 t6 P    uint32_t bcd_data = 0;/ H) O! Y. r0 B0 S( N
% t. g1 f  h; ?5 v' e
    bcd_data = HEXtoBCD(buffer);
1 R" ^1 Q0 a: o3 R+ ^6 t* W    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);& N/ E) w9 A9 I! `
    if (index > value)" D  n7 x4 [, _1 o# S  B( s
    {
; X  \) V! C; l* d$ [, J. [        printf("\r\n please input a valid number between 0 and %d \r\n", value);
# f+ D1 p/ _. y, I* L2 u3 m) ]( c, Y! d        return 0xFF;& H% g/ E) t% Z+ o) R2 w
    }9 i  u9 g$ Z1 K
    return bcd_data;+ u5 R( f; V& Q" `1 T2 A
}4 Y2 w  `0 U" t) j

( B& `1 s/ }" G
$ q! [8 ~6 V& x- o9 @unsigned int HEXtoBCD(unsigned char hex_data)" u$ Y& Z- b. B) C
{6 d9 E8 }/ S9 u! ]* j, Y' }: K! ]1 r
    unsigned int bcd_data = 0;
; c" G3 a* h4 r4 v8 i0 q; u    unsigned char temp = 0;6 @9 W* z5 U) v; Y" L

1 A  r! q/ r( T( Q; p/ U    temp = hex_data % 100;
/ z4 j7 q: A: k* J9 q    bcd_data = ((unsigned int)hex_data) / 100 << 8;
0 ]2 U8 l' N; z, k* O% d& |- G+ I    bcd_data = bcd_data | ((temp / 10) << 4);1 P6 I! o9 c; u$ V( W9 }
    bcd_data = bcd_data | (temp % 10);; w$ Z( _* C, P1 x" `) L0 [% A
    return bcd_data;7 H" _  m$ `' Q3 V/ ~
}
6 d* ^5 n" k  \+ Fvoid RTC_Alarm_IRQHandler(void)  O, s; U$ u5 [
{
* |5 u4 m; d' l% l; ]( C    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
0 v7 |% J4 N& G9 E: p4 s5 x+ ]% I
    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))6 B& f+ `+ \& t7 h5 U7 z( f
    {
$ R1 L# e0 S& a3 [        rtc_flag_clear(RTC_STAT_ALRM0F);2 Y# k8 |! k+ \) \1 E- R' J
        exti_flag_clear(EXTI_17);8 s4 h# Q( ~5 O7 K/ r
        rtc_alarm_disable(RTC_ALARM0);
8 O' x3 S! \8 }& s        led_toggle(LED1);% ~. N2 |% r' r9 U- C
    }- a7 h1 p( E/ j; @9 Z+ `
}
9 F1 @. G* Y+ h3 H

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);% u$ x4 p% _9 y/ f( H  q7 H" C' K

$ O6 d- ~3 i! |注意这句算法;5 v: z8 ^0 ?" |
保证:1.  每次叫醒后,本标志被清零;
+ F! ~% t" X2 n& c, b1 L         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;& g! _5 m" O1 L+ v. I
如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 17:41 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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