|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。
. |& `+ x& }# A, z( H% ?. h6 P8 u8 x以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。, |5 m# J D6 y$ A4 l. w o
void rtc_pre_config(void)
A. `6 `6 _' j" L+ R{6 z* n+ W# p; G
/* enable access to RTC registers in backup domain */5 K( o: Z" v: ?/ n) ^ c
rcu_periph_clock_enable(RCU_PMU);/ X n5 h+ s; e1 j+ g
pmu_backup_write_enable();* v' s% M0 Y0 C2 H& d6 o9 Y# r+ ?: n
. Z6 W: i1 ~/ n) ~ H% Z
#if defined (RTC_CLOCK_SOURCE_IRC32K)7 T! p: R; e2 ~4 \
rcu_osci_on(RCU_IRC32K);( Q' D! r; _2 H3 J) v. a0 w7 a9 K
while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
1 B! I! |0 R' M" E( K& ^ rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
% z0 A6 \+ X6 y% b0 W prescaler_a = 0x63; //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ6 U" i4 I5 R8 A) n3 F' g/ I2 N3 q
prescaler_s = 0x13F; //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
0 {: g8 T( F! @9 Z" W2 c" r#elif defined (RTC_CLOCK_SOURCE_LXTAL)
) s, V! p+ {' Z$ t rcu_osci_on(RCU_LXTAL);
, \ f' q& f) m5 j" [5 {6 e rcu_osci_stab_wait(RCU_LXTAL);& `' T9 i* q, j/ e% m
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
2 g% g w$ C0 z4 P" d4 g4 G prescaler_s = 0xFF;
3 F& ^0 k+ x* r& T, f+ G prescaler_a = 0x7F;1 z$ J/ \) s$ d' }* @4 W" d
#else, Y# a6 O& H9 ]
#error RTC clock source should be defined* } h5 n# h7 e8 Z
#endif3 A8 ?# a3 V# P* L4 }: x5 n
rcu_periph_clock_enable(RCU_RTC);( N/ \$ j; H$ W2 ?
rtc_register_sync_wait();( r. |2 x6 P5 K- a) x
}$ Y0 I3 p- }6 X3 T0 R( U& [( c2 }- u8 y
4 u6 j7 L0 s. J% T5 ?& Z
& F7 s* F+ J) `) X% \$ j: R3 x5 E
void rtc_setup(uint8_t *rtc_buf)1 T* Q- y" h* b8 G" R6 j
{3 L* I4 \8 b. Q. j( ?# c
/* setup RTC time value */
; c& m2 f+ j+ d/ _ uint32_t tmp_hh = 0xFF;% y. W& T: w7 q4 e% ^* N
uint32_t tmp_mm = 0xFF;' ?1 N8 U- W. P6 j9 T
uint32_t tmp_ss = 0xFF;
) {1 |. ^0 f1 h uint8_t year_data = 0;
. z+ l5 O0 R! m uint8_t date_data = 0;+ b( e9 |& J% l* l# }& y0 x
uint8_t alARM_date_data = 0;
7 r1 W7 D: y2 ^' x
; f7 N5 ?; c. ^* x7 F rtc_initpara.factor_asyn = prescaler_a;0 M! ]3 o8 t7 ^0 g% m
rtc_initpara.factor_syn = prescaler_s;
" \6 E) A2 O4 u0 p# S6 w year_data = HEXtoBCD(rtc_buf[6]);
4 M0 R" t" B. L N6 i. W" B& c0 _! q rtc_initpara.year = year_data;) ~/ e3 X+ f- J7 ]" ~! l) P; v
1 M' K) P/ ?: h
switch(rtc_buf[7])
6 O5 ]) [4 H1 n/ l# R- r" G {
8 }. _0 X; ^+ ^( f4 V case 0x01:
; O$ v0 o9 P( u) Q$ p& s7 y rtc_initpara.month = RTC_JAN;
' R( m' D' Q7 R) v+ e/ v* |# T5 i break;
" |, p. Z2 p$ C8 B9 a3 u& O: } case 0x02:
1 D& n7 V' H1 W; Z% o rtc_initpara.month = RTC_FEB;$ }" L3 E2 W7 Y+ f) z& M) A
break;
! Y4 H+ {' c# ?9 ` case 0x03:( m6 i! T, M- R) Z1 \5 b3 T
rtc_initpara.month = RTC_MAR;
" T4 w7 a; @$ N2 p2 ~ break;
i/ W1 D) g B% `8 ]& ~) _ case 0x04:
2 a1 _! R. ?% z0 \4 a! [ rtc_initpara.month = RTC_APR;
5 v7 |7 |# W. Y* a! c& i X6 H q break;3 D4 M8 ?: ] ]
case 0x05:
0 q- s4 }4 o7 r rtc_initpara.month = RTC_MAY;% e4 l) ]. l1 ]7 I0 b5 Y) m: |$ b/ S" V& v
break;
$ C3 A) @" E ?. t9 E case 0x06:6 `# h# t( o, d9 l$ l! o
rtc_initpara.month = RTC_JUN;
; t) w" f5 G2 s3 g' P0 ^ break;. Y: h: @% J. e/ |7 K3 m
case 0x07:
$ v8 X. S4 r2 F rtc_initpara.month = RTC_JUL;3 K: f1 g# }& z9 \) d; z$ v- T
break;; F4 m' D0 O$ {
case 0x08:! T8 k) R: X5 N l! ?
rtc_initpara.month = RTC_AUG;, Q5 Y2 I* m7 o5 m) s
break;
7 T" Y- X) x! Y/ W6 h case 0x09:4 o5 h! |8 Z: A, r8 N
rtc_initpara.month = RTC_SEP;
0 v6 e7 j, Q2 r$ j1 H+ E break;& G. D9 k5 d% W- `6 {
case 0x0A:
7 }! c/ {) _7 w" i8 n9 e; h# U rtc_initpara.month = RTC_OCT;
7 Q- U4 a1 Q+ Y' J# i" q+ T# _/ O break;3 _) ^; r2 y9 C5 t: |6 L0 C2 C( N
case 0x0B:6 M# u( K! D& j. g: F. S y L" }
rtc_initpara.month = RTC_NOV;9 E9 C7 k2 A8 w
break;6 T5 ^ k9 g# H( f
case 0x0C:1 m/ y& m+ V+ b* b
rtc_initpara.month = RTC_DEC;
U$ H7 J1 F. G [) ` break;
* x: s4 b( a! @' ^/ S default:
$ `% K$ Z& Z" n f* r+ ]6 E8 S; ?# Y break;
; i5 M( Z% E: s I. Q }5 P$ h5 t$ B0 a% G; ]
date_data = HEXtoBCD(rtc_buf[8]);
2 q8 F% `( v& Z. [ rtc_initpara.date = date_data;; ^! `; {' R5 N/ R c# y
switch(rtc_buf[9])" A1 V. J7 B% [8 I7 W1 j
{& z7 {$ I% l7 C! \, H
case 0x01:6 ]; r: w. B2 d( U" x; k
rtc_initpara.day_of_week = RTC_MONDAY;' {- ?: A; S8 S6 m v5 y
break;. k* G- B( |6 x8 c8 ~
case 0x02:
! s& J, i, F! O8 ?7 c rtc_initpara.day_of_week = RTC_TUESDAY;
5 D; c( {! x3 O& _ O9 j break;
q& r: N: }) S Q, @; U, o2 a case 0x03:, x0 O, c& Y/ G7 T, N. m
rtc_initpara.day_of_week = RTC_WEDSDAY;
; C4 o% X$ E( P6 [7 |' y, | break;
- S7 z$ m3 B7 C case 0x04:: W/ @. n* o6 k& a' L
rtc_initpara.day_of_week = RTC_THURSDAY;
) I$ s* ~3 p# S3 S8 @2 k break;& P( ]9 E9 q/ }5 s8 m
case 0x05:
: u5 B2 u( d! `" k4 N: R rtc_initpara.day_of_week = RTC_FRIDAY;
2 m0 w! T3 e+ {7 o break;
* i$ ^5 H% q4 L0 p6 x case 0x06:
# I" \" R# e7 ?, a; m rtc_initpara.day_of_week = RTC_SATURDAY;
! k3 B9 M- x9 W% z* h1 w6 v( F" [ break;
9 F# t8 C7 [3 c7 V4 H case 0x07:
; o: w) c, y& L2 j p rtc_initpara.day_of_week = RTC_SUNDAY;6 X9 s' l7 m, Y1 n- P% p& R
break;$ ?0 C) t y: L: }7 h. C
default:
) Q- v9 B. X% j' H! n. }% ` break;5 f# j/ P+ t% M. q5 y
}
! p4 R) r0 V+ u2 N if(rtc_buf[10] == 0x00)# g0 Z8 \) D) V. y" g
{
0 m/ e' k3 ?1 |8 z* _ rtc_initpara.display_format = RTC_12HOUR;, q4 V9 r0 O9 N! Z
}$ c, [) \. S I0 _9 {' y
else if(rtc_buf[10] == 0x01)
7 I5 g5 r, k" E {% P* h8 k! H8 K1 Q2 |
rtc_initpara.display_format = RTC_24HOUR;
# h- D" A. j; R4 P( x+ I3 | }
' O+ o7 D) l: ]3 A if(rtc_buf[11] == 0x00)5 \; W0 L4 c3 e0 c
{
+ S0 ]$ E! _3 v0 p* t rtc_initpara.am_pm = RTC_AM;: z$ }: j" t& ]
}" B/ Q/ [# o6 y4 M
else if(rtc_buf[11] == 0x01)
1 L6 \7 _! W6 v9 j: h0 { {
: d" J D4 B3 z: Z9 C- T! { a* s) | rtc_initpara.am_pm = RTC_PM;5 y9 N( C& ]" L6 `- E. N
}
1 G) v/ S' v5 I. Q* T {( j% h' j /* 输入当前时间 */
5 U$ l7 V; w V; l# _+ H: `1 Z while(tmp_hh == 0xFF)
8 A/ m; R8 C3 S; ]6 I {' B T* \$ z% h N8 D; Y0 D
if(rtc_initpara.display_format == RTC_24HOUR)7 v& M5 j: [+ ~; o
{
2 {( W7 A' P/ v( n. r; ]6 H5 C/ v tmp_hh = usart_input_threshold(rtc_buf[12], 23);; R9 f" E9 a1 r: A8 v. k
}+ l* @7 E6 \+ S! M) Q+ ^
else
; [3 G$ |! l6 H' i3 k7 i {9 Q- m- r& x) Q8 _4 x6 D# C
tmp_hh = usart_input_threshold(rtc_buf[12], 12);
. Z/ F1 K+ ^; e; W0 s }
/ }# ~$ h6 Z5 Q; x+ l$ v4 |+ e2 u2 z rtc_initpara.hour = tmp_hh;
5 I" U7 d5 I7 W+ ` }& N% V& t& Z I
) K" a) a% @8 ~! u4 ?
while(tmp_mm == 0xFF)7 q! A! N6 X( L* \7 x
{5 ?6 y: G/ X/ M; Y# ~3 }, j
tmp_mm = usart_input_threshold(rtc_buf[13], 59);. w0 d! l2 m& m1 j! ^
rtc_initpara.minute = tmp_mm;
5 v" m( d& Y& e6 e% W2 E }5 N2 _6 W& h1 z; r8 d4 U
while(tmp_ss == 0xFF)
* }, u5 M# C6 h" T {
+ s) t6 O& o' ^. v2 g3 H- S/ n tmp_ss = usart_input_threshold(rtc_buf[14], 59);
# K+ t0 A- h7 l rtc_initpara.second = tmp_ss;. B, q7 q* M0 k9 o# \$ T
}+ C% Z- r/ K* V3 \& l4 q5 {
6 p' |' K: h/ ]) C( L+ D
/* RTC current time configuration */
$ S: U* g, w$ ?) ~4 d if(ERROR == rtc_init(&rtc_initpara))+ [% S. Y: J' Z5 e8 @
{
- U9 f4 m% n7 l printf("\r\n** RTC time configuration failed! **\r\n");
?: L' d# o( J4 c2 }7 D/ ] }
7 i3 P4 B0 t( v* f8 s else
. M; z7 J4 O' m6 r2 e {
7 k# W/ ?# J5 J; N5 b printf("\r\n** RTC time configuration success! **\r\n");
6 V! b, i- ~: V$ S }
+ U- {3 t) V' O& X0 @4 N
2 M3 f0 |! m1 Q2 z$ N3 ~3 U /* setup RTC alarm */& z. ^4 l6 h+ s" m# F$ E( g5 ]( F+ ?# q) D% [
tmp_hh = 0xFF;2 `4 C- l5 d1 W- b+ b( Y
tmp_mm = 0xFF;
{) N. F$ x1 I0 u, H$ v5 N tmp_ss = 0xFF;6 u! B5 R7 V- x
4 x; X/ f3 F) `0 R4 K rtc_alarm_disable(RTC_ALARM0);% G, O' ~0 [9 X7 H) X* |% r6 c) \* Y
rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
4 N3 ?8 ~1 Z4 X+ o- L rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;" @8 {- t% m* @- Q
alarm_date_data = HEXtoBCD(rtc_buf[15]);: j2 l8 e# U# L- r, `
rtc_alarm.alarm_day = alarm_date_data;2 L+ Z* \, S/ N0 |0 c. e r6 _! g" t
if(rtc_buf[16] == 0x00) u( H4 X0 Q7 a5 a9 M* _
{6 X; P U+ Q9 @) ?' u
rtc_alarm.am_pm = RTC_AM;* B+ P3 |5 z7 x- b( E! ~
}
& D% N! |$ Y6 a3 ]$ i* p else if(rtc_buf[16] == 0x01)# S! W. L; b# ]1 S
{% _8 L" g/ A& W
rtc_alarm.am_pm = RTC_PM;
/ O0 A: G% \, I' o& J }
5 f! @) I+ O3 _. A0 K6 T /* RTC alarm input */
8 _9 ?+ Q9 q3 k( J# W4 j while(tmp_hh == 0xFF)
6 B; O6 N- W1 ~& r1 k1 N) ?2 H {
7 M9 |0 w0 R# _/ P. y# g1 K! Q if(rtc_initpara.display_format == RTC_24HOUR)
: Z# H0 ^. |) t% u {; `( D5 x" D& V
tmp_hh = usart_input_threshold(rtc_buf[17], 23);3 ^) r8 X: V) U: a1 q3 G
}8 e' z* j) _% w8 m4 Z! v9 M
else
; @! l6 o# K( Q# C: n {
0 h3 {: C! T- s: M tmp_hh = usart_input_threshold(rtc_buf[17], 12);
1 l0 a) K9 @3 j/ N }$ F) K% o8 I' ]& [. S3 \5 L
rtc_alarm.alarm_hour = tmp_hh;
# G! q0 s E* A4 G4 q' s' J) Y* X }
/ t2 }% D2 S' b7 Y% e8 O0 {. {. a7 B+ Z5 N0 c6 j" c
while(tmp_mm == 0xFF)
, L- V8 ~$ f+ ~5 J5 M4 @ {, Q+ ?: N3 E1 ]5 i
tmp_mm = usart_input_threshold(rtc_buf[18], 59);
$ i- J7 E/ }( U% }# Y* g% M. o rtc_alarm.alarm_minute = tmp_mm;% F0 X8 B v" B- q* u8 V8 M) ^/ N
}
) @; V9 A( r6 h+ S6 T1 \ while(tmp_ss == 0xFF)5 } Q4 K, q# i8 F9 o
{6 I! l8 T2 a b. @4 Y) j
tmp_ss = usart_input_threshold(rtc_buf[19], 59);" Q0 e( H( X# C5 S9 ^/ A
rtc_alarm.alarm_second = tmp_ss;
* r. k" s% _7 e9 E9 @ }* B, I- i: f7 Z5 v _$ p8 m
' Q! L* E) m: o: E
rtc_flag_clear(RTC_STAT_ALRM0F);
. [; c g3 E7 Q% U( P& x! R7 Z exti_flag_clear(EXTI_17);" D8 Z7 B+ E/ x6 D; W) v$ B
Q5 b5 m" M M) u+ S* K
/* RTC alarm configuration */% v1 b% V& o8 k8 w! d/ ^
rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
. u) Q% Q' Z8 C3 Z" G nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);5 _, B9 @" E& R/ [
rtc_alarm_enable(RTC_ALARM0); c' I( X U7 M" S2 x% C
: I4 b# V2 z& u7 M+ E$ h
/* RTC alarm interrupt configuration */% W! u' `0 \7 p
exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
; J G8 a9 v, m1 K/ o rtc_interrupt_enable(RTC_INT_ALARM0);4 O6 [4 `6 H* G7 c g5 G9 Q# v
}
0 l D: f- a5 }0 P' ]2 K2 `. ]4 t$ _- d G8 Q* A3 {6 ~" t; ^
uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)0 w( @ R( {" F% G0 y6 w
{& F* R! B1 M' A% c- j3 d! {) W, Y) L
uint32_t index = 0;; |9 H h5 b! Z0 T# b
uint32_t bcd_data = 0;# D0 m- B) V3 _" S
! k! `7 n ?3 V' t2 L
bcd_data = HEXtoBCD(buffer);6 ^9 P& U: C' ?2 F2 O
index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);" `0 K4 x2 o- W, `9 J) l$ P4 H
if (index > value)& F4 J, B9 o% a7 x H
{. g0 w$ l; I$ p/ F5 k
printf("\r\n please input a valid number between 0 and %d \r\n", value);: [; O5 [, T' t
return 0xFF;
: Q3 |" B+ R# A* H0 } }! T# G$ t0 x4 ^1 i" F
return bcd_data;$ H. P& |% `7 Q) r, I: p z+ c( Q% N
}
, k6 G0 c7 f. T+ l* f! N9 E Y% R: y& i% a7 ]5 s& o. f
4 ]3 l* W3 a, M8 o' B$ I
unsigned int HEXtoBCD(unsigned char hex_data)- ]$ |" i5 Q) o/ v1 b; }
{' K: z1 T- l! X+ R( C, @) t
unsigned int bcd_data = 0;
) i; V8 P$ i) y$ g6 l unsigned char temp = 0;5 ~( ~8 o& j% [3 ~+ q
V8 F! Z T" h: \5 Y. p7 K
temp = hex_data % 100;
" x3 W3 ]; T: ^% {; a0 n2 B bcd_data = ((unsigned int)hex_data) / 100 << 8;- I+ ?( h ~. j9 i& N/ K
bcd_data = bcd_data | ((temp / 10) << 4);
& y6 Z6 _1 Q2 c' a6 p% O bcd_data = bcd_data | (temp % 10);
* T! \! ^! t9 Y# t9 h8 p5 x* Y5 e+ g return bcd_data;- T0 u1 i8 n5 v( [0 I
}
$ Y( R) G e5 B8 v1 [void RTC_Alarm_IRQHandler(void)
& G) l9 ~% Y0 [$ V4 E- ] Q{
8 ^9 d$ ?2 W5 A4 J0 ?& F BaseType_t xHigherPriorityTaskWoken = pdFALSE;
% x$ Q5 L u: \' d7 r6 X# ?8 S8 z- K! `1 O) N* I2 s+ W9 D
if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
7 O' X; s# m) N3 A \9 _ {
, q A( v/ j. `4 D1 m, H+ @ rtc_flag_clear(RTC_STAT_ALRM0F);
& \- M$ a& i. u( H/ R& U9 t5 j" n exti_flag_clear(EXTI_17);
' Z! t2 d8 S# M! r6 b$ P; i$ ] rtc_alarm_disable(RTC_ALARM0);
! u+ n( t& A U8 m$ i0 b led_toggle(LED1);
e) E% U" `+ Y: x' \( u& Q: b }
. O9 G/ k. f6 J' F) w" p' E! t/ G/ M3 C}5 p1 e5 c6 \0 t6 I7 [) x# z0 v
|
|