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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。
4 O' |4 i, i- [+ m- o3 Q; Y以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。5 y. ^) ~/ C# m* b! Y
void rtc_pre_config(void)
9 F* i( m$ K- O# r& Z; l8 d, j{
9 Y! R2 g# a/ t    /* enable access to RTC registers in backup domain */
) M4 g4 U- f+ n8 z    rcu_periph_clock_enable(RCU_PMU);* z  f) l" B8 D7 E  m3 n
    pmu_backup_write_enable();& X" \# _& I2 o( h
7 }1 o8 |% P7 ~( Y
#if defined (RTC_CLOCK_SOURCE_IRC32K)
" y; S5 E# J* Q    rcu_osci_on(RCU_IRC32K);4 h% F0 F& p7 u9 n$ X  H4 r; F
    while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
) k- q% v& K1 w, W! p5 I6 }5 a/ J/ D. X    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);& b% k: k* V  F% g5 c8 Q
    prescaler_a = 0x63;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
' ?' V  Y0 s7 `& t9 e    prescaler_s = 0x13F;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
- @9 n$ |# W1 r( b. B' T) U" S7 R#elif defined (RTC_CLOCK_SOURCE_LXTAL)
' y6 e! L% E3 o2 X2 P    rcu_osci_on(RCU_LXTAL);
1 f; D. w4 @' R! [% i, R  y    rcu_osci_stab_wait(RCU_LXTAL);
; A/ X; p6 E! l$ M/ O    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);/ u1 M8 `8 i- Q3 [( D
    prescaler_s = 0xFF;
+ j+ c; n& c4 D9 O    prescaler_a = 0x7F;) Q( ]0 M  Q( z1 i* C4 l) p; Q$ ~
    #else
9 T; c/ J0 w' l% S$ x    #error RTC clock source should be defined& [! M7 V7 e, W, ]
#endif
$ c1 w7 L& z9 a7 ?    rcu_periph_clock_enable(RCU_RTC);
1 s, Q7 b9 K+ F$ b    rtc_register_sync_wait();
- |; o0 U; S% K/ T4 l  o}
: |& D; J& w0 Z6 u6 Z7 \
) X) P! @5 M% I2 X; i1 i9 C# G( q7 B6 I, ~3 x! H( _
void rtc_setup(uint8_t *rtc_buf)
8 j- Q6 L9 O+ V5 b$ m{& U( E3 Y* w" B$ y, f! R& h
    /* setup RTC time value *// H8 w! M! x4 G. Z
    uint32_t tmp_hh = 0xFF;
' y/ A9 G- O9 P8 L6 Q  S    uint32_t tmp_mm = 0xFF;" [8 A9 x5 ^" l9 |; x$ }9 e
    uint32_t tmp_ss = 0xFF;
# e/ d8 r- U& J  R  q# H    uint8_t year_data = 0;
. g1 z2 u1 }5 w" _/ x    uint8_t date_data = 0;8 Z# E/ ?# L: x
    uint8_t alARM_date_data = 0;: t$ I' U9 Y1 b$ ]- T

" ]$ D) B+ N% b; E3 E    rtc_initpara.factor_asyn = prescaler_a;
# Y$ J- J, {9 Z) |) Y    rtc_initpara.factor_syn = prescaler_s;5 i5 U4 k3 Q5 X0 F1 s
    year_data = HEXtoBCD(rtc_buf[6]);+ O& Z1 [# \) h
    rtc_initpara.year = year_data;
! T% \' K+ P( u" A$ g9 Q" L+ C4 d! u/ Z5 Y# M! k
    switch(rtc_buf[7])% B: {6 U9 h3 {3 \* K) b
    {
( n. z' D; E7 p# A        case 0x01:- ~; V+ {; T) `6 [4 U& ?& Y8 z
            rtc_initpara.month = RTC_JAN;! j3 {; E9 ]% w7 Q/ o. ~
            break;
: A# p7 \7 c$ w; ]+ \0 {* ~        case 0x02:
# b5 c, d% |4 \9 t  I3 _4 q            rtc_initpara.month = RTC_FEB;
/ S4 b1 J" E) q' b4 \" _            break;
( m( a. i8 ?. ?! K        case 0x03:+ v1 Q3 F6 ~2 P* r# K7 n
            rtc_initpara.month = RTC_MAR;1 x9 ~) l" S/ p$ J/ ]
            break;
& R8 y6 Q( a; S% A; o, g        case 0x04:; i1 Z, q7 l; o- s; H& E) o
            rtc_initpara.month = RTC_APR;3 d7 C( Y, ^( ?$ k
            break;
, a, N  i% p* \- W4 K- L        case 0x05:
4 ^& F, k0 @; g; C0 L* }+ U% o            rtc_initpara.month = RTC_MAY;7 N3 k3 `; `! f6 \+ }# c4 T
            break;( Z* I0 `8 C. y( |5 O
        case 0x06:
* H. |. i# y/ W# l            rtc_initpara.month = RTC_JUN;$ q2 ]7 }: P! [
            break;
: r( b, o; [+ Y4 l3 r$ J: `        case 0x07:
4 `8 \/ r3 ?" H& }2 y            rtc_initpara.month = RTC_JUL;; Y: K# Y0 p$ ?3 m* a
            break;7 m7 h7 B8 a# X% ?7 S7 t; |* e
        case 0x08:% o$ F- ~% J, _1 ^# N# M
            rtc_initpara.month = RTC_AUG;4 s7 ?+ i- M9 `; F
            break;- t1 @2 y5 x! O% g5 v; ]
        case 0x09:" p, x9 K' T# ^+ c: \
            rtc_initpara.month = RTC_SEP;
$ J3 e! A; G3 {  G! i            break;; B- f! j9 M( p# p5 W9 c
        case 0x0A:+ p$ `, M, [- d0 x
            rtc_initpara.month = RTC_OCT;. w9 Y# O* C( c4 ?: ?6 Q8 s
            break;
- B0 ]- L! c, b( w! m        case 0x0B:
# i5 P- n7 _) n6 v/ T            rtc_initpara.month = RTC_NOV;! b; V1 s9 L" L4 p! A
            break;# T7 k5 ^# }* J" N4 L
        case 0x0C:$ c+ [8 E; T2 Y4 P: f$ X  P6 p
            rtc_initpara.month = RTC_DEC;* s) A: t$ i( C( W
            break;
8 ?6 U9 s' f: _        default:: d2 h/ m+ K" m" V% ~
            break;1 n1 j( ~% o; t0 [  T( g. W
    }, a/ e7 X9 y" f  t: s
    date_data = HEXtoBCD(rtc_buf[8]);) p0 M$ m7 v6 ]; ^+ k
    rtc_initpara.date = date_data;* f% |  q# `7 Q2 w
    switch(rtc_buf[9])
) v+ }8 ]+ H  D4 _    {
8 [+ W( B. f  g; k5 S        case 0x01:3 v3 L2 ~5 ]& _+ ?1 j" ?' I
            rtc_initpara.day_of_week = RTC_MONDAY;
# _) g1 ^9 A% M" Z. I. I- K            break;
# t3 @( U8 @  G$ x        case 0x02:3 M& ]: O8 e' L/ d& w
            rtc_initpara.day_of_week = RTC_TUESDAY;
% p2 M% a4 Y5 D            break;
" {2 B! Q* Q0 E% }8 i/ V        case 0x03:1 i- i0 L" h2 M
            rtc_initpara.day_of_week = RTC_WEDSDAY;9 P. P' P% }# k. T" P5 x1 ^
            break;5 O4 E3 V/ G4 O6 K" O3 L" s4 D
        case 0x04:
2 D0 z7 r0 B4 E1 S. c            rtc_initpara.day_of_week = RTC_THURSDAY;, _, w4 u  ~: s, T& W9 x5 j
            break;; o2 X# a; P0 o5 p
        case 0x05:
6 L% p" q2 K" d, \! c- n& D            rtc_initpara.day_of_week = RTC_FRIDAY;
% ~7 ^+ K) q  @2 G& J  C            break;; p! H& H% j' {
        case 0x06:6 l" ^+ C( B9 o4 o$ a
            rtc_initpara.day_of_week = RTC_SATURDAY;
; [4 a% C& w+ ]+ m            break;
0 Y$ n% e5 I8 x6 S9 ], d) X        case 0x07:+ i8 S; o6 S8 ?) r. o/ q2 F
            rtc_initpara.day_of_week = RTC_SUNDAY;
  n% }& v9 @& _  Y+ b- U+ V$ [            break;) {5 l: f8 k* B8 [6 e4 _
        default:
; i. [( ^% m* L$ t            break;9 H' B- d3 F; v! Y2 |
    }
0 R+ e* }6 _  j5 m, w- g    if(rtc_buf[10] == 0x00)
  m. d1 d& g/ b4 }    {
8 i" {6 P% M1 p: s# D9 ]1 ^: |; _        rtc_initpara.display_format = RTC_12HOUR;2 ~$ |4 j6 p5 P/ j( f1 Z
    }
, `: q" v( B; n0 |. _0 y+ M& m2 n    else if(rtc_buf[10] == 0x01)( ?9 s: @& M6 Z  o
    {3 y+ ~( V  o+ C$ {4 E
        rtc_initpara.display_format = RTC_24HOUR;
7 K2 u0 ^: J  y7 n$ {( W    }% x7 \' y+ l2 R* R3 Q; F2 T
    if(rtc_buf[11] == 0x00)5 N+ D! m  s9 ]1 B/ P
    {6 B* C2 k) r. p$ q
        rtc_initpara.am_pm = RTC_AM;
( A0 B9 u* G* ~4 _' P    }
3 w' G, v$ u1 y    else if(rtc_buf[11] == 0x01)3 R* C) ?& @3 A8 j7 x+ p
    {# _! C2 u3 q; t) `
        rtc_initpara.am_pm = RTC_PM;" _8 E# l0 d1 a6 H: \# B
    }
' A7 u+ Z- y$ |$ X  s) K& x    /* 输入当前时间 */8 K& |# c  Z+ M" `
    while(tmp_hh == 0xFF)6 e$ C  I5 |, k) @( C( X. I
    {  L6 i3 E+ Z) t3 g
        if(rtc_initpara.display_format == RTC_24HOUR)9 c" T- ^  g" [
        {
& D9 z' Z& M4 p. C" y  U            tmp_hh = usart_input_threshold(rtc_buf[12], 23);9 r! v  \! ~& A+ ^: ~! G" l4 P
        }$ _' E: l* K; u# J
        else9 i& Y$ }% Z! I1 G' S* D  I/ M
        {$ m' O. b1 ]1 j# |+ K
            tmp_hh = usart_input_threshold(rtc_buf[12], 12);
, N& S; Z" r- U+ N, ]. u0 c        }
5 @. }( u, d! n& B% y3 _+ i. \9 W& S- V        rtc_initpara.hour = tmp_hh;
" E3 d5 ^7 G1 J% a9 A( G$ v( Y    }
+ m. B5 W& G' ?9 S: [# Z( P3 F
8 c( L7 r' P4 X; H. w    while(tmp_mm == 0xFF): Q7 I  S. {8 P2 A* `
    {, I! X; |. Q$ j# e. U
        tmp_mm = usart_input_threshold(rtc_buf[13], 59);
. v4 u5 F' }* A- A$ b( c        rtc_initpara.minute = tmp_mm;1 z5 k% ]. `3 a
    }
2 @9 Z, a. F& Y9 J    while(tmp_ss == 0xFF)- P& T( A' Y5 z( A3 W3 W5 _
    {
1 K; k0 X1 Z/ U* q; k        tmp_ss = usart_input_threshold(rtc_buf[14], 59);
$ C2 t1 M1 P0 r- u: u8 [# N. b        rtc_initpara.second = tmp_ss;+ y+ b; e2 d+ W+ F
    }) v2 J4 A9 j( n- ?% J! ^

% |/ ]( b/ A+ O9 k6 G' W- r; K    /* RTC current time configuration */
' `% m; D) k6 G- g: N    if(ERROR == rtc_init(&rtc_initpara))
1 V& y: M7 |; `! }, k    {: k0 j. y# C% a7 y, I
        printf("\r\n** RTC time configuration failed! **\r\n");
3 z3 {, A: R( @; I2 h. \" u: U    }& ^! b+ }7 v2 D
    else3 r3 i0 K+ C7 P$ E, D. H
    {
- p* t2 H. @  l        printf("\r\n** RTC time configuration success! **\r\n");
1 Q; J/ m5 c6 K- S7 ]- P' u    }9 c& Z8 P. _) h" \; n9 c
( Y6 j4 t( R+ s8 W% c
    /* setup RTC alarm */8 H% O2 D2 F, ?- B! u
    tmp_hh = 0xFF;9 e$ \2 g; ?) d$ S
    tmp_mm = 0xFF;
# h7 x. Q& O7 T5 u    tmp_ss = 0xFF;' W' S/ @6 [0 b6 E

' A- _  h& E% X( b8 S* f* n' P    rtc_alarm_disable(RTC_ALARM0);) Z! ^3 a4 l9 Y7 O
    rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;" r4 ~8 B$ G  d* ?+ U9 h% T
    rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
4 T% P. n4 X4 N    alarm_date_data = HEXtoBCD(rtc_buf[15]);
. Z7 I9 _) m: U. \0 d    rtc_alarm.alarm_day = alarm_date_data;- x, U1 G# K. r% |6 \* A8 k
    if(rtc_buf[16] == 0x00)
6 r: G4 Y  r( U" V) R    {
; |8 g6 h& U+ `% w9 J5 F, t        rtc_alarm.am_pm = RTC_AM;
/ Z* g. Z- `- m  \' P4 a    }; }8 D/ w& i8 b6 }' z
    else if(rtc_buf[16] == 0x01)* W. ?3 g( F4 i. ~
    {
1 w6 Q5 w7 i; x7 a! S1 R        rtc_alarm.am_pm = RTC_PM;
% D2 V8 P' J: y6 ~6 j' L    }2 W" ^1 Q9 R9 M
    /* RTC alarm input */. {; S; v1 w0 G  @8 v) A
    while(tmp_hh == 0xFF)7 H8 A% C% F+ l
    {
  Z/ q8 m9 U5 ~1 O3 S$ p' }! |; I        if(rtc_initpara.display_format == RTC_24HOUR)
! ?% Z- v4 x2 Z        {
0 A% v1 Z. A% _" w            tmp_hh = usart_input_threshold(rtc_buf[17], 23);
- U# c& S7 w' E5 n! |        }
2 W$ A, P# d  h* B        else2 }" r- r/ `* i) {. b
        {, \# M6 K/ }0 X4 `* P" ?3 {
            tmp_hh = usart_input_threshold(rtc_buf[17], 12);
4 @* M" @( Q- m        }& P) b$ ^# @6 A3 D) y' u2 w
        rtc_alarm.alarm_hour = tmp_hh;, v1 f+ w5 e6 A- y
    }
4 m6 K' c: v3 \! s+ k2 F% n$ u
    while(tmp_mm == 0xFF)
8 Z: A: r9 h& x$ }/ v! f) H    {4 A/ p0 m" L& L) g7 z
        tmp_mm = usart_input_threshold(rtc_buf[18], 59);' A. q: u" ^" J# h! [* ^
        rtc_alarm.alarm_minute = tmp_mm;
3 ]5 n; P: ~9 ^( D    }
2 p+ e) {) K8 |- n; _    while(tmp_ss == 0xFF)
+ d6 j4 h* d; A% w    {! Y: [' J% Q8 \) n
        tmp_ss = usart_input_threshold(rtc_buf[19], 59);
5 K+ m( X6 X9 L8 L& t9 z        rtc_alarm.alarm_second = tmp_ss;
2 E0 R) p- f% J% ^    }# n  |& t" Z) N/ K5 A
6 C; K' S" M, P& n9 T) Z
    rtc_flag_clear(RTC_STAT_ALRM0F);
2 D' f% k1 y0 P+ C    exti_flag_clear(EXTI_17);
' B7 g2 M5 ^2 w3 Q% o5 a# M. ?; H' \) F: v! ^+ a8 O" n. ~
    /* RTC alarm configuration */) M! i2 w  s; K. |+ I. A
    rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
. w4 l* F1 v. F    nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
7 f+ D; H& V. T5 e    rtc_alarm_enable(RTC_ALARM0);2 C; L8 Y- v" T8 V, T4 T

: B# x- e9 e( B9 `( i# W    /* RTC alarm interrupt configuration */5 M, v% q( n( x8 D2 \' z
    exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);0 N8 Z. V$ G# p* A6 P
    rtc_interrupt_enable(RTC_INT_ALARM0);) E# u! R! O) M9 Y6 c
}
. x1 I4 Z2 S0 ^% R4 y6 P
! |7 L- w0 ^$ S) ruint8_t usart_input_threshold(uint8_t buffer, uint32_t value): M& g& v! x. o3 ]$ M  T3 n1 q9 o
{' J) C, `% `* g( r2 h2 ~( [, J
    uint32_t index = 0;& R9 K: Q4 _, ~+ w: B  c' `
    uint32_t bcd_data = 0;
. p, Q9 I7 o' O- _) Y) {: o4 {5 b5 `$ s' k' T! _  C
    bcd_data = HEXtoBCD(buffer);
% ]0 R! B9 N0 X+ x" B' v: p    index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
$ \5 v( ?( n$ G, ]7 z    if (index > value)
! t$ U2 j  a; F( t8 O+ G    {
) g8 Q$ k) `9 e1 z! X        printf("\r\n please input a valid number between 0 and %d \r\n", value);
5 m% q5 T; E: f# @. S; x9 _, T9 M        return 0xFF;
( a# G# g5 x  D7 T8 @    }. L% ]. Q5 z4 z+ y8 N( F& j. s3 I
    return bcd_data;
8 E& X4 v6 O$ z% q3 p}# ^8 |; ~- h& ~% V
& T0 |" u5 T" W

0 B+ E8 s: y) e! a3 xunsigned int HEXtoBCD(unsigned char hex_data)/ |! [% @& V( v+ ]
{
+ ]0 Z- C9 O0 m6 d$ v1 Y    unsigned int bcd_data = 0;% _  `0 w9 Q, P
    unsigned char temp = 0;1 v6 C$ c! t% k' ^0 A

& P2 J3 C+ l+ }$ A    temp = hex_data % 100;6 k- X4 ~) t" x% Z9 G8 B
    bcd_data = ((unsigned int)hex_data) / 100 << 8;
