|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。( W9 k- h* x* `- s1 R! S, P9 m6 j$ v
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
2 }' ^1 ~) B5 E8 u( ]4 _0 f# ?void rtc_pre_config(void)9 b0 J' g, R4 L" v5 l/ w
{0 N# G; W$ N4 G8 F; }
/* enable access to RTC registers in backup domain */
! g! S. m3 O0 f/ j6 G" Z0 G rcu_periph_clock_enable(RCU_PMU);
% u1 m0 r; [$ F pmu_backup_write_enable();
$ ^ I. C5 s- S6 g0 I
( O5 q- M8 {- l g$ ~#if defined (RTC_CLOCK_SOURCE_IRC32K)! N* S- B& a% _: C: [0 C% z- v" i
rcu_osci_on(RCU_IRC32K);' w8 ]4 b# `( D$ Y9 q. _4 P
while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));- I- K3 Z$ ^9 Z/ V- p+ W+ U8 w/ d+ }
rcu_rtc_clock_config(RCU_RTCSRC_IRC32K); c, B+ |( G( U2 _9 ?
prescaler_a = 0x63; //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
, p# L0 {5 J; w7 r3 P% C! W0 \0 P7 P prescaler_s = 0x13F; //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ1 M5 E7 g( X/ b: V) N
#elif defined (RTC_CLOCK_SOURCE_LXTAL)
+ V) f( Q" E! W- c0 @6 w6 t! C rcu_osci_on(RCU_LXTAL);- e- v( V* }; X0 @
rcu_osci_stab_wait(RCU_LXTAL);
; h8 s5 X8 v$ P* X* ]0 `* k rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
9 R' k. v! O, \- K$ _- l5 P$ A" R prescaler_s = 0xFF;
& E8 D$ _0 I4 [1 L2 w s prescaler_a = 0x7F;- M* ?" k. Y1 ^! V) X8 ~2 k
#else
0 z3 S2 n, ?: {. E #error RTC clock source should be defined ^5 Q+ k+ C2 G: w% K1 q) Y Z
#endif1 D2 M/ t7 v( y& C1 ^8 Z
rcu_periph_clock_enable(RCU_RTC);% e, X! ~# S# x6 a
rtc_register_sync_wait();5 ~# e4 { L* p7 a% l8 o
}0 V3 t6 d* Z8 B" Z% w5 Y3 ~
8 F$ H. u( @/ e% A3 d5 {$ r' P$ p; N% B% j" E
void rtc_setup(uint8_t *rtc_buf)
3 c/ p* O- m6 @) s{% X' v. A+ E4 k2 @1 T
/* setup RTC time value */) |( Q y6 x; u/ b1 R
uint32_t tmp_hh = 0xFF;
) G( m9 i+ Y$ \3 F. D4 a' h; g' d) K: R uint32_t tmp_mm = 0xFF;. \& X+ X) i8 D/ b7 y8 Z
uint32_t tmp_ss = 0xFF;% F8 {' Q3 F( }: l" f9 x
uint8_t year_data = 0;
, L$ P8 K6 |. O/ F uint8_t date_data = 0;
3 E4 A" E3 O& | [# d5 G uint8_t alARM_date_data = 0;
1 B3 D( d" n+ A2 P4 j
6 I/ e3 m! q$ P- t! N rtc_initpara.factor_asyn = prescaler_a;
- m8 y3 S/ b8 i% d rtc_initpara.factor_syn = prescaler_s; N& n9 S& T. U: Y( K6 o+ N4 L
year_data = HEXtoBCD(rtc_buf[6]);$ p2 g3 h( r: v( J7 K/ O
rtc_initpara.year = year_data;
! X# G6 g. c+ @9 B; D6 v1 ], S+ M: [7 }$ L( {0 H
switch(rtc_buf[7])
: J: T- T3 Z, `. Q u+ P! P0 I {
6 F& F8 R) x& |3 _9 Y case 0x01:
' F$ Y- ~: y; T rtc_initpara.month = RTC_JAN;
; W' M0 I9 N8 W6 ~& h/ L break;
' h: ~1 X; |; e x5 K case 0x02:; Z4 s. j: j$ ]7 R0 l# d
rtc_initpara.month = RTC_FEB;
$ K/ c1 P# j8 ]3 H: _ break;$ C+ l0 {' {+ o0 M6 X8 l
case 0x03:( S {6 M% s6 F: Q, m
rtc_initpara.month = RTC_MAR;- w. ?$ f, I3 N
break;7 ]& k, b- g& _" y) {
case 0x04:
6 _& n* b# I9 X rtc_initpara.month = RTC_APR;
% u4 D' c) F, A7 L1 l" L! T* @ break;
' Q9 x$ X, @6 c case 0x05:! d, c4 W( n+ P( i( D7 i3 K3 u
rtc_initpara.month = RTC_MAY;7 X \* S& t8 b; r6 S
break;
( Q! R9 i$ e/ ?& _; E) S6 J5 j case 0x06:
& m; Y/ V$ ^7 u* { rtc_initpara.month = RTC_JUN;
4 P& a/ J# r6 ? break;; f: y5 s# _7 \7 `
case 0x07:6 H. K; ~6 m6 {1 Y O+ f! `
rtc_initpara.month = RTC_JUL;
/ _, p. E! _4 o0 b/ Y; x8 C L break;
, v3 [5 V* c7 m3 m0 S case 0x08:7 I5 |" V8 _0 f& c* \* ?) |3 @
rtc_initpara.month = RTC_AUG;
+ D6 g+ y9 x. T$ b, ~ break;
8 P8 V( t, H( d1 m! D r case 0x09:/ T0 M" h, ?1 u7 c6 @" H6 N
rtc_initpara.month = RTC_SEP;: d- ?( V* r/ L+ Q- G
break;
( q$ }( f5 U. W% a! E case 0x0A:! _' O6 w0 x# W7 X
rtc_initpara.month = RTC_OCT;
3 c9 N" J4 [( Z& ^9 t break;6 @& b$ o/ O) U5 m
case 0x0B:
+ @, F, T2 B; ~% S" { rtc_initpara.month = RTC_NOV;
* g$ Y- l6 @9 |" ]; R break;
4 e: c+ G& t) e' g case 0x0C:8 @5 n- ?- |( t4 a6 {4 v/ h( X8 g
rtc_initpara.month = RTC_DEC;2 u0 E. Z9 L6 J: b
break;! W2 z% `. V6 i% r% V+ v- y L
default:
: [2 }& a: n8 @ break;
Y( @& C! J- s. S/ ^ }% X# m# B! X, D! |: n
date_data = HEXtoBCD(rtc_buf[8]);
O& l. v8 M6 {2 T( I rtc_initpara.date = date_data;7 @1 U2 [% d" x4 y7 e( y- m. L: [
switch(rtc_buf[9]) v2 D6 M! y$ Q
{( Y/ @/ B2 s5 w$ t+ ~
case 0x01:/ l' v3 f; V. H7 |4 a) g
rtc_initpara.day_of_week = RTC_MONDAY;
! k5 Y7 D" E9 P, d0 y8 | break;
4 C- w7 Q& X" i0 M case 0x02:2 Q1 B. u" ~9 r- G0 x/ ]' h, m
rtc_initpara.day_of_week = RTC_TUESDAY;$ a5 |- p/ {& e: v% r2 C1 X
break;
: Z- A7 X4 O. s8 z) K& Y# M, h4 |; t case 0x03:
3 @: t& [: S- Z1 ~ c rtc_initpara.day_of_week = RTC_WEDSDAY;! G8 J/ u# r% i' \
break;3 t2 m1 E, A: T- R8 p( S# V
case 0x04:
9 ^, e0 u, E' S1 j8 L rtc_initpara.day_of_week = RTC_THURSDAY;
5 f: t6 H: n( Z% g break;* h0 u B$ Q( o7 H& k' A+ V
case 0x05:
7 y/ |9 x& T0 b; ^* E9 ~ rtc_initpara.day_of_week = RTC_FRIDAY;
2 d! z; l* y+ ?0 E break;
+ A& `8 w2 |7 P) i( L0 T case 0x06:
/ e, r4 p p C; ^2 v rtc_initpara.day_of_week = RTC_SATURDAY;
0 o+ ]; n2 y7 Y/ L3 Y. N' I break;1 w7 a' Y, p: ?( d
case 0x07:
+ v% J* z: t. W& C1 H# z rtc_initpara.day_of_week = RTC_SUNDAY;
) R1 l- c6 P$ T* E$ t+ Q$ h; B break;
{! y$ \) s: i+ g3 L% l default:
5 l$ B8 u% w, W5 c break;" t# H) a0 i4 M' v8 ?' Q q$ w
}
9 z+ a8 `: X% I if(rtc_buf[10] == 0x00)
4 L- G0 ]" T2 d- a1 R) N, @ {
4 I# r! ~7 _% X4 ~; ` rtc_initpara.display_format = RTC_12HOUR;) g# }, F e1 L0 p$ J/ \2 Q
}
( j8 E" \ O: R! g9 s else if(rtc_buf[10] == 0x01)
. O! Q$ {# _8 d x {
% q9 V( v8 m$ s rtc_initpara.display_format = RTC_24HOUR;
1 `; x( `6 K5 I" F) R6 t% N6 y }( C# A7 i. c: ]
if(rtc_buf[11] == 0x00)
3 D2 r3 }: G6 V1 Z {( D: u* U( s3 K& f
rtc_initpara.am_pm = RTC_AM;: {8 \# M7 l; k" h
}( P/ X% J0 g. I( _$ o8 p
else if(rtc_buf[11] == 0x01); J: ^9 U0 r/ c
{' o8 d/ h5 Z, N# B$ Z. d; ^
rtc_initpara.am_pm = RTC_PM;
1 K7 A. M; y& c" ^, C6 @ }. D* L- O3 K% b U( k- b; n: h
/* 输入当前时间 */
! i/ {0 w8 W5 A, }! t$ ~, H8 O while(tmp_hh == 0xFF)
, }' W7 y- {/ d {
/ Z6 o: E: z, l# k# S: J if(rtc_initpara.display_format == RTC_24HOUR)
. B* O) W2 C/ _3 `1 S2 n {
$ O6 Z& s+ |4 C# O% a tmp_hh = usart_input_threshold(rtc_buf[12], 23);& r5 r, T0 N: N5 C, s& N" Z7 I
}
4 M2 C( p! u% |1 ? else) e% A" {, u* t0 g: @
{# {, s% T j, Y( y
tmp_hh = usart_input_threshold(rtc_buf[12], 12);
8 ~3 h6 Z; d+ J: Z }
# `$ M( y' x) p! W rtc_initpara.hour = tmp_hh;8 K; u: Y/ E J; c, t
}
% @2 |: _# [8 r1 l1 V( m+ @0 Z- J7 d* Y
while(tmp_mm == 0xFF)
$ P; u4 k, ]( O {3 H1 Q. t$ K% c4 k5 E* L( X
tmp_mm = usart_input_threshold(rtc_buf[13], 59);% `: D: j/ z2 A" J1 p
rtc_initpara.minute = tmp_mm;
( _9 F( A* {1 `4 Z0 Y& D: M }! p& a1 j( g3 V' A: {0 d
while(tmp_ss == 0xFF)
9 K- D# ^+ m+ }* Y; b& f5 j {
% J4 K6 i; |+ h% T' a4 s tmp_ss = usart_input_threshold(rtc_buf[14], 59);4 s. ^) L5 X9 r0 Z( s( \; V
rtc_initpara.second = tmp_ss;+ T9 v; T, D# f! ]( v* Y! i
}
9 [! ?- ~1 S: o9 z8 q |
l' T# I6 g( V( \2 u+ Y7 Q! g' C /* RTC current time configuration */
! A( z! k0 `6 r9 D0 ` if(ERROR == rtc_init(&rtc_initpara))
! x, B" n5 c+ ^7 t {
6 `' Y f" Z* \9 \% _. z printf("\r\n** RTC time configuration failed! **\r\n");& O7 q5 [+ _, G3 u% L
}& V3 z5 |' W' ~! C: w
else& ^# g7 |9 ~" h8 W T* I' t$ l: R, t
{
$ }" v8 [* _4 `7 Q printf("\r\n** RTC time configuration success! **\r\n");
( l; Z6 f+ h0 f7 x: a1 F3 R }' ?+ M) I. I1 X3 F* s. f
* C) `+ w1 G2 u /* setup RTC alarm */
3 Q" L9 L" ?' n' _ tmp_hh = 0xFF;
; f3 |( Z/ E g5 C/ S; L tmp_mm = 0xFF;+ x* x" X, ^9 J
tmp_ss = 0xFF;
: u! _5 K# C# r9 ?+ S- }( A5 z x
rtc_alarm_disable(RTC_ALARM0);# y% V1 N; g3 B$ a) s! h
rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
5 P6 R" H; d9 [7 s% t rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
5 I% {" p d& y6 b1 }2 K& F alarm_date_data = HEXtoBCD(rtc_buf[15]);
% c0 }6 y* B6 O* V% Y: t rtc_alarm.alarm_day = alarm_date_data;* @1 Y+ L- ]1 R ~6 Q: X
if(rtc_buf[16] == 0x00) G& G q+ F9 X7 x
{" h7 g9 j% ]. Y- ]
rtc_alarm.am_pm = RTC_AM;
* E! D o1 V3 Y& Z$ \0 k }
, T' k k; G. V0 n" Y' O else if(rtc_buf[16] == 0x01)
2 R# B; O7 S$ t ] {$ `; I+ C9 D2 z0 p* [3 F) V
rtc_alarm.am_pm = RTC_PM;1 k1 T3 ~9 v$ h& U; |% Z
}) _8 ^' z0 g+ k& M5 N6 ~6 ]* Z6 h
/* RTC alarm input */5 f& }: O' O& X6 X4 U
while(tmp_hh == 0xFF)
' c' s% |9 a& T6 o9 A {
# p, r5 e2 H; H! @( S1 X) d if(rtc_initpara.display_format == RTC_24HOUR)
( D. z( y/ r' L _2 a* f" A( [ {; T. G$ h9 [" ]$ i. G1 b
tmp_hh = usart_input_threshold(rtc_buf[17], 23);- j# s% K4 a6 q4 Z( R Q
}, g! g) N! m5 V$ U- X
else
( a% l3 W) L2 l8 j" t) @ {" K# `" J. A A, }. L2 S' I
tmp_hh = usart_input_threshold(rtc_buf[17], 12);
- b4 J; z! d) b0 }! I& C6 s }4 C9 H6 C; t6 l+ @
rtc_alarm.alarm_hour = tmp_hh;
6 \/ t5 P6 z% z3 C- f% C3 Y, S }
6 }1 J( n7 c; W; i4 n% u" E- s0 v8 c% V
while(tmp_mm == 0xFF)
* P1 e" A: t. J {8 I2 R W& I) N, H4 {% H
tmp_mm = usart_input_threshold(rtc_buf[18], 59);
& M; |9 R& A6 ~% O$ I rtc_alarm.alarm_minute = tmp_mm;
! N+ q/ s& h+ P9 I* T8 P4 F# B2 V }
, I0 Q# c- O2 J O$ W" r- ? while(tmp_ss == 0xFF)
, X' R7 O2 ^" K& f {
: q; m' |- i, W! p" ~" D tmp_ss = usart_input_threshold(rtc_buf[19], 59);9 p) a) h2 U8 L3 r
rtc_alarm.alarm_second = tmp_ss;8 ?5 |+ J9 ^( t: _6 I: I4 A
}
# \# v+ u1 ]8 G; e" z
7 _ c7 o# R T. y9 E R1 e, g rtc_flag_clear(RTC_STAT_ALRM0F);8 B! d; j8 s$ U2 U: k' q6 o
exti_flag_clear(EXTI_17);
; c3 V) k, n$ @% }8 f3 a! C2 T$ J e; i( F5 ~
/* RTC alarm configuration */
; z! K: l' g6 o( d; F } rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
+ F2 }+ ^4 U. i7 ` nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);8 e6 h$ B, \* ?" i' D
rtc_alarm_enable(RTC_ALARM0);
: L- f; }( S/ v G9 C
3 B. s9 p% V/ ], G9 U& {! ?4 p /* RTC alarm interrupt configuration */" G% j4 F+ k; U3 t3 p/ N
exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);) J: z4 z; n8 ]- D a( s
rtc_interrupt_enable(RTC_INT_ALARM0);4 n8 t' d, l$ }2 P D
}8 [1 q3 M0 d4 y1 g$ K+ L
, C+ Y. A) N" t9 n3 t7 H
uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)2 F8 t0 P; i+ F. ~
{
' `" {* ~8 c |& n; } uint32_t index = 0;
" M6 O9 s w- o s uint32_t bcd_data = 0;
+ D; u& L" G/ r+ v' h$ ?& Y4 o7 I5 w$ L& u" z
bcd_data = HEXtoBCD(buffer);
5 N; C6 M% I7 M- P6 { index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
. y2 k/ Y& S' t9 m0 H if (index > value)) }" R6 g8 p- ^5 h! M4 ?
{
4 \8 ]/ w2 {# s2 Y5 K! b printf("\r\n please input a valid number between 0 and %d \r\n", value);, \) |( Z4 R! ^' Q7 q: i: h5 K$ m
return 0xFF;
x- L, U `5 w9 o; [6 W, h% k }. R0 Q. _, j& y( O
return bcd_data;# S0 _0 L7 \& a) c
}
* }/ o/ t' f, D- z: P5 h6 n, i0 F# f7 }! E) E
9 p3 ~& o, B6 c
unsigned int HEXtoBCD(unsigned char hex_data)& s3 T8 c: Q$ b9 q! x3 B
{
h, u% w) D/ P' t& M unsigned int bcd_data = 0;
9 H) I; a- ?( s9 {/ o unsigned char temp = 0;
V0 G4 ^! I9 X8 ]+ C3 B- m3 _& ?
temp = hex_data % 100;
/ ^; p! p+ C4 `) [2 m+ w6 M" r7 y. o6 C$ X bcd_data = ((unsigned int)hex_data) / 100 << 8;
m( y% I5 C9 n; k) ^4 U( l5 |4 ^ bcd_data = bcd_data | ((temp / 10) << 4);
4 F: M" D5 b, o6 q5 t bcd_data = bcd_data | (temp % 10);
/ T% c! F: C9 A) W2 t% V& Q return bcd_data;
" ]7 l9 J- N6 @}
7 D# ] C7 J! yvoid RTC_Alarm_IRQHandler(void)$ x/ T2 B0 ~ d; r
{
# ^) i! p9 p6 ^9 g7 S- r BaseType_t xHigherPriorityTaskWoken = pdFALSE;! E! N7 L& U, F; L4 x; E# s8 J- S
0 _/ J8 G* J+ y- V7 L7 |* K2 C if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
0 R, I) u. f6 S0 I4 k& U0 L, X {/ x* b! q1 {9 N& a( W
rtc_flag_clear(RTC_STAT_ALRM0F);
( \" c# @: ]& T8 L& ^. K' c, ? exti_flag_clear(EXTI_17);' m) p0 v3 g1 z! a ]
rtc_alarm_disable(RTC_ALARM0);
& }, t6 M9 N2 }5 z" X led_toggle(LED1);& {" E' L% A- d2 @/ t3 a/ |
}
" O& h* v# y/ u}. e) q+ Y0 {3 p" F% y7 H. Q; q
|
|