|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目前配置的只能是当天的闹钟,如何做到每天在设置的那个时间点进闹钟呢?哪位大佬帮忙解答下。GD32跟STM32不太一样,没法参照。
4 O' |4 i, i- [+ m- o3 Q; Y以下是我做的闹钟代码,该如何修改成每天的闹钟。用的是库函数提供的寄存器操作方法。5 y. ^) ~/ C# m* b! Y
void rtc_pre_config(void)
9 F* i( m$ K- O# r& Z; l8 d, j{
9 Y! R2 g# a/ t /* enable access to RTC registers in backup domain */
) M4 g4 U- f+ n8 z rcu_periph_clock_enable(RCU_PMU);* z f) l" B8 D7 E m3 n
pmu_backup_write_enable();& X" \# _& I2 o( h
7 }1 o8 |% P7 ~( Y
#if defined (RTC_CLOCK_SOURCE_IRC32K)
" y; S5 E# J* Q rcu_osci_on(RCU_IRC32K);4 h% F0 F& p7 u9 n$ X H4 r; F
while(ERROR == rcu_osci_stab_wait(RCU_IRC32K));
) k- q% v& K1 w, W! p5 I6 }5 a/ J/ D. X rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);& b% k: k* V F% g5 c8 Q
prescaler_a = 0x63; //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32000/(99+1)=320HZ
' ?' V Y0 s7 `& t9 e prescaler_s = 0x13F; //ck_spre频率 = ck_apre/(prescaler_s+1) = 320/(319+1)=1HZ
- @9 n$ |# W1 r( b. B' T) U" S7 R#elif defined (RTC_CLOCK_SOURCE_LXTAL)
' y6 e! L% E3 o2 X2 P rcu_osci_on(RCU_LXTAL);
1 f; D. w4 @' R! [% i, R y rcu_osci_stab_wait(RCU_LXTAL);
; A/ X; p6 E! l$ M/ O rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);/ u1 M8 `8 i- Q3 [( D
prescaler_s = 0xFF;
+ j+ c; n& c4 D9 O prescaler_a = 0x7F;) Q( ]0 M Q( z1 i* C4 l) p; Q$ ~
#else
9 T; c/ J0 w' l% S$ x #error RTC clock source should be defined& [! M7 V7 e, W, ]
#endif
$ c1 w7 L& z9 a7 ? rcu_periph_clock_enable(RCU_RTC);
1 s, Q7 b9 K+ F$ b rtc_register_sync_wait();
- |; o0 U; S% K/ T4 l o}
: |& D; J& w0 Z6 u6 Z7 \
) X) P! @5 M% I2 X; i1 i9 C# G( q7 B6 I, ~3 x! H( _
void rtc_setup(uint8_t *rtc_buf)
8 j- Q6 L9 O+ V5 b$ m{& U( E3 Y* w" B$ y, f! R& h
/* setup RTC time value *// H8 w! M! x4 G. Z
uint32_t tmp_hh = 0xFF;
' y/ A9 G- O9 P8 L6 Q S uint32_t tmp_mm = 0xFF;" [8 A9 x5 ^" l9 |; x$ }9 e
uint32_t tmp_ss = 0xFF;
# e/ d8 r- U& J R q# H uint8_t year_data = 0;
. g1 z2 u1 }5 w" _/ x uint8_t date_data = 0;8 Z# E/ ?# L: x
uint8_t alARM_date_data = 0;: t$ I' U9 Y1 b$ ]- T
" ]$ D) B+ N% b; E3 E rtc_initpara.factor_asyn = prescaler_a;
# Y$ J- J, {9 Z) |) Y rtc_initpara.factor_syn = prescaler_s;5 i5 U4 k3 Q5 X0 F1 s
year_data = HEXtoBCD(rtc_buf[6]);+ O& Z1 [# \) h
rtc_initpara.year = year_data;
! T% \' K+ P( u" A$ g9 Q" L+ C4 d! u/ Z5 Y# M! k
switch(rtc_buf[7])% B: {6 U9 h3 {3 \* K) b
{
( n. z' D; E7 p# A case 0x01:- ~; V+ {; T) `6 [4 U& ?& Y8 z
rtc_initpara.month = RTC_JAN;! j3 {; E9 ]% w7 Q/ o. ~
break;
: A# p7 \7 c$ w; ]+ \0 {* ~ case 0x02:
# b5 c, d% |4 \9 t I3 _4 q rtc_initpara.month = RTC_FEB;
/ S4 b1 J" E) q' b4 \" _ break;
( m( a. i8 ?. ?! K case 0x03:+ v1 Q3 F6 ~2 P* r# K7 n
rtc_initpara.month = RTC_MAR;1 x9 ~) l" S/ p$ J/ ]
break;
& R8 y6 Q( a; S% A; o, g case 0x04:; i1 Z, q7 l; o- s; H& E) o
rtc_initpara.month = RTC_APR;3 d7 C( Y, ^( ?$ k
break;
, a, N i% p* \- W4 K- L case 0x05:
4 ^& F, k0 @; g; C0 L* }+ U% o rtc_initpara.month = RTC_MAY;7 N3 k3 `; `! f6 \+ }# c4 T
break;( Z* I0 `8 C. y( |5 O
case 0x06:
* H. |. i# y/ W# l rtc_initpara.month = RTC_JUN;$ q2 ]7 }: P! [
break;
: r( b, o; [+ Y4 l3 r$ J: ` case 0x07:
4 `8 \/ r3 ?" H& }2 y rtc_initpara.month = RTC_JUL;; Y: K# Y0 p$ ?3 m* a
break;7 m7 h7 B8 a# X% ?7 S7 t; |* e
case 0x08:% o$ F- ~% J, _1 ^# N# M
rtc_initpara.month = RTC_AUG;4 s7 ?+ i- M9 `; F
break;- t1 @2 y5 x! O% g5 v; ]
case 0x09:" p, x9 K' T# ^+ c: \
rtc_initpara.month = RTC_SEP;
$ J3 e! A; G3 { G! i break;; B- f! j9 M( p# p5 W9 c
case 0x0A:+ p$ `, M, [- d0 x
rtc_initpara.month = RTC_OCT;. w9 Y# O* C( c4 ?: ?6 Q8 s
break;
- B0 ]- L! c, b( w! m case 0x0B:
# i5 P- n7 _) n6 v/ T rtc_initpara.month = RTC_NOV;! b; V1 s9 L" L4 p! A
break;# T7 k5 ^# }* J" N4 L
case 0x0C:$ c+ [8 E; T2 Y4 P: f$ X P6 p
rtc_initpara.month = RTC_DEC;* s) A: t$ i( C( W
break;
8 ?6 U9 s' f: _ default:: d2 h/ m+ K" m" V% ~
break;1 n1 j( ~% o; t0 [ T( g. W
}, a/ e7 X9 y" f t: s
date_data = HEXtoBCD(rtc_buf[8]);) p0 M$ m7 v6 ]; ^+ k
rtc_initpara.date = date_data;* f% | q# `7 Q2 w
switch(rtc_buf[9])
) v+ }8 ]+ H D4 _ {
8 [+ W( B. f g; k5 S case 0x01:3 v3 L2 ~5 ]& _+ ?1 j" ?' I
rtc_initpara.day_of_week = RTC_MONDAY;
# _) g1 ^9 A% M" Z. I. I- K break;
# t3 @( U8 @ G$ x case 0x02:3 M& ]: O8 e' L/ d& w
rtc_initpara.day_of_week = RTC_TUESDAY;
% p2 M% a4 Y5 D break;
" {2 B! Q* Q0 E% }8 i/ V case 0x03:1 i- i0 L" h2 M
rtc_initpara.day_of_week = RTC_WEDSDAY;9 P. P' P% }# k. T" P5 x1 ^
break;5 O4 E3 V/ G4 O6 K" O3 L" s4 D
case 0x04:
2 D0 z7 r0 B4 E1 S. c rtc_initpara.day_of_week = RTC_THURSDAY;, _, w4 u ~: s, T& W9 x5 j
break;; o2 X# a; P0 o5 p
case 0x05:
6 L% p" q2 K" d, \! c- n& D rtc_initpara.day_of_week = RTC_FRIDAY;
% ~7 ^+ K) q @2 G& J C break;; p! H& H% j' {
case 0x06:6 l" ^+ C( B9 o4 o$ a
rtc_initpara.day_of_week = RTC_SATURDAY;
; [4 a% C& w+ ]+ m break;
0 Y$ n% e5 I8 x6 S9 ], d) X case 0x07:+ i8 S; o6 S8 ?) r. o/ q2 F
rtc_initpara.day_of_week = RTC_SUNDAY;
n% }& v9 @& _ Y+ b- U+ V$ [ break;) {5 l: f8 k* B8 [6 e4 _
default:
; i. [( ^% m* L$ t break;9 H' B- d3 F; v! Y2 |
}
0 R+ e* }6 _ j5 m, w- g if(rtc_buf[10] == 0x00)
m. d1 d& g/ b4 } {
8 i" {6 P% M1 p: s# D9 ]1 ^: |; _ rtc_initpara.display_format = RTC_12HOUR;2 ~$ |4 j6 p5 P/ j( f1 Z
}
, `: q" v( B; n0 |. _0 y+ M& m2 n else if(rtc_buf[10] == 0x01)( ?9 s: @& M6 Z o
{3 y+ ~( V o+ C$ {4 E
rtc_initpara.display_format = RTC_24HOUR;
7 K2 u0 ^: J y7 n$ {( W }% x7 \' y+ l2 R* R3 Q; F2 T
if(rtc_buf[11] == 0x00)5 N+ D! m s9 ]1 B/ P
{6 B* C2 k) r. p$ q
rtc_initpara.am_pm = RTC_AM;
( A0 B9 u* G* ~4 _' P }
3 w' G, v$ u1 y else if(rtc_buf[11] == 0x01)3 R* C) ?& @3 A8 j7 x+ p
{# _! C2 u3 q; t) `
rtc_initpara.am_pm = RTC_PM;" _8 E# l0 d1 a6 H: \# B
}
' A7 u+ Z- y$ |$ X s) K& x /* 输入当前时间 */8 K& |# c Z+ M" `
while(tmp_hh == 0xFF)6 e$ C I5 |, k) @( C( X. I
{ L6 i3 E+ Z) t3 g
if(rtc_initpara.display_format == RTC_24HOUR)9 c" T- ^ g" [
{
& D9 z' Z& M4 p. C" y U tmp_hh = usart_input_threshold(rtc_buf[12], 23);9 r! v \! ~& A+ ^: ~! G" l4 P
}$ _' E: l* K; u# J
else9 i& Y$ }% Z! I1 G' S* D I/ M
{$ m' O. b1 ]1 j# |+ K
tmp_hh = usart_input_threshold(rtc_buf[12], 12);
, N& S; Z" r- U+ N, ]. u0 c }
5 @. }( u, d! n& B% y3 _+ i. \9 W& S- V rtc_initpara.hour = tmp_hh;
" E3 d5 ^7 G1 J% a9 A( G$ v( Y }
+ m. B5 W& G' ?9 S: [# Z( P3 F
8 c( L7 r' P4 X; H. w while(tmp_mm == 0xFF): Q7 I S. {8 P2 A* `
{, I! X; |. Q$ j# e. U
tmp_mm = usart_input_threshold(rtc_buf[13], 59);
. v4 u5 F' }* A- A$ b( c rtc_initpara.minute = tmp_mm;1 z5 k% ]. `3 a
}
2 @9 Z, a. F& Y9 J while(tmp_ss == 0xFF)- P& T( A' Y5 z( A3 W3 W5 _
{
1 K; k0 X1 Z/ U* q; k tmp_ss = usart_input_threshold(rtc_buf[14], 59);
$ C2 t1 M1 P0 r- u: u8 [# N. b rtc_initpara.second = tmp_ss;+ y+ b; e2 d+ W+ F
}) v2 J4 A9 j( n- ?% J! ^
% |/ ]( b/ A+ O9 k6 G' W- r; K /* RTC current time configuration */
' `% m; D) k6 G- g: N if(ERROR == rtc_init(&rtc_initpara))
1 V& y: M7 |; `! }, k {: k0 j. y# C% a7 y, I
printf("\r\n** RTC time configuration failed! **\r\n");
3 z3 {, A: R( @; I2 h. \" u: U }& ^! b+ }7 v2 D
else3 r3 i0 K+ C7 P$ E, D. H
{
- p* t2 H. @ l printf("\r\n** RTC time configuration success! **\r\n");
1 Q; J/ m5 c6 K- S7 ]- P' u }9 c& Z8 P. _) h" \; n9 c
( Y6 j4 t( R+ s8 W% c
/* setup RTC alarm */8 H% O2 D2 F, ?- B! u
tmp_hh = 0xFF;9 e$ \2 g; ?) d$ S
tmp_mm = 0xFF;
# h7 x. Q& O7 T5 u tmp_ss = 0xFF;' W' S/ @6 [0 b6 E
' A- _ h& E% X( b8 S* f* n' P rtc_alarm_disable(RTC_ALARM0);) Z! ^3 a4 l9 Y7 O
rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;" r4 ~8 B$ G d* ?+ U9 h% T
rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
4 T% P. n4 X4 N alarm_date_data = HEXtoBCD(rtc_buf[15]);
. Z7 I9 _) m: U. \0 d rtc_alarm.alarm_day = alarm_date_data;- x, U1 G# K. r% |6 \* A8 k
if(rtc_buf[16] == 0x00)
6 r: G4 Y r( U" V) R {
; |8 g6 h& U+ `% w9 J5 F, t rtc_alarm.am_pm = RTC_AM;
/ Z* g. Z- `- m \' P4 a }; }8 D/ w& i8 b6 }' z
else if(rtc_buf[16] == 0x01)* W. ?3 g( F4 i. ~
{
1 w6 Q5 w7 i; x7 a! S1 R rtc_alarm.am_pm = RTC_PM;
% D2 V8 P' J: y6 ~6 j' L }2 W" ^1 Q9 R9 M
/* RTC alarm input */. {; S; v1 w0 G @8 v) A
while(tmp_hh == 0xFF)7 H8 A% C% F+ l
{
Z/ q8 m9 U5 ~1 O3 S$ p' }! |; I if(rtc_initpara.display_format == RTC_24HOUR)
! ?% Z- v4 x2 Z {
0 A% v1 Z. A% _" w tmp_hh = usart_input_threshold(rtc_buf[17], 23);
- U# c& S7 w' E5 n! | }
2 W$ A, P# d h* B else2 }" r- r/ `* i) {. b
{, \# M6 K/ }0 X4 `* P" ?3 {
tmp_hh = usart_input_threshold(rtc_buf[17], 12);
4 @* M" @( Q- m }& P) b$ ^# @6 A3 D) y' u2 w
rtc_alarm.alarm_hour = tmp_hh;, v1 f+ w5 e6 A- y
}
4 m6 K' c: v3 \! s+ k2 F% n$ u
while(tmp_mm == 0xFF)
8 Z: A: r9 h& x$ }/ v! f) H {4 A/ p0 m" L& L) g7 z
tmp_mm = usart_input_threshold(rtc_buf[18], 59);' A. q: u" ^" J# h! [* ^
rtc_alarm.alarm_minute = tmp_mm;
3 ]5 n; P: ~9 ^( D }
2 p+ e) {) K8 |- n; _ while(tmp_ss == 0xFF)
+ d6 j4 h* d; A% w {! Y: [' J% Q8 \) n
tmp_ss = usart_input_threshold(rtc_buf[19], 59);
5 K+ m( X6 X9 L8 L& t9 z rtc_alarm.alarm_second = tmp_ss;
2 E0 R) p- f% J% ^ }# n |& t" Z) N/ K5 A
6 C; K' S" M, P& n9 T) Z
rtc_flag_clear(RTC_STAT_ALRM0F);
2 D' f% k1 y0 P+ C exti_flag_clear(EXTI_17);
' B7 g2 M5 ^2 w3 Q% o5 a# M. ?; H' \) F: v! ^+ a8 O" n. ~
/* RTC alarm configuration */) M! i2 w s; K. |+ I. A
rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
. w4 l* F1 v. F nvic_irq_enable(RTC_Alarm_IRQn, 3, 0);
7 f+ D; H& V. T5 e rtc_alarm_enable(RTC_ALARM0);2 C; L8 Y- v" T8 V, T4 T
: B# x- e9 e( B9 `( i# W /* RTC alarm interrupt configuration */5 M, v% q( n( x8 D2 \' z
exti_init(EXTI_17,EXTI_INTERRUPT, EXTI_TRIG_RISING);0 N8 Z. V$ G# p* A6 P
rtc_interrupt_enable(RTC_INT_ALARM0);) E# u! R! O) M9 Y6 c
}
. x1 I4 Z2 S0 ^% R4 y6 P
! |7 L- w0 ^$ S) ruint8_t usart_input_threshold(uint8_t buffer, uint32_t value): M& g& v! x. o3 ]$ M T3 n1 q9 o
{' J) C, `% `* g( r2 h2 ~( [, J
uint32_t index = 0;& R9 K: Q4 _, ~+ w: B c' `
uint32_t bcd_data = 0;
. p, Q9 I7 o' O- _) Y) {: o4 {5 b5 `$ s' k' T! _ C
bcd_data = HEXtoBCD(buffer);
% ]0 R! B9 N0 X+ x" B' v: p index = (bcd_data & 0x0F) + ((bcd_data >> 4) * 10);
$ \5 v( ?( n$ G, ]7 z if (index > value)
! t$ U2 j a; F( t8 O+ G {
) g8 Q$ k) `9 e1 z! X printf("\r\n please input a valid number between 0 and %d \r\n", value);
5 m% q5 T; E: f# @. S; x9 _, T9 M return 0xFF;
( a# G# g5 x D7 T8 @ }. L% ]. Q5 z4 z+ y8 N( F& j. s3 I
return bcd_data;
8 E& X4 v6 O$ z% q3 p}# ^8 |; ~- h& ~% V
& T0 |" u5 T" W
0 B+ E8 s: y) e! a3 xunsigned int HEXtoBCD(unsigned char hex_data)/ |! [% @& V( v+ ]
{
+ ]0 Z- C9 O0 m6 d$ v1 Y unsigned int bcd_data = 0;% _ `0 w9 Q, P
unsigned char temp = 0;1 v6 C$ c! t% k' ^0 A
& P2 J3 C+ l+ }$ A temp = hex_data % 100;6 k- X4 ~) t" x% Z9 G8 B
bcd_data = ((unsigned int)hex_data) / 100 << 8;
- h3 t' I6 y7 D2 p- W. p+ v& f bcd_data = bcd_data | ((temp / 10) << 4);
% h; n8 V8 x i! @+ n2 S bcd_data = bcd_data | (temp % 10);
7 T; M) Y) N9 ]2 O return bcd_data;8 ]3 u* o9 D% U6 S% ]; e
}
: v3 G: c$ ]' c" k5 O# {" F: Tvoid RTC_Alarm_IRQHandler(void) H2 H& G3 u# u. u6 S8 H
{/ k0 e& h, g* N: b! Z; ?
BaseType_t xHigherPriorityTaskWoken = pdFALSE;; [; s. G8 A: b0 n1 m# S
3 l: [$ X) E6 q" j( E$ d7 P/ ~, |+ q if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
2 U# [9 j6 R+ j- j" N0 b {
/ X5 X% _+ d' {/ h Z rtc_flag_clear(RTC_STAT_ALRM0F);, v4 O/ c9 n5 f8 X
exti_flag_clear(EXTI_17);+ T0 C" X& W6 W( Q6 n7 e) J
rtc_alarm_disable(RTC_ALARM0);
, c& z* [7 V) d6 A+ M led_toggle(LED1);* F! E8 U) L/ n5 f) B
}
$ _0 J& j7 C; w6 f* i}
: R3 ?8 X" G& J* [ |
|