|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。. U) o+ `) d7 z( B
以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。
$ S* ]/ Q, F9 X/ x) Q! V: Bvoid rtc_pre_config(void)
; U/ C# i) D4 c$ K( j+ p! m{
( V2 q' _/ j% f /* enable access to RTC registers in backup domain */9 k; K* @# h R2 W4 b c
rcu_periph_clock_enable(RCU_PMU);7 J: r. a/ @: r% o! i
pmu_backup_write_enable();
/ S; ~ m. s [1 t5 X( K* h7 e
#if defined (RTC_CLOCK_SOURCE_IRC32K): ]4 X7 Y) f9 i6 K1 q; l0 g
rcu_osci_on(RCU_IRC32K);
- f' l& B2 `) z3 y9 {% b+ P9 h while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));% c9 g- K0 n& R: ~- O/ T
rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
6 M4 y; i! e3 D. P" g/ H& z prescaler_a = 0x63; //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
, e; ]1 ]2 A; i( E+ l( w prescaler_s = 0x13F; //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ: Y# S% N- [3 e0 |' D
#elif defined (RTC_CLOCK_SOURCE_LXTAL)0 l& b5 ` A) F! _
rcu_osci_on(RCU_LXTAL);
2 C/ s% M: [2 r$ Y* A5 E rcu_osci_stab_wait(RCU_LXTAL);! R! j$ @: n/ s3 \
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);0 _2 m& X$ N$ g S1 l: s
prescaler_s = 0xFF;- P X9 y) E" A, f4 E! N
prescaler_a = 0x7F; e" x% I9 J3 i% x
#else/ U- L# |6 S, g4 F
#error RTC clock source should be defined/ _0 W! g% @1 O
#endif9 L: [6 N# N4 [) m) N2 c
rcu_periph_clock_enable(RCU_RTC);
: D V' O. A0 ]1 ^, ?6 z! ? rtc_register_sync_wait();
J; ^- Z% M# r# p7 E/ `}) Q0 W& h! ?. X! B
6 |( c) A; U3 j ^/ Y% Q. t- O% {6 C5 |5 n1 h# L
void rtc_setup(uint8_t *rtc_buf)& z3 f9 [2 y/ [( L: f
{
4 `! x. J) k; p" B /* setup RTC time value */
. t6 m) u& V F( Z, Y. \0 P6 O uint32_t tmp_hh = 0xFF;6 F+ p& a. x: g f; `2 r+ ]
uint32_t tmp_mm = 0xFF;6 {+ j, y) E3 w. {; m/ a* E6 Y Z
uint32_t tmp_ss = 0xFF;
: [% w& _; e3 E S7 F: z1 w) b uint8_t year_data = 0;
# _8 d$ F; r4 H1 p( x1 z uint8_t date_data = 0;* x6 L, G2 `: S) v9 g6 f* G/ O
uint8_t alARM_date_data = 0;! \3 b, n; f4 I) w5 N8 X# F* F0 |
2 l- I( \) C; ?* l
rtc_initpara.factor_asyn = prescaler_a;) h7 h9 v* Y& l& E! n, `2 {
rtc_initpara.factor_syn = prescaler_s;% b% S0 m& q# s! T7 W
year_data = HEXtoBCD(rtc_buf[6]);- |4 n& I# g$ \1 R
rtc_initpara.year = year_data;4 t) S7 ~3 s3 e% `0 e
4 ?) C8 J8 B, q% o4 q: X' `
switch(rtc_buf[7])1 P+ Y" N" h' c- {) ]' T
{4 m; L9 ~, W3 L* l, p: I6 r4 `# E1 U
case 0x01:
# A1 j/ w6 O' L rtc_initpara.month = RTC_JAN;9 i0 X; [5 ?9 i. O* m/ ?0 V5 a+ ~
break;
: e$ h4 u1 R# N" o; f$ S0 L J case 0x02:
, |( W. V: l! ~+ @9 U rtc_initpara.month = RTC_FEB;+ K1 m. j& z! M! a7 u3 E/ i& K
break;
( R9 w- ^0 G' B6 I$ n* `% o) y case 0x03:* ]( |' r6 P$ }* ?
rtc_initpara.month = RTC_MAR;
/ M* A8 ~6 P! M/ j5 d# ? V# E break;0 n3 x, C: K, q; j8 ]
case 0x04:4 a$ U$ L! l- ], [0 c
rtc_initpara.month = RTC_APR;8 u l5 b" T. X( G
break;
7 }$ w. y& L1 u# ]& s5 E! n3 y case 0x05:% t4 k1 Z8 u/ P( K2 ~' _1 R
rtc_initpara.month = RTC_MAY;! X; N5 X- C, D5 v
break;6 o+ Y1 i7 u( ^1 `" G& S& p
case 0x06:4 i8 x8 g" a6 F- U$ j* |
rtc_initpara.month = RTC_JUN;& Z* D; [) W! Z A$ X# \$ l3 V( X
break;- p; r8 [* A5 E; n, {3 q
case 0x07:
# j) F8 a8 f' Q) O# I; d/ @ B rtc_initpara.month = RTC_JUL;
- U1 q, Z/ ~# S, b7 ^, M7 ~ break;6 ^. @5 w4 H! X: s* b
case 0x08:
8 h6 n. ?4 [6 R& `8 M; X% W rtc_initpara.month = RTC_AUG;8 w' O& h4 x: Z. p) o! Y7 v
break;( L- Z( R1 j3 m) ]' B! j# a, A
case 0x09:: f0 t. q6 m/ q7 t
rtc_initpara.month = RTC_SEP;
6 K- N+ Q; |# W& b! `# @* ~ break;
1 y f" A$ E5 w" j case 0x0A:
. o8 Q. W7 f) ?1 D5 X rtc_initpara.month = RTC_OCT;
+ m% \0 i; _4 G) f( f8 ?1 l break;: G9 _( W; [8 p# z* D5 J- c
case 0x0B:
& \, g. q3 Z! `2 z7 ? rtc_initpara.month = RTC_NOV;
6 O- y) f- o! ~! r, d break;, b% ]: _( E8 R
case 0x0C:, O. d5 B+ q6 Q% b& m/ C y
rtc_initpara.month = RTC_DEC;
; J ^; ^/ `% d8 S1 p+ Y break;5 u9 s( i! \4 a" p
default:
# O; V2 a' N9 A; p, ~* v break;) H5 G4 F2 s" z$ G; T
}
* ?2 ^7 S! Y2 Y# Q- c. F% Q0 n date_data = HEXtoBCD(rtc_buf[8]);3 v- H) E' k3 g. e: [. s: ?" N
rtc_initpara.date = date_data;
' I! ]( S5 D0 `# v switch(rtc_buf[9])
7 T4 x6 n) i' x( u8 I9 f+ H {
" M5 J( w, Q5 e: x# r6 @! G case 0x01:6 [2 b* p' Y7 e
rtc_initpara.day_of_week = RTC_MONDAY;' B, o7 r p3 D @7 G
break;
5 L1 R0 ^6 P% V s& E case 0x02:: `3 m& M& T3 ], [/ a' ?/ W) d
rtc_initpara.day_of_week = RTC_TUESDAY;9 a/ N+ } D: Q) `- h, w* N* u
break;6 o7 I4 Z/ Q& X) D5 G' \3 [
case 0x03:
% ~9 n" Y; v! t# v9 q4 \# o/ b rtc_initpara.day_of_week = RTC_WEDSDAY;5 F# p0 g' v3 s5 f6 ^9 a
break;
5 e4 b, d! r. W( n1 d v& N: X case 0x04:6 R1 V3 B+ z3 ]! V
rtc_initpara.day_of_week = RTC_THURSDAY;9 H4 i* m7 \- N' l: \7 l% v! h
break;5 b! k) ` E3 N8 i- m1 x% W7 n+ e
case 0x05:
" a! a5 W, h: y! B% w rtc_initpara.day_of_week = RTC_FRIDAY;
( c, |( x Q+ A1 a2 g break;
7 r+ i4 g7 j3 R' N8 t* x) ? case 0x06:4 K" a, m: ^$ q1 ^, ]$ a) x
rtc_initpara.day_of_week = RTC_SATURDAY;
5 q r2 C7 H5 L6 I2 m: o break;4 ]2 _- p" l+ n- p+ U6 S
case 0x07:
& G: u# ~7 o7 V2 P8 Y* L rtc_initpara.day_of_week = RTC_SUNDAY;! }* X7 P; l' d5 e5 c& Y: @& p
break;" V4 ~; l+ R) _$ D
default:
/ w( r- g3 ?& N4 t0 y0 I, P5 A$ ^ break;) o* R7 G. U" R Q6 m9 d4 Z
}
9 i. ], @, C1 P3 j( q if(rtc_buf[10] == 0x00)) P+ s0 ~2 h/ T- r7 O0 _
{( K& h3 K# \$ r! i: w) U! P
rtc_initpara.display_format = RTC_12HOUR;
6 D: y; D8 y `4 y% Y6 c5 a; N }5 r- p$ W% }0 a' j3 A$ b7 i
else if(rtc_buf[10] == 0x01) e* T/ h8 L( j2 O2 Y: d. h: n# s
{
: x `/ l% A9 x S% _ rtc_initpara.display_format = RTC_24HOUR;
+ o- I* i! D- c+ j e2 {8 }! f }
, X# V+ {. \# h) O. ?9 g4 v if(rtc_buf[11] == 0x00)
% Y& H: x% @7 ]0 L; G" z {' z/ e8 y8 X" F& j9 c, @
rtc_initpara.am_pm = RTC_AM;- z' Y! v( p: q- f8 N$ `+ C8 d: a6 k
}
O/ e) G1 e; r( m1 b( t3 g else if(rtc_buf[11] == 0x01)( y9 k3 ?1 f# k! g2 E' ]7 K
{/ ?7 m+ Z" z7 Z' ~
rtc_initpara.am_pm = RTC_PM;, h+ j. [; e4 y: u
}) v# j+ b3 ^" S/ J! \
/* 输入当前时间 */
" i+ O5 I; P: I5 I while(tmp_hh == 0xFF)2 j8 J" [$ o. l) P7 S7 W3 r; y
{1 q$ o4 i7 U8 d( _2 A0 r; S
if(rtc_initpara.display_format == RTC_24HOUR)* I$ D% z- ~; |$ j% E- s4 g2 y
{
2 o w9 ~. M" {) i" v8 x tmp_hh = usart_input_threshold(rtc_buf[12], 23);0 I8 E" v. q" q. j
}0 a4 S; Z8 I5 ?0 N! Y7 b
else( S) G9 Q* k* u4 D2 q' j
{4 f: u7 Z$ u3 e4 ~
tmp_hh = usart_input_threshold(rtc_buf[12], 12);3 W+ Y7 g0 R- e0 j0 v7 z' h
}
2 @0 e j9 p! V! I# g rtc_initpara.hour = tmp_hh;
- H* v( O' t/ r" a. t/ u- H }
2 i2 u" ~$ Q+ a/ Z" I# p x G, @
while(tmp_mm == 0xFF)" v" _2 }( g! k5 t7 A8 Q9 ^
{
o8 V4 x7 z7 ^0 W tmp_mm = usart_input_threshold(rtc_buf[13], 59);
( M* d! |. \0 d- v; k rtc_initpara.minute = tmp_mm;
: b) w& W a3 e }9 [4 }) z! k ]% X$ o+ Q1 [
while(tmp_ss == 0xFF)
+ u J1 \! x$ q3 j/ W1 W {
$ t5 |. E0 ?( V7 k tmp_ss = usart_input_threshold(rtc_buf[14], 59); X$ u1 z- L5 l8 X2 R. Q% X) ~$ C
rtc_initpara.second = tmp_ss;
4 M9 o1 L! p( E% M) ~$ Y }
" n# j, s" l8 ]
& i/ v" L( K6 @( \ c* g: E1 M /* RTC current time configuration */- l. t& [) G2 `" R' w
if(ERROR == rtc_init(&rtc_initpara))
( e+ @, p* _+ k {1 h: R( L, T2 |1 L8 e7 C, b3 S1 y
printf("\r\n** RTC time configuration failed! **\r\n");. ~7 _4 x G0 {3 g6 d) R. c' T
}0 K) I% f1 k8 } ^
else z$ t1 j, D6 N
{4 M+ j( f! }6 x5 v6 L) }
printf("\r\n** RTC time configuration success! **\r\n");- W" Y3 s" g6 z7 @
}
% Z# a+ e' y) ^- z8 f
8 p; u0 H/ z& n0 q /* setup RTC alarm */! v% b/ u; P* v6 @2 ^* u4 a, e+ `
tmp_hh = 0xFF;1 V1 ?* c; l. g3 ]7 P0 Z% c
tmp_mm = 0xFF;/ I/ `& A, |' ~, ]0 ?* r* A( m% X
tmp_ss = 0xFF;3 y% U8 W5 y4 b" {5 [2 Z& g
2 S8 Q* f9 v% W3 g; U5 N! H; c
rtc_alarm_disable(RTC_ALARM0);
1 Y8 B8 y+ T$ Z* ]: w1 N rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;8 U( \1 x6 e4 g
rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
+ \9 x" v- h. R/ U alarm_date_data = HEXtoBCD(rtc_buf[15]);, i. ^0 a: C1 _, l' | F$ u' M
rtc_alarm.alarm_day = alarm_date_data;
2 j( M c& x, Y if(rtc_buf[16] == 0x00)
% G( ]; o+ [7 X/ B/ A# r {1 \ }9 ]0 a* f, X! k2 a, C& u( g
rtc_alarm.am_pm = RTC_AM;3 t) }% m" y% r7 e
}
8 `" R4 N! ~( N. E else if(rtc_buf[16] == 0x01)
0 F0 {7 f4 T# U3 b, ?! R {
3 Y* g. N8 Y b7 p2 q* \. c rtc_alarm.am_pm = RTC_PM;
. ` R' z |: r/ E) {& v4 u }+ m& F( `5 [$ R' Y) D
/* RTC alarm input */6 s# j }, X& u! K( P. j4 l
while(tmp_hh == 0xFF): D. \0 Z- E' i& j' b
{, k% c; H; K0 }' e+ B, `' N
if(rtc_initpara.display_format == RTC_24HOUR)1 A* O/ F* m' Q( T$ `" x; t
{- a1 [3 K, V9 M" ~$ S* L' h5 V& G
tmp_hh = usart_input_threshold(rtc_buf[17], 23);
, C! s9 t0 ? r- h }( A% j8 F8 e+ v- c+ l6 @' X
else x: N8 m5 v9 a
{2 g, x" T4 B; d- i( B; L
tmp_hh = usart_input_threshold(rtc_buf[17], 12);
. f$ C4 J$ e6 I# W( _9 V }
' Y# M8 ^! H- ]0 f rtc_alarm.alarm_hour = tmp_hh;5 w, j( r. ]; j' x6 L. a
}: f! D2 [5 w( Q. @: A. d
h; b5 [1 I9 Z6 N$ d8 N
while(tmp_mm == 0xFF); U6 Q! E2 |. k. C! z7 b* ^
{
0 x9 X8 \5 U. D8 _6 d tmp_mm = usart_input_threshold(rtc_buf[18], 59);
, t) q/ H. m3 L rtc_alarm.alarm_minute = tmp_mm;
: |8 y7 i5 K& Z6 z' E# u }9 t2 M/ D, B4 F1 i. H4 @/ d
while(tmp_ss == 0xFF)
; ^( k# p; b7 R+ D {2 j% N) B- Q- K, Z% i" }4 d
tmp_ss = usart_input_threshold(rtc_buf[19], 59);
/ [4 f2 i* x5 [- {6 H0 L3 q rtc_alarm.alarm_second = tmp_ss;
1 N, N$ j: M0 r/ T) Z2 {1 l+ p }
' F- u6 x" |6 `: u" C, A+ {0 y* }* z6 A j; e" F
rtc_flag_clear(RTC_STAT_ALRM0F);
3 _, }( o6 \) }3 Z+ ?% _- g' G2 \ exti_flag_clear(EXTI_17); I" J* B9 R: ~, J) |- e$ [
, |$ S# y" |# B- P) e /* RTC alarm configuration */$ I% G0 M. z4 d
rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
7 m5 d) P: k0 V# N6 j nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
1 M( w2 Q/ j3 U, e, c rtc_alarm_enable(RTC_ALARM0);' P$ q6 F: y9 i' M$ h5 L6 M$ V% t
; H% z4 b" \0 a$ C: M* D. Q* r /* RTC alarm interrupt configuration */9 ^3 D$ c8 v/ K2 w* `% E; b# z
exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);
9 ^- `+ g+ D5 {# g rtc_interrupt_enable(RTC_INT_ALARM0);0 j. [" ?+ m( G& J7 C
}
, J) f# X5 {8 y3 c
: T5 R% R; A: m& @+ e3 \2 @4 E9 Yuint8_t usart_input_threshold(uint8_t buffer, uint32_t value)
; |' K; p5 ^) F$ l: N% `" p" P{
. q5 N" i8 A& L3 T/ P& ~0 T& } uint32_t index = 0;
' ^$ H2 I1 `7 B5 F3 C& d e uint32_t bcd_data = 0;
2 O2 F5 ?4 o: L8 V" D* L8 x+ V
! y q+ F; B5 Q4 @$ c4 D/ n7 R bcd_data = HEXtoBCD(buffer);/ p; x6 f8 W& S! B
index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
# _+ e1 }/ }0 F8 A9 m$ v; o if (index > value)- F0 Y) o: J3 m" x0 d* }. J: w
{
% G0 r$ I* n' m" N- j4 T printf("\r\n please input a valid number between 0 and %d \r\n", value);
6 o& m, Z" [6 x# G% Q0 z' J8 Q return 0xFF;
$ q0 n, b' X2 n }
1 K$ C: U. ~8 H0 _3 }+ L5 W1 s return bcd_data;
V# D/ R. I) W' l' V8 V5 O& K}0 S$ C3 H# R- x# r! ~
% S E: j3 M+ c( W3 _) k- X8 v5 k
$ a$ `' S7 p |$ D& e/ |unsigned int HEXtoBCD(unsigned char hex_data)+ Z9 t+ B8 o' L/ w1 |8 G' S
{* u* |7 t9 u5 ^7 ], }+ B8 R) d
unsigned int bcd_data = 0;
d5 X1 w# ]7 H0 e' O unsigned char temp = 0;
) J( g' Y# V1 J. K, Y
! P g8 f" m; U. E$ V' Q temp = hex_data % 100;: L* x. `* A' ~' J' Q
bcd_data = ((unsigned int)hex_data) / 100 << 8;, p. q( R( g/ v; j
bcd_data = bcd_data | ((temp / 10) << 4);
- h6 b" t" h+ |( B bcd_data = bcd_data | (temp % 10);$ H! c: B8 ]! y7 I. @' W8 {3 q( Z
return bcd_data;
- X+ `1 B6 K1 z' \: r4 r' w# e) ?}0 ^" m3 P5 P' Q7 o3 Z$ _5 h! z# y* z
void RTC_Alarm_IRQHandler(void)
& o6 N" z$ |+ ~" F{5 H6 I8 @! [( `; T8 }! I5 S) X
BaseType_t xHigherPriorityTaskWoken = pdFALSE;- f# s" @1 p1 I. G& `' y. ?
P. Q$ \5 f4 c: `6 s0 J/ ]* t if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
4 X7 x ^2 S, U# F) k3 f {
& s" N; W6 O5 ]" j) q6 x# ~# Q rtc_flag_clear(RTC_STAT_ALRM0F);2 ?$ f' G$ N1 v( T+ ~- @
exti_flag_clear(EXTI_17);
$ Y$ f. ]/ h& v+ c1 ^ rtc_alarm_disable(RTC_ALARM0);0 O' F/ j: F" e+ C$ {" ], f
led_toggle(LED1);
! x1 u& }+ b2 \) v1 S }
% Z2 i- @* B. x3 G. u# D2 E/ R7 \}, R; D/ O" R5 s G% O
|
|