|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。7 s% ?9 s ?+ P `% S
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。8 d9 V2 d# |& E* B
void rtc_pre_config(void) f6 {* O: I# q! P' c3 m7 ?3 e0 M
{9 N; A! ]! t9 V$ V
/* enable access to RTC registers in backup domain */
8 \* p0 \- i0 ?; U4 W: X rcu_periph_clock_enable(RCU_PMU);) U+ L. ?2 i+ c& ~
pmu_backup_write_enable();
* A. o8 O0 @9 j0 d; s
2 p9 a' J: z5 w$ N#if defined (RTC_CLOCK_SOURCE_IRC32K)
2 d- S# N# Z, z1 n8 F rcu_osci_on(RCU_IRC32K);
6 H0 B- D0 x. `: Q while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
3 e3 k8 E/ S$ `' Z" u, @$ J0 I rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
& F# O3 w* I" F- y* n# Y prescaler_a = 0x63; //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
# k. r, y9 K0 s9 w( X3 d prescaler_s = 0x13F; //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ8 o) \+ D) b* H$ }' l6 a5 V" }' x
#elif defined (RTC_CLOCK_SOURCE_LXTAL)
. O' j6 t! \. L( w rcu_osci_on(RCU_LXTAL);' L M3 F4 \: k7 e7 Q) Z
rcu_osci_stab_wait(RCU_LXTAL);
% w( s6 F1 U& {# T' u& ` rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
: y; ~% q* C2 |7 q prescaler_s = 0xFF;" p; t3 h. |( L$ ~& L( e. M' r" r
prescaler_a = 0x7F;
( @4 {+ H' L( U1 J; \ #else6 `; U% p6 ~/ ?% x* _8 X
#error RTC clock source should be defined% s# v1 }- k3 N" S
#endif
. P7 X8 T* V. c" n$ j! W [( u0 @ rcu_periph_clock_enable(RCU_RTC);
6 f* A) [ y$ v% R% y rtc_register_sync_wait();
1 ?: K$ X0 j$ h& S}# ?& X7 X8 D6 K& Z6 ?
# t; `' z- K! o M# u
: }" {4 w) g9 ~0 ~: ?
void rtc_setup(uint8_t *rtc_buf)
8 D9 o2 _' [/ Z# a2 ^) B- X2 @{
2 U8 P: Q: B7 S- ]9 C+ j /* setup RTC time value */3 ?* c1 H- `, g x/ i
uint32_t tmp_hh = 0xFF;; L q+ m0 Q4 K- j$ _ ~( o
uint32_t tmp_mm = 0xFF;
9 ~* B) t7 d' H3 B" l$ u2 J uint32_t tmp_ss = 0xFF;
: P4 {, y& N5 t& F3 W' F9 b# c. { uint8_t year_data = 0;! H+ s, J/ m4 z P' Y
uint8_t date_data = 0;! b5 l ?6 n5 g* {" e
uint8_t alARM_date_data = 0;
- a0 O4 T5 h' b" v% V6 p) s' `9 J( l# ?# _) f
rtc_initpara.factor_asyn = prescaler_a;0 r& c% \* U% y8 V0 i; E
rtc_initpara.factor_syn = prescaler_s;
6 Y$ L- Q% z$ k" J. ^& c. u4 ? year_data = HEXtoBCD(rtc_buf[6]);0 e/ d/ Y7 _0 k/ Q. J. i$ z3 L, F
rtc_initpara.year = year_data;7 h. D Y% C) n3 b6 c) \! `
" z V7 y3 y( I, D; l
switch(rtc_buf[7])
: }5 X- J* [4 m {
Q8 a I3 u; Y( L7 s; t case 0x01: p$ l# N) j, [$ W$ h/ i( O
rtc_initpara.month = RTC_JAN;
$ Z5 o9 G5 A7 |7 M2 Y- _* N break;) o7 r, e4 }/ x5 m
case 0x02:
2 `) n# p( l% d3 } rtc_initpara.month = RTC_FEB;
- W8 l/ E3 }- } @% o7 T1 q break;
4 Z* l1 A0 {2 m* V1 G8 S% P% T case 0x03:
m- ^7 t& S# N, j rtc_initpara.month = RTC_MAR;
c+ I$ j$ C$ c) e break;5 Y0 ?- M7 |0 r
case 0x04: @6 Z% \- d2 X/ G' F: ^
rtc_initpara.month = RTC_APR;
' t/ z; W- s% G3 G j break;( ^; w1 [& P# a$ s
case 0x05:3 w/ B) x, Y. W' c; R
rtc_initpara.month = RTC_MAY;. [0 _8 Y7 A3 a$ E) H
break;
- D; A- u0 K2 l# E: L0 O0 ` w case 0x06:$ Z$ ^* s! ]+ F: i2 U5 u
rtc_initpara.month = RTC_JUN;
% _4 {9 T& t: u+ O0 Y3 Z break;
$ e/ K" X* u7 l7 a5 K/ e. e% k case 0x07:& N7 C$ X) w! I5 [: _! E2 Q# [- L( {
rtc_initpara.month = RTC_JUL;3 @, {1 M: W/ ]) N; w4 z
break;+ c9 L1 z L3 V. H
case 0x08:6 {, M1 ^4 N0 w4 g
rtc_initpara.month = RTC_AUG;4 n6 K/ m: [) h0 B) ~3 \, P6 A {
break;6 u- t( }& @8 Q% ]4 K! |% m. W
case 0x09:
8 J! N5 H8 R7 J' V& m rtc_initpara.month = RTC_SEP;
N3 C( ?* M' c break;5 h5 x$ a/ p$ r' B5 U
case 0x0A:3 p! q( D+ W! e- ?; M
rtc_initpara.month = RTC_OCT;
H& A: B) e+ j. R( q) I0 ^8 M, f break;
+ `. C7 O6 D T8 q7 e0 m& C6 |5 s- e' q0 v case 0x0B:$ e' \' s* S$ T. O4 K+ Z
rtc_initpara.month = RTC_NOV;
( \- J p$ w8 ~0 _8 C break;6 Q$ \# ?+ O0 |' t W8 t9 y
case 0x0C:" @( W# C( H& w7 Z0 `
rtc_initpara.month = RTC_DEC;
S& B+ Q; V4 m/ D break;
6 L) W# J, B @7 d% t default:/ F6 u) [. q& q/ M# o( \* U L; \6 y
break;& G% F4 ^2 b- f4 N/ w2 l
}
) ]1 Q3 Z6 c; H9 X5 D; U date_data = HEXtoBCD(rtc_buf[8]);4 P) i& O3 [/ {& z; o1 v% O% h5 S
rtc_initpara.date = date_data; K3 k4 m8 r8 z4 H7 x) e8 D
switch(rtc_buf[9])% X- Z" J! J8 D2 V8 q+ ^
{' ^' }# ^5 @1 p& N+ [
case 0x01:
3 i$ q/ ]( n1 m3 J rtc_initpara.day_of_week = RTC_MONDAY;
! y3 q- Q" Q; ` S8 x break;
; [# x9 j5 b* P) F" T case 0x02:6 a/ P \' J+ g8 Y
rtc_initpara.day_of_week = RTC_TUESDAY;9 x! W. s8 @. N+ M, N1 ]
break;& }. q- C! X7 w1 d
case 0x03:
( V5 X$ a9 l9 A6 e% ~- D rtc_initpara.day_of_week = RTC_WEDSDAY;4 P$ b- y( J2 R
break; N9 o' Z0 {& x9 `7 c, J
case 0x04:7 q: a6 R. [- x; v: c
rtc_initpara.day_of_week = RTC_THURSDAY;: E8 s* }" N& k7 J6 }
break;
( T6 l$ t0 ~3 s- R case 0x05:
g) V4 u: l( L: R% |6 a rtc_initpara.day_of_week = RTC_FRIDAY;- m! ?& S! J7 Z
break;
: Y3 N( E. v' r) Y7 t: b; j/ j case 0x06:( F) O% R3 A& T7 j2 C# R1 G
rtc_initpara.day_of_week = RTC_SATURDAY;8 S% n5 K% ]) A" _
break;
' l2 Z3 n+ L! }1 ^. x case 0x07:; v+ j4 {( f- N6 X9 _
rtc_initpara.day_of_week = RTC_SUNDAY;
1 l9 ~% `% C1 X! V break;
* S! C1 Z" J" E/ F& F' u default:
6 I: d( b' S' H% @$ ]6 E: L; v break;( {7 P$ _* w2 x0 T1 J0 b
}
+ g, S" E7 X' Q if(rtc_buf[10] == 0x00)4 ~$ E7 k5 T3 U) x9 e! g# j; \
{
) G+ c/ ^ v1 P8 X/ N rtc_initpara.display_format = RTC_12HOUR;
( V2 P9 ?: p- c, ^ }! k# {& p3 A: q5 w
else if(rtc_buf[10] == 0x01)
" o- e+ Q! W9 U% _( T7 b {( U, ^9 Z9 _) w; _- B! L: P+ }
rtc_initpara.display_format = RTC_24HOUR;1 B6 N. R& {$ D3 i
}
+ \: q! Y8 B& `" }. F3 w/ T, y if(rtc_buf[11] == 0x00)
% z6 I8 J+ s& m9 n5 ~3 m' x {
# T/ U& y b# D* l% l rtc_initpara.am_pm = RTC_AM;& ~' Q: G% U, H, N
}
$ i& H# u) F9 H% K, A/ \) R5 ] else if(rtc_buf[11] == 0x01). V* b% e5 N- ?! K: l' ~
{
8 z# Z3 g9 N+ [) q2 M* Q3 K; N) O rtc_initpara.am_pm = RTC_PM;
4 x& ^5 `- O0 u, }+ z" Y }
7 H$ S: I; t& [; P& l) | n /* 输入当前时间 */0 u/ _- V0 j4 {- B4 m, U! \: E
while(tmp_hh == 0xFF)* M( A' \7 Q! i" M$ u# o: F5 {
{
. h8 t. [5 Q4 G! j: b if(rtc_initpara.display_format == RTC_24HOUR)
9 j4 `+ q9 T2 a! K2 D! E- R- U {1 t0 Z7 t8 e& {3 [( q$ f
tmp_hh = usart_input_threshold(rtc_buf[12], 23);
2 D1 |" n/ A) } }2 X: w2 o5 m% W' i, O, E$ d
else
/ L3 S D! X( r1 X( L" g$ U8 X {0 P( {: D: I( a; e& X# i/ P/ D! s
tmp_hh = usart_input_threshold(rtc_buf[12], 12);
* v @4 T* X$ c1 j! c }
9 Q$ o% X& ` l% Y0 |7 B rtc_initpara.hour = tmp_hh;
. u" v8 a/ o. K3 y* W% y }
; o+ t% A$ P: H0 Y( M: [8 M7 t& [' ?4 u- n( M6 h0 C
while(tmp_mm == 0xFF)
+ A u7 i7 v0 M5 w: b5 X2 t4 ~7 Q {8 z+ [7 o' i% s: \
tmp_mm = usart_input_threshold(rtc_buf[13], 59);) }4 B* ?* `- { N
rtc_initpara.minute = tmp_mm;# Y! l; ?& j* E9 `- B
}8 I! D; J1 n, v( j( Q6 O0 o9 E
while(tmp_ss == 0xFF)
* Q3 w) Z- M/ I0 B' L4 [ {
. U. ? T# W5 F* z. _. D+ T tmp_ss = usart_input_threshold(rtc_buf[14], 59);
1 n& p9 B* q9 ` rtc_initpara.second = tmp_ss;
# j$ s V7 L# U }& ]6 M8 j+ M9 Q4 O& q1 x
+ v) y8 u4 K! M2 {8 o F7 ` /* RTC current time configuration */
8 s0 ~5 B2 n. P5 F if(ERROR == rtc_init(&rtc_initpara))2 h; O4 f' Q, F7 y' l
{
, |# U* L0 f: r/ @2 \ printf("\r\n** RTC time configuration failed! **\r\n");. |( j$ D% |$ M- u% K6 k5 V c
}" T: d! T; u- O( k+ R2 _
else. q9 L' \; A( g2 Y1 ^6 y. ~
{
' X8 ^6 L8 L. G/ B+ R8 r H& | printf("\r\n** RTC time configuration success! **\r\n");; x' @/ v( C4 q5 ^8 v" {$ v4 g' b
}. | a1 Q; M- t4 Z. I- H8 Q( e
; S6 g( P9 i$ {# S& P/ ]/ ]6 D: m
/* setup RTC alarm */3 r# @/ A0 p: A% N
tmp_hh = 0xFF;
/ b( u& A4 S3 ^* S$ F( U. q& V% u tmp_mm = 0xFF;
2 Q; J7 X9 r& ~9 z8 T tmp_ss = 0xFF;
# N( ^5 s$ Z6 O* ~/ [; I% d) F' \6 ^ T! G. }
rtc_alarm_disable(RTC_ALARM0);" R& N$ A9 G+ M
rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;& f4 ?* `8 \4 a( v! W
rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;& c; ~) u) ?8 F
alarm_date_data = HEXtoBCD(rtc_buf[15]);9 {; m& w' F* ?4 M# o) R2 M; R* r
rtc_alarm.alarm_day = alarm_date_data;
/ Q4 O4 p" h$ }3 e& }/ B9 _1 J if(rtc_buf[16] == 0x00)
; E* e7 Y4 h7 z4 N& \0 M* |5 K {
" S h8 }9 m) y- g6 _ rtc_alarm.am_pm = RTC_AM;
2 v0 [ y3 U9 Z, [% U) B ~ }
9 `2 X8 z+ x+ K& E/ p/ a' j# j else if(rtc_buf[16] == 0x01) ^2 i3 B+ i0 S: ^9 `" w
{- [' I# _, A1 P4 u/ |6 c
rtc_alarm.am_pm = RTC_PM;7 Z B% a" g; T3 m% T
}
$ `1 t: X% B+ _* ~% ^5 C" t /* RTC alarm input */% W* t9 Z( V( h0 b
while(tmp_hh == 0xFF)7 h, w% ]1 o2 i2 X
{
0 E: g% X G2 j! B8 [ if(rtc_initpara.display_format == RTC_24HOUR)
5 p/ c8 Z" s# c0 T( W4 f {
+ Y5 o2 v7 l2 l. X7 u% L/ @1 W tmp_hh = usart_input_threshold(rtc_buf[17], 23);
: e$ D7 G* u- H0 N; s) T }
+ ~4 S8 Y9 h& P- ~* E else
/ x4 g5 E9 [9 \! ` {2 k) t P& s8 i% _
tmp_hh = usart_input_threshold(rtc_buf[17], 12);% Z$ \" ~) Z/ a: A& `
}" ~1 Q9 {9 n3 s& u
rtc_alarm.alarm_hour = tmp_hh;2 }8 T* ?- p6 z- O
}
+ Y; w% q# u5 o4 |0 Y1 n5 L$ `" J; F$ x( o
while(tmp_mm == 0xFF)' W( |: G* ]: \
{
; b' K X8 B( s6 M& p/ F tmp_mm = usart_input_threshold(rtc_buf[18], 59);3 C" o( w' L# l/ v5 a
rtc_alarm.alarm_minute = tmp_mm;
. J: p8 T) D! O }5 l4 j# Z3 j2 i* H4 B) W
while(tmp_ss == 0xFF)4 D) u& \" I/ W6 X6 h4 ~( t
{
! s3 }7 ^+ R# c/ Q8 W4 {7 k tmp_ss = usart_input_threshold(rtc_buf[19], 59);
* ^6 g8 l8 S6 M$ p E+ } rtc_alarm.alarm_second = tmp_ss; J/ z5 R; K! H; ?9 A/ O+ A' `6 A
}9 b, [2 O, z9 a1 ~
! v4 U9 h, I+ Z7 z1 v- Q. X% u3 J rtc_flag_clear(RTC_STAT_ALRM0F);# m! [( p O' L
exti_flag_clear(EXTI_17); L G/ q! j8 M7 _
; M1 w z" ^' e6 a6 _. y. c, P /* RTC alarm configuration */
0 d2 e& T; A0 ?% s7 T" f+ E rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
8 U* X- q$ B/ [( Y) _8 w. |* W nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);( _* p8 S; M3 M6 Z
rtc_alarm_enable(RTC_ALARM0);, p- `5 B0 F9 S( ^( [* z" N; y
9 N( N( X( l' b" [0 Q* p /* RTC alarm interrupt configuration */' I* j$ D/ M4 L- Q) z( G5 \8 Q
exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);4 f: t, o9 @& G: w( c h: J& w
rtc_interrupt_enable(RTC_INT_ALARM0);
8 l/ B* b& R& h+ n6 H} T. _, s; Z+ n! c4 H$ u) d6 A' d% T/ i
* C& w9 F6 @: C5 q/ L2 i P5 suint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
l. S. ~0 a( J; G, s3 J5 o{- {; U+ f+ i1 P: l, R8 M
uint32_t index = 0;, T" L4 d8 G: F
uint32_t bcd_data = 0;8 H+ K1 V1 v8 f: l
4 o8 m* r% u& d* j" ? bcd_data = HEXtoBCD(buffer);
, w, P: ]: o; h3 u7 j9 T index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);4 ~+ ~/ j1 _: A7 S7 p5 f
if (index > value)) A! D- O& F; q4 q1 ?. ?! X
{
' D I0 O# A; X0 G printf("\r\n please input a valid number between 0 and %d \r\n", value);
; L; K% H! {2 v5 u5 E return 0xFF;
+ a& B. O4 c) h7 J7 t; x( i }
2 e. w9 o# u. L. A return bcd_data;
; B: G4 E" _, K. C# r}
' y* D# D3 A& }, F
E- `! H$ ^" k( t. q# s" _4 P
9 d7 S/ C! a7 o- ]$ |2 y: L- aunsigned int HEXtoBCD(unsigned char hex_data)& }0 X' m: }2 a
{5 N. a. D$ j4 z# x( E
unsigned int bcd_data = 0;) g1 S- M# w6 _
unsigned char temp = 0;! w- |% F* H1 z$ X* M1 w
1 e- D1 s0 l4 f9 F$ T. X
temp = hex_data % 100;+ g2 ~4 H r# x4 y4 M O' B, z! y
bcd_data = ((unsigned int)hex_data) / 100 << 8;
" E( D! p+ W' o/ b bcd_data = bcd_data | ((temp / 10) << 4);
* O5 {* K V1 o bcd_data = bcd_data | (temp % 10);
5 J8 `+ w5 H8 q- O return bcd_data;' p' j+ u+ ~) l8 v! _
}/ v4 K- R% G% X: e5 S
void RTC_Alarm_IRQHandler(void)! [2 J6 ?$ L" j& P
{1 G# o) `) j1 r" o
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
/ }' H1 a: H: j5 ` t4 h. T4 z, c
if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
' A3 ]& O# v; W! s {) p+ }# M, b, R1 [* S6 x0 j5 p
rtc_flag_clear(RTC_STAT_ALRM0F);) E0 ?$ f' H5 U& ]8 ]6 {
exti_flag_clear(EXTI_17);
# k3 {8 u9 j; R# | rtc_alarm_disable(RTC_ALARM0);% F2 \* r' U$ `2 H+ |
led_toggle(LED1);
" W" B. @) F4 Q! l4 [% C1 V }1 G2 ?# u0 l: N1 Q' k0 s
}& s: G7 [7 O6 G: R
|
|