- h3 t' I6 y7 D2 p- W. p+ v& f    bcd_data = bcd_data | ((temp / 10) << 4);
% h; n8 V8 x  i! @+ n2 S    bcd_data = bcd_data | (temp % 10);
7 T; M) Y) N9 ]2 O    return bcd_data;8 ]3 u* o9 D% U6 S% ]; e
}
: v3 G: c$ ]' c" k5 O# {" F: Tvoid RTC_Alarm_IRQHandler(void)  H2 H& G3 u# u. u6 S8 H
{/ k0 e& h, g* N: b! Z; ?
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;; [; s. G8 A: b0 n1 m# S

3 l: [$ X) E6 q" j( E$ d7 P/ ~, |+ q    if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
2 U# [9 j6 R+ j- j" N0 b    {
/ X5 X% _+ d' {/ h  Z        rtc_flag_clear(RTC_STAT_ALRM0F);, v4 O/ c9 n5 f8 X
        exti_flag_clear(EXTI_17);+ T0 C" X& W6 W( Q6 n7 e) J
        rtc_alarm_disable(RTC_ALARM0);
, c& z* [7 V) d6 A+ M        led_toggle(LED1);* F! E8 U) L/ n5 f) B
    }
$ _0 J& j7 C; w6 f* i}
: R3 ?8 X" G& J* [

该用户从未签到

2#
发表于 2022-10-13 13:16 | 只看该作者
rtc_flag_clear(RTC_STAT_ALRM0F);3 D4 ^; y! x( _$ A1 Y

6 T0 U8 m" \6 x, v1 T' I+ h/ d" J注意这句算法;
1 s4 I1 D* V* q" R! ^& q9 l% B1 l& S保证:1.  每次叫醒后,本标志被清零;
# A$ l; _9 ^+ H6 U. N# S* A% P         2.  新一天的开始,要重新置位。

该用户从未签到

3#
发表于 2022-10-13 13:34 | 只看该作者
如果每天都是同一个时间ALM,只要再置位;
9 Y9 z% D0 P* G如果换了时间,不仅要置位,还要更新ALM时间值。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-7 20:31 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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