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