|
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
|
|