|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。
# j. R8 g9 t* e/ U$ a以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
1 t! Y8 U' n, O3 P2 n: x6 D3 @4 j) ]+ Ovoid rtc_pre_config(void)
7 M6 _$ d4 d. j{- i! K% w" z, Q7 K
/* enable access to RTC registers in backup domain */) a: l* l( \3 [- z( J
rcu_periph_clock_enable(RCU_PMU);# ?, h8 G; V: o, x& m1 p. ^
pmu_backup_write_enable();
1 z( O8 ~' t9 d) I5 P% i( Z* c( [" I( r5 Q% ?
#if defined (RTC_CLOCK_SOURCE_IRC32K). Z# G9 y& H$ S! e6 ]" P
rcu_osci_on(RCU_IRC32K);' W, W7 w$ c# \0 n( |( f$ H
while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
+ {, O8 A! d7 @1 \ rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);8 n; h9 n, d$ _: ?% K x% M; i) F0 N
prescaler_a = 0x63; //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
: h# e/ }& G% m7 Q prescaler_s = 0x13F; //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
# R }, J) |7 n% @8 x) X#elif defined (RTC_CLOCK_SOURCE_LXTAL)' J3 x$ ~6 j$ T+ C6 b [$ R
rcu_osci_on(RCU_LXTAL);
5 @3 S0 I7 G- X2 t, [9 [ rcu_osci_stab_wait(RCU_LXTAL);
% A# l- S/ X. V rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);0 r8 n# h( c% r" a+ S: a* c" {
prescaler_s = 0xFF;
0 P$ e7 }3 z( P prescaler_a = 0x7F;
8 E0 C! P0 \; W; C. l #else
9 I2 \! Q. y. a$ c. {9 a #error RTC clock source should be defined. j( a2 r, ?9 C9 K
#endif
- V: j* c1 i4 t4 Y rcu_periph_clock_enable(RCU_RTC);4 I) ]9 R z" Y, b Y
rtc_register_sync_wait();
, z0 E q# E/ Q1 @}$ B4 s; G g. \2 q$ T! J; S
' i$ s5 V" @$ T4 S# C; K- N6 R- {8 M f J0 K1 }( n( ]
void rtc_setup(uint8_t *rtc_buf)
0 _! Q) p; Y0 c+ }) q{
" s7 Z$ X' S! I' V- @ /* setup RTC time value *// x8 C9 I/ F5 S
uint32_t tmp_hh = 0xFF;
! ?7 S% _% w. Q( y9 ^2 N uint32_t tmp_mm = 0xFF;$ x( E" A2 x0 \( w% o, f
uint32_t tmp_ss = 0xFF;1 I0 B& J3 k& b3 M
uint8_t year_data = 0;
& N N: _ B; T! y uint8_t date_data = 0;
# u$ q f# y$ ^! d' c) N3 N5 l' W uint8_t alARM_date_data = 0;
) @( U- }6 ]3 V3 }
& f. \9 x8 r* j$ d# L rtc_initpara.factor_asyn = prescaler_a;( h+ X7 K' ~& J' f# i9 ~$ J
rtc_initpara.factor_syn = prescaler_s;
I1 M% {6 [: J year_data = HEXtoBCD(rtc_buf[6]);) n! {4 X" P, D) }6 Q: p9 o
rtc_initpara.year = year_data;
7 r) p5 N$ {0 d, Y% v
/ D9 r/ d; U! e8 N7 { switch(rtc_buf[7])7 W! V5 t$ E0 J. `- N. i( Z5 u- o7 }
{0 h3 X5 ~& E2 ^3 V' b& I
case 0x01:* z: t$ }8 ?& ^0 \# b% q( Y
rtc_initpara.month = RTC_JAN;
& }0 D8 b& t+ A break;) }( t% j; l& {% S- J5 t* q
case 0x02:
: x# I L' V+ V3 A rtc_initpara.month = RTC_FEB;& N9 y2 `% K! K. ~ ]6 [7 o# i$ y$ t1 H
break;7 Q) X5 O% V- F9 k7 B
case 0x03:
|. K& P q7 s1 H rtc_initpara.month = RTC_MAR;
* @$ W" ^ U6 T" }7 r. K* p/ Z. L break;
; i$ ]- D, ?- y- G/ B2 Q; @$ Q case 0x04:
) p& v- n* C9 c rtc_initpara.month = RTC_APR;
! b" v. H3 x! D break;
2 O" t# K5 h0 ?; f case 0x05:' x5 \8 `1 \$ b2 A4 X# p, _
rtc_initpara.month = RTC_MAY;' B: m1 ~5 Y7 y. D
break;0 i" Q7 p- I' m1 \7 \
case 0x06:; ?, Z) \ \$ }& Q
rtc_initpara.month = RTC_JUN;
# G. _) D" }9 T z, \ break;
# _7 V% y; d1 X! W" y3 I+ | D) t$ b case 0x07:
0 J) n7 W" x3 m rtc_initpara.month = RTC_JUL;
# s9 i' h0 N: q1 X* @ break;2 G* u1 V" @ A$ s
case 0x08:
) v3 s# Z* R) R8 m1 R* a# \ rtc_initpara.month = RTC_AUG;" d% Y* F' R" s
break;
1 l* g( ^+ Z7 [* I case 0x09:
0 j F+ A' z7 f* _ rtc_initpara.month = RTC_SEP;
# k, W* w0 \ W+ e break;; `1 B/ d3 l% k0 ^1 \
case 0x0A:9 |) R( J$ ^1 x# I# H- \8 M/ i: \
rtc_initpara.month = RTC_OCT;
3 G+ k. K! Q' K# I break;7 z* f- x$ s1 Q- b
case 0x0B:
$ n( P# H* t0 l rtc_initpara.month = RTC_NOV;
, [6 }1 O( e; j, ? break;
- g6 p% y0 b3 i. P% d% B& | v7 J0 o case 0x0C:8 X5 T, k8 ? ?5 L$ u8 v. [ o
rtc_initpara.month = RTC_DEC;
5 B* l* R" J1 _6 n8 F break;9 t" ^% d1 `) z" i- h: W
default:
! Y4 w# i- D y9 E break;
% n N5 G) e5 I }
, Y1 P! Q- C2 M3 [$ j3 H date_data = HEXtoBCD(rtc_buf[8]);5 Q" L' \( h3 ~3 l$ z! S
rtc_initpara.date = date_data;2 G( Z/ b+ ]& w0 [% Q
switch(rtc_buf[9])+ u6 k4 p1 P( I E3 d2 |; y; C$ p6 n
{
) ~( y) A+ @& J; `( j5 b case 0x01:
! J8 k8 t' M: c; N- c rtc_initpara.day_of_week = RTC_MONDAY; l4 ^+ U0 U% o! Q1 Q
break;2 z3 ]: k; d5 X
case 0x02:
$ q6 w# |+ m/ B; H& { rtc_initpara.day_of_week = RTC_TUESDAY;
( k% C+ U5 }5 e: p/ g8 k: m break;4 }, K' u# R8 R) T: h O
case 0x03:* P4 q6 o7 {7 R: n. ^9 m
rtc_initpara.day_of_week = RTC_WEDSDAY;% }# p) U: _/ n I( |6 I4 A
break;
" A' b8 ]: i: z, w. U9 e& {: | case 0x04:
; \. R, e9 }1 z' p) h: E rtc_initpara.day_of_week = RTC_THURSDAY;
1 P6 A$ E, p* D7 X" x break;
4 `9 ?: I" s5 g; t case 0x05:# F8 |6 z, I+ ]+ K4 K$ `# U! n; w* @6 b
rtc_initpara.day_of_week = RTC_FRIDAY;
" J0 z) C: X: @/ [, f4 m break;
* J1 W' b" z- U, B$ \# l4 N3 Z case 0x06:
6 C y0 n S6 X( _, ? rtc_initpara.day_of_week = RTC_SATURDAY;
" b- C9 {8 F0 |2 Z2 r8 q/ f3 o; ^: k break;
: Z2 A. m; m5 A( e# x case 0x07:; l& E9 Q. M7 M8 a2 |% j% A, p1 I
rtc_initpara.day_of_week = RTC_SUNDAY;
! ~. W7 P2 v3 i* S4 C break;
" t- v8 |" `* {: R- h' x& B default:. `+ W* |+ ~8 R
break;
- p7 p9 N3 T% Q1 l2 N# X! R }
: W( [. P, y- \/ Y. r6 h P: h1 t3 g if(rtc_buf[10] == 0x00)
% z: x. C, U: Q6 x {
# T; h& y( U0 _, ?* v) l rtc_initpara.display_format = RTC_12HOUR;. K5 `$ r! J7 E+ J
}
/ X, }) N8 x+ G4 x! A+ X else if(rtc_buf[10] == 0x01)" y3 N0 z* w. ~& ?9 v4 ~+ b
{
! i+ S1 w% V* c4 _3 ~ rtc_initpara.display_format = RTC_24HOUR;
$ {! t u' w5 {8 C4 Q }' O+ r I4 t: C2 U# {. w& h2 o# X: N
if(rtc_buf[11] == 0x00)
2 k9 D( H9 s4 C9 i9 I; B {
6 l) b8 M V& } t! {. o! T rtc_initpara.am_pm = RTC_AM;
t. w: j& i% E1 g2 a5 b g }
# L k3 P, k' I6 V- ^ else if(rtc_buf[11] == 0x01)1 p9 c4 {% V( }& F7 q6 z1 b U
{* H' j$ y; f2 s* n" J5 y
rtc_initpara.am_pm = RTC_PM;; k5 K) c6 q7 b" T
}3 I0 b* d7 j8 d* l' |+ _
/* 输入当前时间 */' b J4 j8 a. k/ t: Q; o5 M
while(tmp_hh == 0xFF)
2 ^2 X* O" C; z( g: N4 C {* `$ K4 w/ q& S( U3 J
if(rtc_initpara.display_format == RTC_24HOUR)
5 S. I+ X1 u7 i {* f+ r D! p" c& W& E3 {% X
tmp_hh = usart_input_threshold(rtc_buf[12], 23);
9 l4 L$ t) k4 z- b* C' ` }" Q5 O1 ]9 X* z L' O
else9 k+ z$ \* g" {
{
I) _- D' v5 f1 \( `! C7 Z tmp_hh = usart_input_threshold(rtc_buf[12], 12);# {: z$ N* M/ t; }% u3 c5 e/ z& X0 S- G
}) W; t1 Y" m) c/ I& R1 ]4 M
rtc_initpara.hour = tmp_hh;* x& H9 r, y0 P# |% @5 n
}
8 Z/ a5 p9 o+ T% `0 T: G
# r# c8 f. }, X# E! F+ H* o while(tmp_mm == 0xFF)
5 x- Z0 }5 E# O& X2 g {5 e. w. e/ ]; Z
tmp_mm = usart_input_threshold(rtc_buf[13], 59);
5 \ Q0 k' \. A q) V/ V: d rtc_initpara.minute = tmp_mm;: ^4 [+ [! g& k# w! {
}
2 ?' b* t2 L/ a! [( F while(tmp_ss == 0xFF)( O2 V* D% u( b3 b
{
6 H7 m, [5 f0 d4 z0 u tmp_ss = usart_input_threshold(rtc_buf[14], 59);
: z# f7 a6 \* m- Z; Q rtc_initpara.second = tmp_ss;
7 o2 K3 V; n# h% v* n }2 {6 ]+ J( ], Z5 g) a- Z! S% m1 c
& w( h# v" c8 c d3 c8 Z# K1 m /* RTC current time configuration */
! Y y* c2 W4 [ if(ERROR == rtc_init(&rtc_initpara))$ e+ t4 M7 L5 ^
{
/ T/ P. f" o) D0 e" A printf("\r\n** RTC time configuration failed! **\r\n");8 A7 Q6 `* E5 ?( X1 X
}
1 S# i( n3 r/ @# D) M else
% t4 D3 B* p- N( D6 K {
8 I5 v' ]4 b2 D+ | printf("\r\n** RTC time configuration success! **\r\n");
3 v8 u# g8 f' R: l! ]" v+ Z }
L) y B! `! r* J' C
2 o' a( R4 }0 @4 F- E @ /* setup RTC alarm */" [. J- o; n% C {' \ F2 N
tmp_hh = 0xFF;
2 I* o# z5 }1 R, w! @ tmp_mm = 0xFF;
4 P' D$ z1 M/ I tmp_ss = 0xFF;/ _) B) C6 e4 g/ [
9 x. @+ g: a8 y0 q3 b
rtc_alarm_disable(RTC_ALARM0);
% Q7 k, Q- C1 \4 K4 l$ U rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;- j& j, K' {; _* H1 z: s
rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
* c2 `. y% _3 _+ _" G/ | alarm_date_data = HEXtoBCD(rtc_buf[15]);
. ]" h1 J# t1 ?$ U rtc_alarm.alarm_day = alarm_date_data;
# O3 z' [- f V6 b if(rtc_buf[16] == 0x00)- w! m# T" f7 h3 c2 ]
{
{- n+ o( e3 ?- M2 Y0 U# f. B rtc_alarm.am_pm = RTC_AM;
4 T3 Z) Y, @' q }, C& d7 K/ v9 Y; p
else if(rtc_buf[16] == 0x01)
$ H; b- N1 w' n0 v- r {3 k5 y$ b' @6 `& q [1 `
rtc_alarm.am_pm = RTC_PM;0 e' x: |; p8 Q3 V
}2 V) H( m$ ]! l: J0 N/ Z
/* RTC alarm input */
( M9 a3 M% I3 K* {; Y while(tmp_hh == 0xFF)- l- O& t$ M1 V. n3 u+ O
{
1 r- E& |5 s7 |, r% b' n if(rtc_initpara.display_format == RTC_24HOUR)% o- q$ ]) H7 N0 {) `
{
) o" E: s5 p( Q! M n) A& \$ S tmp_hh = usart_input_threshold(rtc_buf[17], 23); z" }) Q0 `7 a& k0 z J4 p
}4 z7 F: a3 K) u" Z& \8 S' H% N
else! o/ B, f. X. [. }7 N) v9 Z
{; K# ^ y9 g( u2 t1 L) f/ O
tmp_hh = usart_input_threshold(rtc_buf[17], 12);
, u2 e% N) s7 [5 L4 x5 e }
/ N( z* @9 A' L: ^6 Q- n) p rtc_alarm.alarm_hour = tmp_hh;" C3 U7 C6 e! d% a) C
}
1 h0 c9 o6 ?1 }
- p# F5 ^$ X$ u6 y- ` while(tmp_mm == 0xFF)# m/ ~# h3 M" ]1 J- q) I5 U
{* O. E ^5 N* U
tmp_mm = usart_input_threshold(rtc_buf[18], 59);
1 }+ T, @7 D$ ]2 P# }# E rtc_alarm.alarm_minute = tmp_mm;
0 i/ e2 e: r6 Y4 [ }
! G, j% x7 W; W while(tmp_ss == 0xFF)
" B' v( s; a) G3 ^ {& y6 K" s; E# ^* U
tmp_ss = usart_input_threshold(rtc_buf[19], 59);
: k6 ]' w! H9 r* r0 o0 w rtc_alarm.alarm_second = tmp_ss;' b) h7 g& T0 L7 o
}( m) N" F' m5 y7 L8 ^. S
% n/ [6 t+ \3 I4 r
rtc_flag_clear(RTC_STAT_ALRM0F);, ?: z: x' b8 S! \
exti_flag_clear(EXTI_17);8 r' R, z, s* g) g, y5 ? I2 F
4 p* N! U# \" l- L$ f+ J* [" h /* RTC alarm configuration */
6 }( f. q; E* S% R0 L rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
6 v2 i: @0 ^# V9 b) L* V nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);. R& T1 _/ Q+ x0 C0 ~
rtc_alarm_enable(RTC_ALARM0);/ H% b& N- R3 ~9 }% u8 A6 s
# ?0 T$ p. ]( H0 Z, V! I /* RTC alarm interrupt configuration */' A% l/ B4 t, v0 A! X
exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);" F2 t2 B1 e! w) `, C3 O
rtc_interrupt_enable(RTC_INT_ALARM0);
1 I8 u5 w4 {$ K& B( _; p5 j6 [. H}
8 l) L3 Z- K' Y# z+ Z) W: [( w+ n- W* ?( D
uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
* V) r5 n1 w9 F' g5 b/ Q{
+ c+ y) x9 |: T% D; o: n uint32_t index = 0;# f. S! n- ~& H6 \4 T
uint32_t bcd_data = 0;
! G2 `( o; P5 H$ r R$ k) F3 |) t3 c7 f
bcd_data = HEXtoBCD(buffer);
2 [- e- W# N( w8 _ index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);* o) k- }1 g) c9 ^1 Q- o
if (index > value)
2 s. r9 q# p" P4 n' A3 G' j { A+ f1 t ~$ L4 [. T$ j) B
printf("\r\n please input a valid number between 0 and %d \r\n", value);
( N; Z0 C0 [ X0 {3 ~- O3 l return 0xFF;4 {! R9 t! S C+ T: M' b, S
}
3 n1 t6 t# c9 _. p7 z% @+ Z' J4 U return bcd_data;
5 Y+ a6 z* b0 |0 d}
$ Q! E" d; h1 w5 Y+ n' Z
5 j+ e! J: F) Q( ?; M& ?/ [4 }+ ?1 y) i- e9 I6 i8 ]
unsigned int HEXtoBCD(unsigned char hex_data)
9 m$ z" s/ l& e; I# x+ Z o X+ B{
& x+ ?3 a1 h0 ?# o unsigned int bcd_data = 0;3 t. A2 o) F: u1 S7 m
unsigned char temp = 0;
* {' _% _- e2 ^2 r5 N" `! [- I# E& t% |9 ]
temp = hex_data % 100;, `4 a- f: R3 c( R/ S
bcd_data = ((unsigned int)hex_data) / 100 << 8;
. |2 R7 C* b8 v3 A bcd_data = bcd_data | ((temp / 10) << 4);
. `4 v6 J! a) t3 T1 t/ m bcd_data = bcd_data | (temp % 10);
9 |+ u, I/ Z5 Y, A# v4 {* b return bcd_data;
! {' l/ g: ]: D. m* k+ T4 u' h}
7 Y5 z8 l: p$ z9 z, ~! Tvoid RTC_Alarm_IRQHandler(void)# V" y0 b- }- H0 u( H
{
, ]0 v3 K2 m( o BaseType_t xHigherPriorityTaskWoken = pdFALSE;
) q# a) S" N. e7 j" U% _6 P( R ~( w" Z2 H# l9 X& H
if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
+ V6 B2 p) E' l" L" s2 w {; _2 k; H: _+ j& [: q
rtc_flag_clear(RTC_STAT_ALRM0F);
+ _- y" a7 Y& r4 S% Q7 R1 r2 V$ I: Y exti_flag_clear(EXTI_17);5 Q2 p% Q& y/ D1 H, t4 I
rtc_alarm_disable(RTC_ALARM0);
! d' Q5 R. w( x2 J8 { @ led_toggle(LED1);
6 A5 p+ O' b1 q0 }% b9 s }
8 x* x8 j. n% ^}5 v0 B! u2 J$ o5 O' n6 ` ]
|
|