|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。3 P4 `" q4 s+ c% `9 c: A. t
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。% ~ L7 Q) P6 ?! q
void rtc_pre_config(void)
( H5 O/ |5 H* s3 f{
9 ?7 f8 t+ ?, a$ L9 B* |; B /* enable access to RTC registers in backup domain */8 h6 ~/ X7 h* v
rcu_periph_clock_enable(RCU_PMU);
" c: _3 t2 E! z, w6 Y2 {! r, K pmu_backup_write_enable();
0 g0 f8 E5 V1 R. k+ s
! O$ s1 M1 [) c* i1 \5 g#if defined (RTC_CLOCK_SOURCE_IRC32K)
: U$ {3 }' G3 r4 K1 B rcu_osci_on(RCU_IRC32K);1 g$ M' ]) {# L2 J
while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
' d. ^4 g4 X% m6 m3 | rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
; N$ H) t7 j j, X; g5 ~ prescaler_a = 0x63; //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ% g! c+ n' U( ?( v! W0 Y
prescaler_s = 0x13F; //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ* ^9 F2 \' @9 C. ]) Q
#elif defined (RTC_CLOCK_SOURCE_LXTAL)6 M3 `5 ~! ?5 l2 D
rcu_osci_on(RCU_LXTAL);1 c5 X3 P6 o0 a4 S
rcu_osci_stab_wait(RCU_LXTAL);
" K8 R1 v! A. j+ L; |% q rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);6 p: n8 z5 [* o% c9 H- E6 {( ?- g
prescaler_s = 0xFF;
, O9 b7 e3 O2 E! W! d( @/ t prescaler_a = 0x7F;
3 E# o: T& c- S/ M1 I; h #else
# y# s& g/ M! H% e7 r #error RTC clock source should be defined, _+ y4 p+ b4 \, Z4 U, \
#endif) w0 Y7 ^. H% ^: B6 w7 z
rcu_periph_clock_enable(RCU_RTC);
) t5 H& v1 H: ] rtc_register_sync_wait();2 t8 O' p# Q) N4 @) U
}
0 @& d7 W2 O5 m3 K+ i8 N0 y# z% v3 ~, O
0 O+ h7 d( E3 @. Mvoid rtc_setup(uint8_t *rtc_buf)
5 x* t, D1 x4 P8 P# ]7 k{; }8 _ J8 G1 e/ u
/* setup RTC time value */% G. f5 E# B/ D) S6 G* Z6 a
uint32_t tmp_hh = 0xFF;' f8 }3 i2 K: }1 [1 }7 E% `
uint32_t tmp_mm = 0xFF;
0 A0 _9 O# N6 t5 s* C4 B uint32_t tmp_ss = 0xFF;% h# E3 B1 X0 s9 N7 z* u Q
uint8_t year_data = 0;- l1 y- v4 F# R# I# l" ?9 q
uint8_t date_data = 0;! Y* j3 S8 i* c/ n: L. l* S
uint8_t alARM_date_data = 0;& \+ y% O- c1 x+ T$ S
, u7 Y- e! s$ F- t" S
rtc_initpara.factor_asyn = prescaler_a;
- L! m0 j" h$ H4 ^ rtc_initpara.factor_syn = prescaler_s;
# e& t( R; }, Y( }3 e, u year_data = HEXtoBCD(rtc_buf[6]);
+ z8 t& m0 j$ C# P2 ^ rtc_initpara.year = year_data;4 p8 L' \ \' J5 y
; [' J( X. A! ] switch(rtc_buf[7])5 \: ?; P; s: k4 [/ _, L4 d$ o" H
{
0 U' R5 V. i9 x* C9 W2 ~ case 0x01:4 P5 t# X+ p6 K4 w7 P
rtc_initpara.month = RTC_JAN;
; e8 J$ G Z. Q, Q/ Y" z break;0 a6 I& l5 w. Y* Z: |- q
case 0x02: o) @1 `; N$ J V
rtc_initpara.month = RTC_FEB;6 B( B. |& Y. z
break;
1 p" r1 ]% E3 B case 0x03:% [. ? y& P1 j9 z3 |+ G9 n
rtc_initpara.month = RTC_MAR;+ N6 ^0 D+ x; a7 l
break;
c5 l6 p+ J5 g1 @. X6 U/ E6 Y case 0x04:
' W1 S5 R5 K# C w$ x, r' }, s rtc_initpara.month = RTC_APR;- P/ T' ^3 |/ n$ R4 C n
break;) c$ d& S+ t" W. l
case 0x05:
- Q m6 F) q. C. Q! Z; ^ rtc_initpara.month = RTC_MAY;
* t7 d9 w; _5 d5 K* T3 D5 D4 a3 z Q. ? break;
: i( _& S/ s# J case 0x06:& S. N7 q+ y& p8 G
rtc_initpara.month = RTC_JUN;
2 O: ?! d. x! d- d break;% L$ e( `2 ?/ |; N9 L1 e9 A
case 0x07:- h! ]% I( Q) A' ?9 d- {1 C- Q$ q
rtc_initpara.month = RTC_JUL;- ?6 M: H# w1 D; q# s5 ?
break;
& k- s0 e P1 T4 S case 0x08:
, d7 M7 W$ `7 {3 p) S6 \0 Z. ?' l, a rtc_initpara.month = RTC_AUG;
! g1 x, |8 b1 y, H. {4 n break;
$ B) o( H/ e6 u* }* i case 0x09:. f6 m3 m! r n1 [9 X1 g
rtc_initpara.month = RTC_SEP;* u; X8 c8 J+ p0 q4 Y
break;' A8 L6 V1 u8 R' x% o' j
case 0x0A:+ |! \: k1 X; J3 `' K( X! ^
rtc_initpara.month = RTC_OCT;
* r5 g: u' w( Y" n, s* `3 j% c6 q break;
( m1 O ~3 x) }9 d _5 I9 W case 0x0B:) c/ I1 J. b* M5 B0 E
rtc_initpara.month = RTC_NOV;& |% b* v+ l2 [8 ~2 l+ y9 C
break;
2 ]; s7 `' I, _8 Y case 0x0C:
* t6 d% {2 Q. P, q: A; z) y" g rtc_initpara.month = RTC_DEC;
- D6 X3 B, {) J/ N0 \& g, {2 k0 a% ] break;: |% A/ q T/ j7 u% S. N0 I; n
default:$ k5 ^% S% `! h# {: {
break;
0 S0 y# P) G p# \ }/ D; _7 _1 @6 ~/ [+ Y5 @7 u/ n
date_data = HEXtoBCD(rtc_buf[8]);8 P. ^* t8 O, u& G4 ~+ K
rtc_initpara.date = date_data;
) W$ E# f( W) R* p g6 I switch(rtc_buf[9])
) ]" a- D+ z1 r' T4 f$ ^ ]# b2 s' O$ y {( d- N! V& o+ J7 c
case 0x01:% R* _/ Z. Q. b" U- `9 o
rtc_initpara.day_of_week = RTC_MONDAY;
2 F$ v2 `- @, d) r; y8 G5 [0 e' r1 v break;& r6 `$ @8 E. t" h9 z# j3 B
case 0x02:
/ _2 T/ ^8 {4 ~# P rtc_initpara.day_of_week = RTC_TUESDAY;
6 z) M2 V$ x% Z8 Y$ { break;: b3 _: z5 _% [1 r+ C( p& T9 H: p2 F
case 0x03:* D; g8 ]* {. b& ^: p8 r
rtc_initpara.day_of_week = RTC_WEDSDAY;
5 h# a$ Z c4 |4 A( e2 v break;
" q% [6 v2 ~: J* I* |# ` case 0x04:7 y* L' }3 G& I2 J* N& B
rtc_initpara.day_of_week = RTC_THURSDAY;
8 M) o2 F$ v) i* h$ R" y break;
5 J% }6 I8 T: a; [! p; J case 0x05:9 D7 I6 n- @1 s" ~) Z- m4 @! |7 E
rtc_initpara.day_of_week = RTC_FRIDAY;7 d l$ [ _4 y A+ e5 {$ N
break;7 j! `5 _- H/ ], ^3 v
case 0x06:: f% B* M# }# f- ~+ z- J5 I
rtc_initpara.day_of_week = RTC_SATURDAY;) `7 H( _7 G% r6 v
break;8 h: @: D5 z; q- |
case 0x07:
2 s z3 h3 g" J rtc_initpara.day_of_week = RTC_SUNDAY;2 s: b' L: K' Z& i3 G9 D/ a% u
break;
& v( W# s; B3 D" Z* D: S default:
; ^8 h! M6 i q& \2 } break;
- n& [/ @8 j; \7 U8 E. m }
( q3 h" F5 y( o if(rtc_buf[10] == 0x00)
; n3 L. V% r1 d: ~ {' J- B3 u* b) h' v E) J ~) j
rtc_initpara.display_format = RTC_12HOUR;
" `+ _+ A4 g" [* r$ v) a }% |. y/ d7 }6 p+ {8 I
else if(rtc_buf[10] == 0x01)- F" V- t5 O r& c
{
) |9 H/ h1 I! O6 l& X rtc_initpara.display_format = RTC_24HOUR;; Q# H Z- N6 l+ t
}
" e( w( H7 q, f if(rtc_buf[11] == 0x00)
# u9 ^! s# a) b9 N {: A8 b& S" n* G' E& v
rtc_initpara.am_pm = RTC_AM;
0 a: m7 N( N' o! O }) {; o( j: U, ~1 u0 N% O6 f3 G
else if(rtc_buf[11] == 0x01)7 b( L" B7 ^: G( C R
{
" E) b: W4 x+ R' d& w( v2 a( C/ D rtc_initpara.am_pm = RTC_PM;
1 a7 z. I* n+ N" t }
7 ?5 m: F) b% Z3 R, `' d$ S5 l /* 输入当前时间 */: W) p3 Y7 A* h# b& ]( S ?3 Q
while(tmp_hh == 0xFF)
9 M& `! ^9 m9 u# d {
4 Q2 {/ T0 X7 r if(rtc_initpara.display_format == RTC_24HOUR)
2 j# W; a6 p- O+ I" A2 U- v% z; s% u {
3 U/ |8 }8 T# I8 R2 y7 L9 d tmp_hh = usart_input_threshold(rtc_buf[12], 23);
. N' y! ?- h7 [$ r0 i% G L }
; F7 q: s- M. q else, {/ k5 C; d7 {* R/ D2 U
{# R+ k: F+ I G$ X+ k
tmp_hh = usart_input_threshold(rtc_buf[12], 12);
0 w; ]+ p" \" S/ I' } }7 t2 z9 O$ P& `/ ]7 f4 a) e
rtc_initpara.hour = tmp_hh;1 N0 s! n# a( E! u- {' m; [
}
: S( \; g/ A, e: e' E5 H8 \' c6 m) Q, _! D7 J: T! n# r- r! X
while(tmp_mm == 0xFF)$ Z, b% t: t: D0 C0 ]/ |7 U
{
& S% R$ ^- X/ ] U5 I0 t7 u3 w tmp_mm = usart_input_threshold(rtc_buf[13], 59);7 b, f! Q5 U5 E; U6 {, G
rtc_initpara.minute = tmp_mm;: G% n9 P% g% K% `9 E( {
}. }' E& ~9 R# c$ p1 q; Y& P% K
while(tmp_ss == 0xFF)2 g' R3 O! j' r _% L. r
{
. B; F8 ~) K6 o tmp_ss = usart_input_threshold(rtc_buf[14], 59);2 c/ z% v4 W J v- J. j" o
rtc_initpara.second = tmp_ss;- G+ @: \7 m, W& K8 h, J
}
+ m, f. X4 L6 I2 |8 y
! U9 E1 q: W! ]. G8 u8 D /* RTC current time configuration */
2 n7 d7 q, V- `. B9 l8 ?. } if(ERROR == rtc_init(&rtc_initpara))
+ r* T( i/ M$ w0 w {; U; L; {8 g& m# T' k
printf("\r\n** RTC time configuration failed! **\r\n");9 f3 q9 M& g4 A$ C, c
}
" c* ]' R* u. _, s' ]6 ~1 w% k else
' k7 E% `) b( ^& ~( K {" T& h! {! f( m
printf("\r\n** RTC time configuration success! **\r\n");
, g$ Y0 p! h: K' e8 ` d0 _ }
* Q$ @* @3 V1 i( m4 m9 ]* ]) A) N6 C t! \
/* setup RTC alarm */
. V& B% P: w& o) V2 s7 l: ^ tmp_hh = 0xFF;
9 Z5 U. \5 X( F' V& z9 c tmp_mm = 0xFF;. C, O( r: p$ S; E* l
tmp_ss = 0xFF;
) h9 {8 p) W- U2 w+ ^
6 g# k6 w/ J( e- X$ \ rtc_alarm_disable(RTC_ALARM0);9 x h& P+ h( ^, _1 {
rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
$ O& ^/ z( f. I7 V rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;, G7 k0 ~/ G+ O1 c& E
alarm_date_data = HEXtoBCD(rtc_buf[15]);
3 F9 z: N% ^# V9 R) n: R rtc_alarm.alarm_day = alarm_date_data;* y+ `! m& o* k+ Y1 i2 u. e
if(rtc_buf[16] == 0x00)
8 p7 x _4 Q/ O' z {
2 z5 |2 W3 f, D: z( C s rtc_alarm.am_pm = RTC_AM;
0 `+ x/ u! J! w- z }
- I! g* n/ |& [" x/ Y/ P else if(rtc_buf[16] == 0x01)) ]+ l4 n1 Y% r6 ?5 m" x' U
{( k! j8 A5 Q. C7 K) h, |
rtc_alarm.am_pm = RTC_PM;
: X& D1 p( Q2 C, O% b; K }+ f. c7 X! G, ]3 g ?
/* RTC alarm input */ _& g% l6 G1 E4 a" x( V
while(tmp_hh == 0xFF)) {1 k: k, ~0 V2 n: E; x5 d
{
4 m+ m5 `- e/ r+ r9 V* g( B if(rtc_initpara.display_format == RTC_24HOUR)
' n9 ?# I. w; B- ?4 x {
, i5 d6 _. i$ E! ?: ] tmp_hh = usart_input_threshold(rtc_buf[17], 23);
' j, }% G. H& w7 n% _ }2 h9 w; t. W1 ]6 Y6 J
else
$ |' j8 `% P+ y# A8 l6 m7 c# P {
( h+ H' e7 g* c1 z" n/ M1 v3 Q tmp_hh = usart_input_threshold(rtc_buf[17], 12);
: w w+ N3 ~2 _+ ]3 m1 K }+ `4 M9 A9 t1 C4 L
rtc_alarm.alarm_hour = tmp_hh;9 N3 Q% ^$ X/ e" \1 J$ e& x# h2 z
}
% C4 w9 Z; a% v8 T2 g7 S8 N; N) y, q6 |# W' @
while(tmp_mm == 0xFF)
) }: L( }! P) T: | {7 w4 e3 `, Z- y$ Z2 h! u
tmp_mm = usart_input_threshold(rtc_buf[18], 59);. q! Z- x" J; _5 \0 `. i
rtc_alarm.alarm_minute = tmp_mm;( H+ r$ b- W+ P- s! Q
}
- T6 @) z* E3 u: m( m$ G4 X { while(tmp_ss == 0xFF)# ]$ T+ z# x* R1 o7 E5 }" r; D X
{
* I; v- }/ v% a" u4 x tmp_ss = usart_input_threshold(rtc_buf[19], 59);4 m1 y$ M# g# I# {! F
rtc_alarm.alarm_second = tmp_ss;
* N4 _/ \ `3 x }
|( D7 a/ R) |% d( P6 k& s# `. c! Z# S8 E: u) ? ~1 s
rtc_flag_clear(RTC_STAT_ALRM0F);
, k C$ Y+ @: b9 `0 a" m& Z* O exti_flag_clear(EXTI_17);
?$ D7 y( l' C. ^7 [" r. Y* O
6 m7 Y0 A7 P) e9 J8 f# y" _ /* RTC alarm configuration */, A; k1 | X+ G
rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
% c( d2 r* _: I6 b" h nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
/ c5 X6 W0 s( R% r; T' o4 s rtc_alarm_enable(RTC_ALARM0);+ d+ {) z/ b/ D G) {5 r
7 V$ d- D3 k% r7 M2 W& C /* RTC alarm interrupt configuration */
" \: ?8 r. h: b8 i! f) N exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
9 Z: w9 ^/ Y0 c5 h rtc_interrupt_enable(RTC_INT_ALARM0);& M1 D" k8 `/ P! x# Z+ B: S
}6 I3 w% Z3 ]* C* C0 e5 S
* F; z+ Y0 P$ B- \0 J( x6 A5 ]uint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
7 j' y. k: U+ q/ p4 ^{
+ z0 t- C3 E4 T0 s0 Z uint32_t index = 0;
& |: T9 R _$ j m uint32_t bcd_data = 0;
( h: Z( }3 }2 T; o" t% h; u' _0 S; v) t$ ?% Q
bcd_data = HEXtoBCD(buffer);# V/ r0 P$ b- U$ S" D
index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
# X/ o, F0 m8 X4 @4 o0 ^ if (index > value)
, x0 h: b; v/ S5 g% J4 _ {8 E& }6 y1 I9 w5 U# K# T
printf("\r\n please input a valid number between 0 and %d \r\n", value);
. t9 s( ^* N/ m6 x/ k8 G return 0xFF;5 t- B( `# J& r o: p6 L
}
* g+ P1 N9 x6 o5 W1 G return bcd_data;
; f2 B ]& v* H1 @ T" A/ g1 p}
3 o" n. F0 y# Y6 V3 H) b0 i
# J; W, G- [2 h* o6 m
% Q% }( j }8 P, Uunsigned int HEXtoBCD(unsigned char hex_data)/ J& X) N$ S7 G7 T$ h
{4 Y+ ` q+ A' S
unsigned int bcd_data = 0;
) ~4 C+ t. D# s unsigned char temp = 0;( a: D0 ?, m4 v( _- M' [+ T! W
, J' j9 A& d5 K6 T. n* l temp = hex_data % 100;1 L- `0 o# ?) P- E# E) j n& n
bcd_data = ((unsigned int)hex_data) / 100 << 8;
" j: p4 B9 R* J1 T5 |. E f bcd_data = bcd_data | ((temp / 10) << 4);9 h( [8 V$ J, D7 N2 K0 r
bcd_data = bcd_data | (temp % 10);
) I7 \2 V' \1 v! B return bcd_data;8 [( b: w5 f) f6 _/ [% k
} v" ]8 O2 F V: g$ r; A. \* U+ \
void RTC_Alarm_IRQHandler(void)
; i( b5 i* c) w) K{% h' G8 G& z, {9 L/ D
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
1 h$ H8 Y0 A9 f' F8 I% I' l# u2 s; g+ e5 D( T) R5 Y$ R
if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
; g9 X8 P1 H, j) i, s9 }3 M {- M$ z \2 q+ y
rtc_flag_clear(RTC_STAT_ALRM0F);
6 p) O- u' y! ` exti_flag_clear(EXTI_17);+ ]. l( C: r) o* ^1 t
rtc_alarm_disable(RTC_ALARM0);- l9 R! R& O7 g9 e+ x7 I. f* A
led_toggle(LED1);
6 o. ^% h$ g2 r- W$ ^5 {& m9 P }
9 x& T9 q6 u% G}" g6 ~0 p( C% k, S1 R
|
|