EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 Q$ r/ x, v: w# Y% H& K
/************************************************************/ " Q; Y7 f$ h9 R) S% h
/******* 样例使用说明 *************/
0 L( O0 Z/ v9 ^, b9 J# ?. y* G/******* 版本历史 ************/ / {5 R5 } F$ j
/******* 日期 版本 负责人 IAR MDK ***********/ 4 a9 D H" c$ g
/***** 017-07-14 0.1 CJ 7.70 5.14 **********/
8 H( C0 K" `, F/******* QQ:3386208645 ************/
. ]5 b' Z3 d' Y4 Q+ | 8 {$ Z' v* ~2 h2 O# l6 |
/******* 功能描述 ***********/
5 [! n+ Q4 S" M( E/* 本样例主要涉及时钟模块计数寄存器的写入和读取**********/
* ^& W- v7 G, m2 H& V( [# I/*说明: *************/
3 r+ F; t3 j5 d% S/*计数初值写入计数寄存器 *************/ ! C& h; o- Z; M
/*启动计数 *************/
5 o$ X8 \8 j+ c l, q( w2 j/*读取计数寄存器数值 *************/
1 ^% @, q9 R6 |, F/ _( K/******* 测试环境 *************/
2 }5 ]$ L+ N, r. }5 s4 W/* 测试用板: *************/
) s8 }1 _4 f9 x6 W8 D' X/* SK-L110-TSSOP20 V10 *************/
^# L \4 m/ |1 L- o0 w7 H/*******辅助工具: ************/ - O9 A8 b) M7 S5 q& x: v+ C8 ~- I2 B
/* JLINK调试工具 *************/ # A9 K) A3 f' p+ |: ~3 m; Y( M
/************************************************************/
- l* m! K) Y# j; M! a. I#define IS_VALID_CLK(x) (RtcClk32768 == (x)||\ . E: A5 h! B5 p8 C- G( c
RtcClk32768_1== (x)||\
* k) p1 k* ]' _% i( ?3 h2 l RtcClk32== (x)||\ 9 N \& f, H8 i$ }
RtcClk32_1== (x)||\
8 r( V; v% u: j8 c" ^* u RtcClkHxt128 ==(x)||\
* v) R6 R4 F4 s& h x RtcClkHxt256 == (x)||\ , m, o0 r: K; q6 N, R- h
RtcClkHxt512 == (x)||\ 4 R2 @9 j7 `3 X0 e
RtcClkHxt1024 == (x)) 4 E& F2 m/ v5 b# K6 \0 U
* b" r3 k6 P' v- G! k#define IS_VALID_CYCSEL(x) (RtcPrads == (x)||\ 5 P& z" z- A5 j' X8 f5 y b8 U4 P
RtcPradx==(x))
( d; H4 E- A! D1 `
V& b- n& x' ~. ]#define IS_VALID_PRDS(x) (Rtc_None == (x)||\
' r3 `5 H* M$ Q Rtc_05S == (x)||\ / P0 m; i8 B5 ^! r, _, D9 d8 T6 A
Rtc_1S == (x)||\
, e. s2 P6 {9 z( i Rtc_1Min == (x)||\ k6 n; y& t" l( Z
Rtc_1H == (x)||\
- J/ r: M1 a- o9 I$ f3 z Rtc_1Day ==(x)||\ & |% Q' ~- N) I% C* }! |
Rtc_1Mon ==(x)||\ Q5 ~# _) ^* T$ u6 J
Rtc_1Mon_1 ==(x))
/ ?) c; Q" S$ u& G- _ " D* S0 M& z1 c3 [8 T4 O
#define IS_VALID_IRQ_SEL(x) (RtcPrdf== (x) ||\ * }8 F6 k) D9 Z% Q. ?4 B8 d4 v& Z
RtcAlmf== (x))
@4 B$ X l: J y, w$ R* I 7 l; b$ |# N$ f0 L8 F
#define IS_VALID_FUNC(x) ((RtcCount<=(x))&&\
5 |4 _# S" r* q, K5 A (Rtc1HzOutEn>=(x))) 1 F, ]) c: B- G" f: u$ N0 l9 G
#define CkDateTime 0x7F
4 s3 c, T/ l; J# Y, b2 \) @#define CkDate 0x78
- g5 {5 d3 ]; X* y+ c#define CkTime 0x07
+ Y/ p9 j6 }# n/ z& w# Y7 P2 R#define RTC_TIMEOUT 1000//test 1s
( y/ e$ |9 |) i' E#define T1_PORT (3) & w2 B1 a. \- a* W3 ^
#define T1_PIN (3) $ h: G: O% b5 N1 E
uint8_t cyccnt=0; , ^) `: V1 ^# S4 L( \
uint8_t u8Alarmcnt=0;
5 U d" w8 ~ wuint8_t flg=0;
1 T- Z7 _" h% e* K! kstc_rtc_time_t stcReadTime;
i N. G' u) m9 F/ \3 z' }
5 r0 |& K: }7 I* {) f/********************************************************************************** \brief RTC计数时钟选择 . T% U- S1 D4 u0 H; G0 V
** ** \param [in] enClk时钟源 / ^, z2 w& Z2 P* q+ S( A
** ** \retval Ok * r$ G# B& ]3 M* V: T! E5 g5 k+ P
******************************************************************************/
. v7 z7 ^" R/ R8 J! z& _6 Zen_result_t Rtc_SelClk(en_rtc_clk_t enClk) - o' t7 ]3 W2 |8 G
{ 7 @/ y$ k# }3 P: f2 f! J* c
en_result_t enRet = Error; 2 I4 U4 B6 L- B
ASSERT(IS_VALID_CLK(enClk));
+ z. u4 |$ v+ S& a m M0P_RTC->CR1_f.CKSEL = enClk;
1 \/ w3 F2 y% o/ B8 e enRet = Ok; $ }* t( ?6 S& T l; q+ W
return enRet;
h/ S" _* V5 P- r} $ P% G" I, x3 @6 `7 [. |
/** 4 P2 u; J( y8 T
******************************************************************************
3 _0 y4 `, X# j- u) i8 H **\brief RTC周期中断方式选择 . Q/ f. T: r* u5 h
** ( F4 \- h5 N$ n/ `/ R1 z9 E& L
**\param [in] pstccCyc周期中断方式及周期间隔选择
, K: M% f. D, m **
6 O: W' ~; X. q: A, [, P' [% ` **\retval Ok 2 E( q: g# m% [1 \1 I5 w; k
**
& o0 `! \* \1 c' W, O ******************************************************************************/ 9 V3 a1 \7 }8 b" i8 e8 y! ~+ |
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc) 4 [0 L+ I4 p) p. S/ \% U
{
0 o4 a. j2 A# N; j/ [& z. F en_result_t enRet = Error; - ?( A) ^# ^: k) Q
ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));
* b/ m' B) |0 p- x- {- z ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));
& h9 f( m7 U0 e* g: p2 w M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;
- c$ ^) R4 s4 j: V if(pstcCyc->enCyc_sel) / C. n T* l6 @' R
{ / a! f8 E( V8 E6 W) m n9 Q
M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;
/ r, y' [) v& t/ Y) K9 E0 f7 d } ! G/ J6 |3 N1 C( y
else - q2 y( H# M4 N% J
{ / B& W5 _* s: Y
M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;
8 q) F$ F; R- p- n7 f \; Z } 7 |$ v, M1 _$ |
enRet = Ok;
7 j# E5 `, N% f4 M, B2 d returnenRet; 6 D1 M. e! m7 ^# ]1 u
}
$ q+ L" [. I, P" p v/**
1 ~; u! X5 ]( S9 P/ k ****************************************************************************** 1 z" M6 j. B$ T. { U! j9 L/ `
**\brief RTC时制选择 8 l3 T$ J: M4 W+ q
**
|: a, q( X# L8 h **\param [in] bmode是12时制or24时制 9 b7 E8 T6 I q. R. I
** 0 d. V) N9 {* r2 N4 T7 s
**\retval Ok 设置正常 ) r/ C# S" A9 y' S5 p9 \+ a F' U6 |
**\retval ErrorInvalidParameter 设置异常 ' x' d3 t5 M' K* C. i7 E
******************************************************************************/
3 Z4 M8 S4 P8 {( t0 ~9 _en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)
v( y* A4 }! n{
' |; s. N/ o* O3 o! U! Q6 I en_result_t enRet = Error; 3 u; p% a) F% G y
switch(enMode)
$ r6 T9 M l% U4 D/ x2 g- }6 ] { 8 r" {0 M. V) b
case 0:
, D8 j+ f8 M0 K& B3 x8 I case 1:
# g- {1 \# b9 V9 |1 g* m M0P_RTC->CR0_f.AMPM = enMode; % W6 v" g& B( n- @
break; $ j* S7 G* a" ]) q- v* r y
default:
" x. I: p, [9 \0 f; k2 h( N return ErrorInvalidParameter;
. Z. L0 H; H+ ?( S# @ } e* z3 Q! n# |) p
enRet = Ok; 4 d- `' O0 E# @+ ?
return enRet; $ s& `! p8 T0 C' a V T
}
: R5 h9 X. C6 F9 b. B- P/**
0 L5 H7 N# _$ x+ Z5 @8 g/ t ****************************************************************************** ; }3 p1 z# Y/ y1 B: G1 h: G y
**\brief RTC闹钟中断设置
/ D! s" y V d6 Z+ ] ** : }# k: d3 Y& }3 a& T8 p8 S
**\param [in] pstcAlarmTime闹钟时间时、分、周
9 w, P4 ~, R1 f: X: t% Y ** ' [6 J: I# F& J( p0 ^6 Z
**\retval Ok 设置正常 2 I8 ]- r& b! q7 S, B. u5 M
** 9 ^ z1 I" d- [1 j& X6 T
******************************************************************************/
+ g! C; C! s3 H# oen_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime) $ l" W8 {1 u) s1 {
{ . c% p8 q% m1 I7 o2 r
en_result_t enRet = Ok;
0 \ S0 V# ~+ F6 j! i ASSERT(NULL != pstcAlarmTime); 5 I6 r/ t' Q# _* x/ D
if(Rtc12h == M0P_RTC->CR0_f.AMPM) : t# _4 Y+ q) d" h6 q9 F" f
{ 3 z% }7 w8 Q0 U( Q
enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);
2 i* H$ R0 y) v8 ?" E }
" z5 u) r( e& q) o+ _( U* F5 C$ _0 ~$ M else
$ f- K% p. w _+ \ {
( ]3 c, E, Z$ V4 |+ d( `& r enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24); J: W9 F* e1 h; _
} P) z# o" Z; _9 _, _% l' `* u
if(enRet != Ok)
) h% y- p) k4 w+ w5 B- h0 H return enRet;
( @- n- I6 U3 G% h; V enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);
) `! D) ?$ P7 J% n0 } if(enRet != Ok) . k! m# X" R$ l2 f0 d6 f7 T
return enRet; + y+ F- U& L6 A# z7 s7 u
//enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);
. i; K" V) l; K/ Q i! a1 `+ X if(enRet != Ok)
1 s3 P3 b' c' v return enRet;
6 N \8 ^3 w3 U- k1 I6 x M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour; $ U* r" f `6 ]. a4 P
M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;
5 R5 M! |6 Y, `! R. \7 { M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week; / |. D3 b' d) q9 N, }9 e( e
enRet = Ok;
0 v( b7 L' v6 U$ J8 p, d% t return enRet;
, z4 Z+ h8 a* r. i3 k ?' |7 F i} - V, n& Z1 T4 f7 _- _" e8 ~. p$ d$ k
/** 7 c( T4 _, R, P# \+ X6 J
******************************************************************************
7 w8 X9 m) }7 @6 x# X **\brief RTC闹钟中断时间获取
- b. w0 f- }' U **
: H+ g8 z9 | l& n: K) O" j **\param [in] pstcAlarmTime闹钟时间时、分、周
, Z: F' e P8 Z) B; ]0 } **
: z9 h7 O0 e) Z8 O q2 n **\retval Ok 设置正常
N% N8 |4 _3 a6 O **
; S$ N9 k5 {1 D2 t/ z ******************************************************************************/
. F2 S. s; x( r- T7 J1 j7 p5 oen_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
* o' L5 N K5 S( ?# x- @, v% M8 [{
) ~: s4 x! r9 M9 z0 w+ G en_result_t enRet = Error;
" \. s; e; ~ V! v" E4 O6 E5 U# X, Z ASSERT(NULL != pstcAlarmTime);
/ h. {. s( W+ i6 O* C' W pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN; , U7 h0 V/ Q7 i
pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR; & F; G; W/ _8 y0 L4 p) \+ \( A
pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK; ) g& M! n2 [; G: O
enRet = Ok; , i2 c; p7 I3 O! {
return enRet; ; O# `+ \, O7 Y6 g4 o9 p: f, A
}
% A* Z' b# H7 f" D% d" v$ n/**
3 s8 e$ \: k) V! s! P8 R$ ], s ****************************************************************************** 8 B* h" [$ m8 v) M4 G {
**\brief RTC 1hz模式选择
3 x) {5 Q3 `9 | **
$ Q0 b% V; q: o3 n **\param [in] bmode 高精度和普通精度
. c& h0 D0 M8 s1 N0 I: h **
9 U5 v2 m. K1 {5 m! B8 Q **\retval Ok 设置正常
( I- T R- I7 ^3 v ** * W* n5 z' Q: S7 L
******************************************************************************/ ( |; Q: J6 Q; ~/ o+ ~0 l/ L) K
en_result_t Rtc_Set1HzMode(boolean_t bMode)
: z9 D- T8 I% ]( M0 ?{ 0 v P$ Y) e) l3 l `, G" G
en_result_t enRet = Error;
) L9 @1 f0 [: h0 u! o) B/ Q0 X/ s M0P_RTC->CR0_f.HZ1SEL = bMode;
& X% U5 ~0 b: v# L6 k% N7 B8 L2 a enRet = Ok; & i4 @- E: _' j
return enRet;
% g7 C8 T: E0 y- z/ C, c} / J9 ?- }, ?1 Z5 Z
/**
( ^% X3 m+ z. D0 t ******************************************************************************
* m! v0 A3 r) Q- q4 U5 @4 g, c. g **\brief RTC 1hz补偿值设置
; a4 C7 P; w1 u1 |* \/ F ** ) ?, O! F6 ^, ?* u5 O0 d5 U
**\param [in] u16Cr 补偿值
9 B7 M, H' B0 G! Q( l ** 4 z, W4 d7 ]! v5 G
**\retval Ok 设置正常
" k6 q8 i+ o6 k7 y3 j' V+ n7 g ** 3 w# }- w/ V6 Y7 H" e% T7 ^
******************************************************************************/
5 m; s7 O3 | C; f4 j/ R5 uen_result_t Rtc_SetCompCr(uint16_t u16Cr)
& I! g- u+ ~0 K3 W( y3 {# u- q{ ! y; @& i+ K, f3 x
en_result_t enRet = Error; ; a" @$ E* x( a/ l: M# [
M0P_RTC->COMPEN_f.CR = u16Cr;
+ I: r5 S2 [0 a- c% S enRet = Ok; ' |6 { X& _0 A/ t4 o% D# X7 J1 H
return enRet; 6 y3 V w( d. B3 v2 A Y- W8 ?4 b
} 3 _9 X/ b) i8 Z3 `" x: L, z
/** # I" n8 P! K8 d$ {- n5 F( ~
****************************************************************************** 7 Z9 t) h" X. a' i0 L5 _# i% f
**\brief RTC 功能使能设置 6 P c' s; S# Q8 t) h
**
5 b7 W/ X& O4 I* Y/ Z' S **\param [in] enFunc 功能选择
6 z5 O5 r; l5 |$ h* T' g ** 8 p* ~* i. g7 x1 \, L5 c3 i
**\retval Ok 设置正常 6 E; w: s& H2 F( F" `/ ^& u1 q& C G
**\retval ErrorInvalidParameter 设置异常 " Y+ f2 Z5 i# H" K
******************************************************************************/ - j& o% _6 \. I
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)
$ N, J0 c" D4 ~: C. w" `7 e{ . @+ g |1 x* g
ASSERT(IS_VALID_FUNC(enFunc)); 4 l7 _* |* U+ }7 U5 _( o
switch(enFunc) 8 a+ j1 l7 W" j! _4 ]9 n
{ & r# }: e& l: D! H) }
case RtcCount:
/ e0 u8 `8 T0 s) [, Q' s+ ^ M0P_RTC->CR0_f.START = 1u; S/ }( q) }# w' T8 n
break;
6 _( M8 K: P* F case RtcAlarmEn: 8 r: f$ M8 P5 L; b6 ^) E* z
M0P_RTC->CR1_f.ALMEN = 1u; g2 {5 d E$ w# {. ?: j i
break; 9 P! N# K) i, O7 \# I! ]
case Rtc_ComenEn: , d2 | c$ k0 o
M0P_RTC->COMPEN_f.EN = 1u; 8 o. \# W$ g9 a$ p+ x
break;
0 i9 c; {" P2 E! P- f" r case Rtc1HzOutEn: 0 O0 T) {( [: P8 b
M0P_RTC->CR0_f.HZ1OE = 1u; ( K5 `: \, C& R: J+ {3 }4 b; M0 H
break;
& z# w; i- @' k' x3 {; p default: ! _7 @9 k# W. O& p( e1 @
return ErrorInvalidParameter; & _: ]- i6 M* p/ p7 w
}
' k+ @& i" |, B; `6 e- F4 Y return Ok;
# O. o2 l5 @9 ^, P7 D8 I}
( M" t5 Z% B, `" X1 Z, A, \2 H/**
" P! o2 Y1 d7 k; v, V ******************************************************************************
; o# z% |0 Z/ B6 R: g3 c **\brief RTC 功能禁止设置 $ X. h4 I1 t* S1 `8 M$ w* X: Z6 O
**
9 G6 Y' j3 A$ ]; e3 C1 B **\param [in] enFunc 功能选择 $ |2 `! L) g1 u" [
** 9 E7 o \# G, X$ q' v, U# t
**\retval Ok 设置正常
3 m% Q& Y& @ D1 m **\retval ErrorInvalidParameter 设置异常
( }; i; d! c) C) _6 W ******************************************************************************/
# \1 `, S m# ^& U# k4 R$ w! ien_result_t Rtc_DisableFunc(en_rtc_func_tenFunc) ! \" w- i1 w) B0 P+ c5 P
{ ; Y; s+ ~- R, `3 s7 u
ASSERT(IS_VALID_FUNC(enFunc));
5 N5 _( w( f4 j. y! ] L4 R switch(enFunc)
+ J e. y9 g# \7 \ { 8 ]) A9 u9 o2 h5 |: u
case RtcCount: 3 m* L. A. M0 K" s
M0P_RTC->CR0_f.START = 0u; - w2 I) q& X6 ~( j
break;
g0 s6 d+ ]6 p& a. Q case RtcAlarmEn: - r9 j7 H1 D6 v
M0P_RTC->CR1_f.ALMEN = 0u;
! m: |- P" k2 h break;
6 q7 y6 q' e4 c) n9 c case Rtc_ComenEn:
3 D5 e+ R9 b/ J" k2 Y, F M0P_RTC->COMPEN_f.EN = 0u;
3 r2 |0 I( P" c0 V break; 4 w3 X( ?) e# T; B) ~
case Rtc1HzOutEn:
" L) W: i; T( Y M0P_RTC->CR0_f.HZ1OE = 0u; ( \2 v: D2 T) a) H' ^9 O" d/ m& N
break; ; k, d2 ^/ @: G% K5 h
default:
" l' a! I* s0 a& `, T$ N r+ B return ErrorInvalidParameter; - \+ F- m4 f6 b
} 0 C& F" o& P' Z: |
return Ok;
9 B/ b" F$ H7 T} ( C6 @ N( L, `% Z5 Q3 x
uint8_t Change_DateTimeFormat(uint8_t u8sr) , C2 ^5 r; S z2 `9 {& @
{
- w* q8 @$ h7 p8 J) P. E: O/ K _ uint8_tu8de=0;
! x2 L$ Z) b* @, h0 r; A while(u8sr>=0x10)
4 K* K+ y3 B. A {
2 [0 u0 w$ @8 d8 j) D1 c u8de+=10;
7 F% e4 m+ @1 a% @1 q9 J u8sr-=0x10; ( L6 t0 ?, u* B9 {% ^# ^, x
} 6 i2 h4 A" J6 T
u8de+= u8sr;
, q/ M/ _2 V0 t3 d return(u8de);
, D. h0 O1 {- H" g} $ W- X0 @' V: r" T/ p0 _
/**
# s0 W4 X5 j/ U# {- _' @7 L3 z ****************************************************************************** : \7 u1 S! n" i) K7 J
**\brief RTC 平、闰年检测
2 M3 L* I0 I7 P V/ |7 d! V1 ^8 x ** 9 ^" ^4 E6 L6 N9 u( F6 n
**\param [in] u8year 年十进制低两位
; a" P7 C3 N( J# ? **
" V [" B A7 ]1 L' `+ u# } **\retval 1 闰年 ! l! Y7 L% v2 r3 H
**\retval 0 平年 ! F& x" n e: Q; @8 b8 P
******************************************************************************/
6 D% T' [1 d$ Q3 y* I8 z9 F. juint8_t Rtc_CheckLeapYear(uint8_t u8year) 1 ^& {: P c5 N
{ ; @: E w( O7 r4 P, q
uint8_t u8year_shl,u8year_shr;
) S- z4 B+ E6 ~; a9 g7 I/ s7 ` u8year_shl = u8year>>2; - a! u3 B0 g2 d. d! r- R) R6 C
u8year_shr = u8year_shl<<2;
% O2 q% z# P$ ?0 [9 w2 { if(u8year== u8year_shr)
; b, [2 `. `, T { 4 p2 V, J4 l4 D
return 1; ) k* A6 v6 t/ R$ b* B' R/ X
} 2 x' w- \2 n. R
else
6 Z; ^3 f* b: I5 K: s7 ^# T {
# `: ^. Z' n9 u) @, A' f7 e! C return 0;
6 g2 m9 b4 C/ z/ r } 2 b' r3 r2 v$ s0 J+ K* v% ?6 P
} ) S; Q9 w0 n6 r( s
/** 3 Y. A/ V6 H! R- j1 V0 s1 @
******************************************************************************
; m# f, _) u2 ^7 H. G- O **\brief RTC根据日期计算周数
4 K8 @% _7 M( s' j. A7 h% S **
3 }4 F, A! D- [7 @# ] **\param [in] pu8Date日期 / @$ Y |) W* L
** , o4 i/ ^) g% [. E$ {
**\retval week 周数
/ Q1 u0 S U4 R& ^ **
7 M5 p' Z) J% y4 P, P% x ******************************************************************************/ . f; O2 {6 y8 w1 f) J5 L# |6 [! X2 Y* W
uint8_t Rtc_CalWeek(uint8_t* pu8Date) + p% b- E& b" x: L' d5 O9 s, i
{
4 U! t/ G# G' X uint8_t u8week; " T4 C) \4 C3 {: j, x
if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1)) " M+ I6 q8 y5 D4 p! E
{ # C2 t. k7 C7 V' `) n4 a) w
u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7; - a- Q* B2 u1 y" S$ F5 m# {
}
& D/ z, O" U+ K/ x8 a! W9 {) L; m# { else
6 A2 m: [6 \3 ]. d) k1 g$ {1 m { M. C/ {/ d- ]* ~* S& v$ s
u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
2 m; v& j4 n% M' i } * f! _# n& I: I
return u8week; : E _ f& R3 X% j0 K k1 J
}
# n A& R* n, x* y8 s/** ' w2 E+ k) a" i" U) s4 a) M
****************************************************************************** 6 U4 ]5 K0 z9 ~5 w6 o* |$ N
**\brief RTC根据年月获取天数 1 }4 N1 n7 g8 U9 N
**
7 y7 w8 l9 @" i6 U7 q; F! x **\param [in] u8month月份,u8year年份
, |3 x7 S4 m3 l9 g" @6 J **
& q9 O7 l7 I' i6 x. @ **\retval u8day天数
: ]3 `: x1 O' ] ** C" K _ Q. |. @' G' n
******************************************************************************/
8 p! S ], b3 n9 L& q1 ?5 T1 R& _: k2 A' Buint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)
7 ?! m6 n+ A: f{ 5 ^" x' i ~- Q6 ]8 q W
uint8_tu8day = 0;
, y6 c2 u2 z1 |; _
9 A6 X; ?( P- t9 l$ `7 }6 t) d u8day= Cnst_Month_Tbl[u8month - 1]; 0 m( U/ ~% M4 R# X* J
if((u8month== 2) && ((u8year % 4) == 0)) 0 j" E9 y+ a8 p$ o
{ ) v0 s: a3 a# g& S% Z& V& u+ M
u8day++;
' T, r! P3 e% B } + W) b) F; b; v3 p. L+ ]3 a. Y
return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31 ) J% F8 H2 m, Z9 c7 ^$ o% ]4 V
} 6 }% ]* c: ]/ ]( c6 g. D& v U
/** * T+ |7 y5 j3 K5 @
****************************************************************************** 9 D$ F3 }( T4 P: }$ K7 _& D
**\brief RTC根据日期计算周数
* q. z5 a# q3 C0 b- O( ~ **
* C8 f% N- _6 L9 |* c **\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值 ! E! H4 G9 T' ?" r
**
) Q2 l& X r9 I& H" k+ q- M **\retval Error 错误,Ok校验正确
( S, k/ q/ v3 W. P, [, e **
. k' v$ o/ r6 i& ^" v ******************************************************************************/
! m) Z i Q1 x: A u E/ z" v, h# Ten_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)
' s; U& x# i3 h0 V# Q: i* C{ & z7 F! {0 t" u+ c: h g' g! W8 F
2 d; y9 E$ X/ R+ Y' B; C3 d& D5 f if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90) % h. m( Z& n5 b0 W: C
||(u8data > u8limit_max) || (u8data < u8limit_min)) ) N P7 ~2 t/ B* k* h; ^3 D7 i1 R) d5 J
{ ' x6 V Q4 N# V7 Z+ t. b! K
return Error;
4 O3 D* y' _' Z" m8 \ }
2 u; f1 ^2 U6 P9 J return Ok;
i, R- b" e2 y4 k% r} 1 O; N ~1 k0 F9 C; i8 a1 p9 e! J
/**
& t& W+ W1 W) U" E( J- j ******************************************************************************
4 l3 p, W3 F0 q3 m( U% w7 z **\brief RTC时间格式检测 8 `" E0 _4 d. x6 z8 C! O8 X
** % C; O# ~! s& A% q$ c4 P) Z
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式 9 a, h* U" A8 o& F+ N* c
** % E8 J( m1 l* \
**\retval enRet校验结果 + G3 q e1 {1 s( R2 o3 @' d! v
**
- T$ X( H' t9 K, ~! T, r2 h+ U ******************************************************************************/ A& K4 I* x Q1 ?
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode) ! ^% z1 L" P# O( \
{
) y) D' P- \- ] uint8_t u8i=0;
1 ~7 ?3 }& W E9 j, u. u* w uint8_t u8mon_max_day = 0x28;
/ |3 q/ V' \5 u+ g9 l uint8_t u8date[3]; 9 U2 j( W- M4 S6 p
en_result_t enRet;
3 @' w: g) h7 y8 Y while(u8i<7) 8 e/ g4 D& C; y1 U
{ : b, s) Z9 H% L; L0 d
if(u8Mode&&(1<<u8i))
, ~/ _: h3 ^- I$ \6 A+ a! I/ d- I {
8 i, o5 Y5 j4 s$ a J: U switch(u8i) ( T) n& f9 k, p2 E$ S0 R
{ ^: L7 Z' ^1 |, s
case 0:
% U( A0 m' R0 M& n) D# a enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//秒 " n# E0 D( Y! A: w
break; 4 T! _7 g5 L5 |- Q+ a6 a; ~" {) [
case 1: ; |2 T, V* _# \: g+ {+ T9 m
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//分 2 N; X; V* l1 @+ Z
break; ) [3 U4 J4 R% x+ k& J
case 2: , H3 p$ H) I4 Z
if(Rtc12h == M0P_RTC->CR0_f.AMPM) 9 w5 e* R( Y% n- M( @* F% z D
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//时 . a9 ~- ~( v1 p& l$ h/ @
else % K* B/ K2 P; m1 i4 C
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24); " v: N3 [2 A8 Z* ~. D' V9 [; {
break; . M. [8 b& R7 w# ~
case 3:
4 t7 @1 I! j. R* ?3 l enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06); 7 |/ Z4 t+ T( j( m% E& H1 T' P* V
break;
. |+ \8 B! N; A _+ U! L3 m8 j% i case 4:
! G9 |0 I/ c. z( Q enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);
/ I; S( `0 A& h8 U8 }/ t u8date[0] = *pu8TimeDate; ( j5 c0 h3 U j, T4 S- V$ s8 x J
break;
8 K0 U" Z# p# n7 v/ [ case 5:
- F: B: P0 I2 Z! A enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);
, B0 j5 ?: t' D9 a: h u8date[1] = *pu8TimeDate;
5 p4 b# h! m; R4 T n break;
; K7 t0 d/ P, ~: c1 ^ case 6: 3 |# h" m% s# o! y& j+ z* J7 D3 u _; _
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99); 7 l# W& C }: G+ B
u8date[2] = *pu8TimeDate;
( [6 Y* z4 E+ t; y. c break; ' C2 h6 d: x! @" ^ f; T
} ( B2 t( H& d9 ^: C9 L
pu8TimeDate++;
/ p9 h5 o7 d' _/ E% b } + w" B/ t% S% H, `& m& [2 {
if(enRet!=Ok)
) U8 w, o, a0 d t& X& @ return enRet;
% ?/ x# J- J( z6 O {. D2 w u8i++; : {+ R& [# }$ o$ t
} 3 K" h9 Q+ F# ~
if((u8Mode&0x10)&&(u8Mode&0x20)) 4 p4 ^- G% ^! l: Z) r) V
{ " O0 w2 h' t, H2 `8 {2 X6 }: C4 v
if(u8Mode&0x40)
* ^# X! ~7 p7 ? u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));
/ Y$ R( m$ ~8 N else 6 k& A% V" m4 P: R/ v+ {
u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);
3 P! {# ?9 c1 B6 X' ?% J$ k4 r9 @ if(u8date[0]>u8mon_max_day) ) X. l1 ?4 ?! v. \' u
returnError;
4 v! Q4 q/ z2 J! j% y0 T } ( x. j1 L+ G, M& C6 R# J
if((u8Mode&0x10)&&(!(u8Mode&0x20))) . u2 [* d* K- M \0 L5 d3 U5 R
{
4 k1 K! W- ^- N/ L2 ^& w1 g if(u8date[0]>0x28)
$ C* F# a0 ~. a returnError; ) r& D0 V7 H$ ]' v* K
} * {) O5 n1 S. C& M
enRet = Ok; 9 f! b6 W6 Y& A/ W8 u( G2 m
return(enRet); % f: B4 Q" o9 g2 {) B: G
}
& A3 d# C1 o, K3 |! @5 I/**
0 Z8 [1 I: j" v8 ?7 b4 D ****************************************************************************** W% E- l6 a6 F9 l$ N; C
**\brief RTC设置时间函数 # w1 o# X5 |4 ~# t2 S* f& M! W
**
1 N* g l6 ]; Z" k8 W **\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期 & a1 y, f$ Y3 b- F6 x! a
**
# y1 u5 r6 a4 X: {& t X/ L **\retval Ok 设置正常 4 A+ O W6 R3 b/ M: `
**\retval ErrorTimeout 时间溢出错误 - H* k, C5 f9 S) v
******************************************************************************/
5 g0 I/ U2 J- l; ten_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,
! W, c. r! J7 \; a( s boolean_t bUpdateDate) 9 s' g8 e5 S6 b! [% D
{ # t1 |1 e7 j$ V% y6 |1 d4 g: m
int32_t u32TimeOut; + f0 ` @! i0 @, D8 Q+ y+ s; n& R
u32TimeOut = RTC_TIMEOUT;
2 m u# _9 J6 c1 o, h1 @ uint8_t* pu8TimeDate;
/ N+ @: Z6 h! U, R en_result_t enRet = Ok; - G: ], x* I* C( Z9 R: _; L9 y
pu8TimeDate = &pstcTimeDate->u8Second;
, [6 Z& w+ T; r+ e" `4 H/ J ASSERT(NULL != pstcTimeDate);
$ K" }5 C: i6 G$ s: j$ y: n# q if(1 == M0P_RTC->CR0_f.START) 5 E/ y7 {5 Y3 q8 z c
{ 4 p: P! v/ z1 h. c& G1 S+ V/ i9 s
M0P_RTC->CR1_f.WAIT = 1; # \4 W4 H3 U0 K! _
while(--u32TimeOut)
0 Z, l4 D% r: f- j# N: _ {
4 G6 r6 o+ B$ \2 Y* k7 `5 U q3 v/ o" c if(M0P_RTC->CR1_f.WAITF)
0 m- U/ F6 D, |, z% p {
3 g, C4 h$ M4 K) O3 P) S& A break;
) l. {; t' o9 o$ x0 _ }
+ S* p1 Q5 L* \" p# B }
1 `8 x* O" A3 N8 F if(u32TimeOut==0)
" {, K o$ ~1 Z5 s! N* f. L9 N# R { / G; Z7 V. `$ h4 O0 L, h5 Y- x
return ErrorTimeout;
8 m, s( b8 l4 b- N }
! {2 R% B# z; ^ V% c5 }6 w8 r8 L6 k }
& F; p3 a k: I6 c: ?' } if(TRUE == bUpdateTime) . S6 k: D4 O% S& \& |/ r) Y
{ , n+ i. Q8 @1 d3 d
enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);
" t4 U# F6 p0 ?; Y- g9 p9 f6 Y( s, q- W, q if(enRet != Ok)
2 k9 J4 O) C" o1 d; A return enRet; ' S% n! ]4 G2 {
M0P_RTC->SEC = pstcTimeDate->u8Second;
Z' ~3 v. P7 S M0P_RTC->MIN = pstcTimeDate->u8Minute; 2 I% o0 `. ^1 N. f. o
M0P_RTC->HOUR = pstcTimeDate->u8Hour;
9 T, J6 D4 h' @" H6 A3 D } 2 n+ u0 V$ r Y/ [; R4 L3 y
if(TRUE == bUpdateDate)
- Y% X2 ^- J5 J* v* a {
7 N: Q2 [ x* I9 T6 z; S enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);
' o6 P: |) c+ M9 P if(enRet != Ok) ! S0 K( E& r r
return enRet; 9 d1 ~( S- Q i4 |: K, l
M0P_RTC->DAY = pstcTimeDate->u8Day;
- {; h9 n+ _- w# g" t2 g M0P_RTC->MON = pstcTimeDate->u8Month; 9 l. I( }) q$ x. D- j* J( @, a+ ]' y
M0P_RTC->YEAR = pstcTimeDate->u8Year;
/ r. ^, O( M; p M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek; 3 C" @" e- N! Y* I: N3 `' R& X5 e) ?% T$ X
} - N. r3 i' B, A
M0P_RTC->CR1_f.WAIT = 0; , s* e/ p, S: O; O7 i% [+ B
if(1 == M0P_RTC->CR0_f.START) H6 w @; s# u2 i
while(M0P_RTC->CR1_f.WAITF);
6 D3 k; R4 A, ]- G return enRet; % { q% U% O6 _# b( p
} . U. Q1 x. R" N) O
/**
6 u( ?. U$ ]; x) \0 [4 ~6 { ******************************************************************************
1 f0 T- f; W( J3 d: K4 w* j4 m **\brief RTC获取时间函数
T. Z) e9 y8 [7 D5 t **
& S$ e3 }% v$ @: b- ? **\param [in] pstcTimeDate日期时间数据 0 C2 j9 s) j1 K$ ]& M* E, {5 L' t" p% y0 ^
**
/ T2 k5 \/ e# d1 G" w9 R **\retval Ok 获取正常 . Z! B% Y& N9 c
**\retval ErrorTimeout 时间溢出错误
c( Y h) z9 y+ \1 t' N ******************************************************************************/
, ]! W. ]% S/ B# w1 Gen_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)
/ Q6 M& |/ B2 u2 P{ - r% }8 a( ~; a+ m2 k
uint32_t u32TimeOut; . a& A1 E* Q- |: `: p) ]+ I
uint8_t u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;
/ O% F- }3 {! F+ M$ l' t
+ U2 }! M7 v4 b% } ASSERT(NULL != pstcTimeDate);
, z+ R9 z) |" ?" W5 a u32TimeOut = RTC_TIMEOUT;
7 @. F; s0 D1 y if(1 == M0P_RTC->CR0_f.START)
0 X( ?' C* q& J* m+ f { / B. ^' {: _, X4 }, \9 K
M0P_RTC->CR1_f.WAIT = 1;
5 ?$ ^# k+ s$ M while(u32TimeOut--) " ?6 V2 q( }# j0 A4 v0 K0 m9 P" i
{
, h% |4 Y. [1 n4 O if(M0P_RTC->CR1_f.WAITF) 6 I% a( B- t7 m% S) J! b5 W4 C! s! _
{ N6 a' g* L3 N
break; . P8 {1 }( I: J( u/ k0 j
} 7 j6 q1 O3 J& X( O' l- M% }8 Z5 b6 A
} 3 S1 }7 t& Q& ^; [; h
if(u32TimeOut==0) * f: @. J: w5 v0 M/ k. [
{
. \" }/ n& W6 Y* e, r, ^7 R% j7 Y* O return ErrorTimeout;
% B e8 d+ B; {3 D# X1 e }
# o! b! s, B% b } : r, `/ b9 l' P3 K. ]1 A9 s
u8BcdSec = M0P_RTC->SEC; 2 B7 | X9 P1 b6 N4 W
u8BcdMin = M0P_RTC->MIN; ' Z8 w ?- Y6 f! a" ^
u8BcdHour = M0P_RTC->HOUR;
@) @. c4 U W0 k u8Day = M0P_RTC->DAY;
1 y: |8 c" ]9 E0 @1 k. n" l u8Month = M0P_RTC->MON; $ @& j' t5 M) \ {, `/ j
u8Year = M0P_RTC->YEAR; $ d/ G$ @$ d2 ]+ ^$ p" M
u8DayOfWeek = M0P_RTC->WEEK;
) k2 @4 \. K; Q% h3 t% {
: c$ F. d/ I/ m' k4 r3 f) v7 e, q pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);
" I; [3 l3 @: i" p* R* r% v# c pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);
- i/ s$ o/ ?0 g8 v3 F1 B" N* y pstcTimeDate->u8Hour =u8BcdHour;//BcdToDec(u8BcdHour); ( [" J% Z# p' D k+ h
pstcTimeDate->u8Day =u8Day;//BcdToDec(u8Day);
2 ]5 e: S- I1 | pstcTimeDate->u8Month =u8Month;//BcdToDec(u8Month);
6 N7 N* Y, C3 y! k' t8 c2 g pstcTimeDate->u8Year =u8Year;//BcdToDec(u8Year); " u6 R7 b! ~ Y2 W5 x6 B0 ]
pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);
* Y* p$ v% j( g, z; P M0P_RTC->CR1_f.WAIT = 0; 6 D2 `% z8 p. ^4 c- g1 D
if(1 == M0P_RTC->CR0_f.START) ) R& f0 O5 f3 e! ]& I% [
while(M0P_RTC->CR1_f.WAITF);
$ T$ B1 |! L8 g0 j8 @ n4 o return Ok; 5 \/ p* e3 G* @9 I$ `& b
} 9 Y8 W- ^2 v4 ?' \/ X ^/ @
/**
6 G/ ?" J7 j9 K- R ****************************************************************************** 8 Y8 u) K" j* b: P
**\brief RTC计数or读写状态获取 ) k5 }3 g' C/ c0 Y o
** 0 z' ]# h; }" G0 ^/ R$ V# ^1 K
**\param [in] 无
1 q( d Q9 ^1 n, f/ v, ~2 H4 r% g **
0 z4 n+ g; k/ H4 R: ]! _/ M) I **\retval 计数or读写状态 ) o2 _2 v4 _5 h! d
** ( ^& k" |9 W+ m$ [1 J
******************************************************************************/ 7 p1 V5 q$ H6 W$ @. R: i
boolean_t Rtc_RDStatus(void)
5 c0 h# y; d& a{
6 n7 u4 L+ I4 h% P6 x9 D/ A boolean_t bRet; 1 z1 _; T7 |! m2 k
bRet = M0P_RTC->CR1_f.WAITF;
. K4 e' X" o: L- R return bRet; : i* L: o3 a+ O% C
}
* a' P+ n. `& W7 r+ X/** . A% k- H# o4 z8 C
******************************************************************************
9 ~' H& y( K `* F **\brief RTC闹钟中断使能
% K* s( P4 z; L& b i4 V **
; K5 H4 i* T+ b6 s3 e7 q$ V **\param [in] enordis中断使能or禁止
% x: R' a/ P# j **
& ~: q1 S# T( z- r **\retval Ok设置成功 " j* o* J; u$ ~
**
; _( t" F7 a! V, U* J ******************************************************************************/
7 \8 o3 O: G5 K6 Z- K- \8 xen_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn) * M, U- Z+ M' H( W: D H3 e$ _7 V
{ : U6 r1 ~5 ?6 ~" D
en_result_t enRet = Error; ( [0 ? y- J3 d" ^1 k8 F
M0P_RTC->CR1_f.ALMIE = enIrqEn; 3 h* K5 q/ A8 i, O% x" i6 z
Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记 6 ?7 z; x( [% z* Q
enRet = Ok;
' C; |. g+ m, N) ^! \) S return enRet; 0 `4 T& g- h; ~& F* e
}
. M& h" R, W1 N/**
% S+ E$ @) h6 S3 d% B ****************************************************************************** + R: r8 i# Q8 \" n. j2 q! U' b" e
**\brief RTC中断请求状态获取
9 g8 v% m8 x% u4 V. ]% D **
5 F' ^* S/ U2 G# Q2 e* t4 ?" h **\param [in] enIrqSel获取哪种中断请求
# _" J( m) o9 W. Y3 s$ [ B ** 8 F7 j5 A# }: Y" L. k" Z
**\retval 中断请求状态 - R& F- [0 O, s: K0 l+ l9 X: S+ Y
**
7 _5 Z+ `4 W, ~: C5 w ******************************************************************************/
2 C" R# i, b0 L! l" u- ]boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)
" J6 E9 ?' K( }, O( k# W{
8 g3 _2 }8 O. F& I boolean_t bRet = FALSE;
, Y1 V2 ~) g: o ASSERT(IS_VALID_IRQ_SEL(enIrqSel)); 0 W( z+ T) _4 f3 N# I u
switch(enIrqSel)
. ?4 c3 s" P9 S( J {
* D5 `! T. v3 ?" C case RtcPrdf: 9 c# X0 ?4 L$ y
(M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);
' C! o9 g! J; [2 g. n# f6 ] break; 6 P! d+ ~9 H7 P+ f! |" w
case RtcAlmf : ! Y( u+ E7 J' c8 Y
(M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);
! |6 a: A2 n, Z G8 Q( O5 N/ D break; * a4 }" [5 U+ D: D
default: + m$ @! C D8 e v0 y4 \4 Z
break; 0 J, o+ {$ M; j# f4 |* L
}
1 S v, {3 Q8 s" q S" Y, V return bRet;
' b9 X& f. b4 P0 U% }0 b}
2 g7 y- f- w, Q3 ~' k- E/**
% T. A6 n: C$ p! o ****************************************************************************** 6 _$ l. j1 L5 D: H
**\brief RTC中断请求清除 7 q& o( I; A# l8 n/ h& H
**
4 J$ x- m; z" ]: ~$ f **\param [in] enIrqSel清除哪种中断请求
3 y8 P, ?1 v( G3 B2 N7 N **
- \( u/ c+ Y% p3 n$ u( T' p" ^ **\retval Ok 清除成功 + U6 N k) t- o$ Q: Q3 h! n( w
**\retval ErrorInvalidParameter 清除失败
4 [: f# l$ }7 {# }6 j# r7 h" H4 V ******************************************************************************/
, q- P+ E9 s- T6 s8 Sen_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel) . k: b4 f* A3 F4 T+ g
{
1 W! V) M: z6 Q! p ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
$ C4 _. }7 p8 Y switch(enIrqSel)
& Y. [' I5 A" H7 b) l5 E {
0 o( F8 q' m* m/ C6 B6 Q. A, I) v case RtcPrdf:
" m2 i& R0 T& u6 f, N- Q) R M0P_RTC->CR1_f.PRDF = 0; 7 R6 Y m d1 c9 }5 Q
break;
# R( z9 U4 |1 f0 ~ case RtcAlmf:
0 g( @1 l5 f( o5 y3 N7 ?& r M0P_RTC->CR1_f.ALMF = 0; 3 w: f3 Q- ^7 J+ z, A8 c3 I
break;
: B- r: R: C# l" s default:
7 Y9 w4 @1 R- u9 z9 f6 T; w1 n return ErrorInvalidParameter; ) y" m& X9 c Z7 c$ S* o
} $ w+ r$ f4 Q, n: o( z
return Ok;
# ] j8 n% P% p) I}
/ f S" b, S! m1 A) @
$ Q+ V) M4 D# R/ i( Z/**
, Q# V6 O0 j! ~/ i ****************************************************************************** 5 s7 H" D% _* K6 Z) P
**\brief RTC中断处理函数接口获取 6 K& n9 V+ e+ _
**
: U# \1 i1 ]- @# j( Y5 z+ { **\param [in] 无 8 x" ^, M7 L6 o9 s$ A! Z
**
. s+ T. u7 t7 L5 u **\retval 接口函数地址 # r$ k9 Z( T- x9 Y: j
**
( E, K- X% [0 N* A. q6 I ******************************************************************************/ - C* i% l; N& _" ?; m
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)
* E& Z% I3 a; B% L% w M& @% k. T{
0 \. o0 k' u: [ return &stcRtcIrqCb;
2 S! A& Z; C: u c}
% ^; v) K. R' }" t. ^" B2 o; }/**
3 ^9 S8 t) a0 D# _ ****************************************************************************** 5 @4 i% O: t' u
**\brief RTC总体初始化函数 ) B! n) |- G- v* }0 O$ T2 K
** ! `- Q1 u# g1 y& e
**\param [in] pstcRtcConfig初始化结构 7 v7 c" E$ _! ?' X0 f# j- F" j9 {
**
5 m8 o3 o0 R4 ^* z% |' h **\retval Ok初始化成功 1 A M. A4 l. J1 g, L+ c
**\retval ErrorInvalidParameter 初始化错误
4 q1 f! Q8 e4 s: q$ t ******************************************************************************/
( h8 V3 L D: g) Y' I" ven_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig) , z9 J1 I. q$ K( b4 I3 K0 {
{
+ V+ p! b' e+ t0 V0 n4 r( v en_result_t enRet = Error;
' v3 c# E: _5 ~1 u/ G; y0 W stc_rtc_intern_cb_t* pstcRtcInternCb;
$ Y) X# U2 |: b7 h/ Z: J! o# a if(NULL == pstcRtcConfig)
3 K0 B# ^3 I! ? return Error;
$ j7 ?2 O& {, |; S8 q) V pstcRtcInternCb = RtcGetInternDataCb(); " J; E$ M% k) l
enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);
1 Y! T- x1 X) H1 t enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);
1 {6 a3 s: I' Q, _( g: K4 Z if(enRet != Ok)
2 n$ E& K4 @( f3 W3 x% M; z { ; n2 X) B/ }* D2 A
return enRet; 1 o' P5 |6 N, B2 h: v
} / `2 \/ D6 ^; P& R- `
if(NULL != pstcRtcConfig->pstcCycSel)
/ i" r0 I/ g4 t) d/ i {
; _3 u* t. i3 x7 s8 u. m if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel)) 1 i/ L& R$ `1 C9 T; Y* N6 _
return Error;
. {4 M5 z0 ~3 _% z/ S4 h }
6 q8 D& J% ]/ b' W5 N$ M if(NULL != pstcRtcConfig->pstcTimeDate) 6 K% C, F* M8 I7 b" S/ k! H
{
/ A% k8 A, E3 G2 p) h if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE)) ' j# L: M* b" }% j- K# K0 _3 z
return Error;
# h! {4 l7 u3 H3 @ }
* C) [! a( x9 F: Q: y( u: n8 } if(NULL != pstcRtcConfig->pstcIrqCb)
9 I1 L7 N4 U$ Q4 k) @ { 2 q6 @/ D0 d3 w
pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;
7 R2 n. F, }6 D x5 F pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb; $ x: J9 [# |( a2 ~ |6 S3 q
}
1 l2 R1 G" v; T, s6 V4 i3 C if(TRUE == pstcRtcConfig->bTouchNvic) . Q a4 j0 X8 A( p
{
9 | F+ c6 v* a EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE); ' \, i) ?0 _! m* A% o" L: W
}
1 q: D8 z( y( D" ~9 X else 0 u& }/ Q9 I/ u# x( v% X
{ 7 y" b! x# }! {* E+ k& ]7 I
EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
6 y6 G' l: B1 W1 O" B. ` } 5 T" _9 e( _1 l7 {: s
return enRet; & U$ F) y$ y- G4 k' }
} , T/ V2 N) Q7 P5 G
/**
! [3 O# _4 z# \+ `( s/ z ****************************************************************************** % y# @( X4 |9 O5 r
**\brief RTC计数禁止函数
% w5 e/ w, c. i# y ** & ?1 B/ h* K w8 O4 L; }
**\param [in] 无 + m7 q/ k& {% o# \
**
9 O b$ o6 i1 [* q6 c1 q **\retval Ok禁止设置成功 , g4 C; [; {) @& z* ?4 |3 z
** 4 t$ `7 I* ~+ H, b2 I X
******************************************************************************/ 2 y y2 J# s( E2 E( _9 h
en_result_t Rtc_DeInit(void)
! F5 ~0 O5 A% [: k% X! o1 j' P{
" s3 t9 A- c$ O% ? I8 M1 O EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE); 6 s1 c" e# t. a* c9 e
Rtc_DisableFunc(RtcCount);
. r% Z9 f; [7 q! J$ ^* [$ G Rtc_DisableFunc(RtcAlarmEn);
6 `/ y# Z' O; r U7 G4 c* S5 N/ C% P Rtc_DisableFunc(Rtc_ComenEn);
9 }/ @) u- D& l, S; {/ Y1 j/ i4 h! N Rtc_DisableFunc(Rtc1HzOutEn);
3 {( K. ?6 C3 A return Ok; M6 f1 L0 \9 y
}
( \" P) Z" G$ X* i, l' o R/ n/** ! i$ M) b, a0 X/ M3 n1 b2 d9 j* f) k
******************************************************************************
1 d+ U0 [& o- }7 @8 v( E **\brief RTC中断处理函数
$ A+ ]8 M" U7 l+ Z **
\% F& ^6 e0 v **\param [in] 无 ! @: N" Y. c# P* d5 \: L
** ' s5 T: i* u* O1 F' ` E: ]& v. O# Q4 b
**\retval 无 , @! Z+ N1 W$ h ^" q, T
** {; p {2 j4 g) g: x" N \/ d: d7 i
******************************************************************************/ ( O; v& V0 W, g
void Rtc_IRQHandler(void)
+ a9 Q" J# I w9 Y/ M7 i( W# c" v3 y{
# G" U6 M% w1 M+ O, w stc_rtc_intern_cb_t* pstcRtcInternCb; 0 h; I( r& v8 e- ^$ {' \
pstcRtcInternCb = RtcGetInternDataCb() ; 5 |1 v; S/ y) P4 c6 e5 \9 p5 ]8 V
if(TRUE == M0P_RTC->CR1_f.ALMF)
& D- h' p4 D2 m {
4 |7 J/ @+ \' K7 s M0P_RTC->CR1_f.ALMF = 0u;
: \# l* K! A' k. T if(NULL != pstcRtcInternCb->pfnAlarmIrqCb) , \0 g" v$ H' s5 s
{
" R8 _7 e; ~: z9 p c pstcRtcInternCb->pfnAlarmIrqCb();
0 E! Y3 p" N/ m# g } 8 H$ j$ t8 O! j- i8 D3 B) k
} 8 Q8 o! u" h( i" f, L3 I. ~" g
if(TRUE == M0P_RTC->CR1_f.PRDF) - n1 F$ ~* a4 r
{
2 m+ n2 M. i8 r& w4 E5 \ M0P_RTC->CR1_f.PRDF = 0; ! ~ {! `; m1 Q) G3 p; J
if(NULL != pstcRtcInternCb->pfnTimerIrqCb)
! u' }8 C$ [+ ]" O% X7 y, C { . F+ J' w- B0 j1 |0 G! B0 I5 C
pstcRtcInternCb->pfnTimerIrqCb(); - I8 x6 U b0 A8 y
} 4 V& q% w) x' E) `, z8 f
} 2 r' V, U9 J* i9 T! B6 w9 `& v
}
* V* d+ Y$ i' S& O
1 P+ |7 ~- I8 X ^, M, h
, c1 P3 C; O. k) w, Ustatic void RtcCycCb(void)
( l, {& E3 N: S) Q1 ]' p2 ^{
$ m7 k! i" w. n0 I4 g* H3 Z4 b: r cyccnt++; , H0 H: X* K& v2 o- K! H% m, h
flg = ~flg; ' `: W B4 H* J( L# R" q
Gpio_SetIO(3,3,flg); 0 {' \- [+ m. _' l7 W
}
l; m" L2 s7 G/ L7 ~- l6 }" rstatic void RtcAlarmCb(void)
l F7 p! p3 s{
0 H( C1 @+ i3 { u8Alarmcnt++;
% ~2 s" N! S5 J}
z& B$ \0 K3 y5 @" l* @int32_t main(void) $ c1 g, G1 Y% m0 _9 t6 i5 i
{
) v( U. Y1 N1 p3 n+ m" W stc_rtc_config_t stcRtcConfig; / [; N/ S( b/ ]% s& a0 z- f- i n1 H! t
stc_rtc_irq_cb_t stcIrqCb;
/ J4 q6 G( F& s3 S' I" V k stc_rtc_time_t stcTime; ) s* C7 i* }5 c3 d
stc_rtc_alarmset_t stcAlarm;
, v/ j/ @* B$ N, k9 ~ stc_rtc_cyc_sel_t stcCycSel;
; |3 D3 _; o2 f7 x) j7 t DDL_ZERO_STRUCT(stcRtcConfig);
6 A8 d6 \) f9 b DDL_ZERO_STRUCT(stcIrqCb); 6 B8 n) _, \( T7 Q, N: G- s
DDL_ZERO_STRUCT(stcAlarm);
) B6 G9 }" N- E DDL_ZERO_STRUCT(stcTime); 5 A( c4 I+ _& m; o: C/ M; O
DDL_ZERO_STRUCT(stcCycSel);
# n9 q- c/ V2 h
6 e4 e ?) h0 k" e Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟 % H# z2 I1 W. w: |
) X" I1 Y8 r7 C. a, h
4 p+ Y2 @6 j$ n+ W z! ~% r5 S" {# a Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口 ! i9 e ~6 x7 q
Gpio_SetAnalog(1,5,1); 2 ? T' P9 m% I0 n" [
Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768 7 L/ n4 ?) P5 O r! g/ B/ O: {5 {
//Clk_Enable(ClkRCL, TRUE);
9 ?" i" u b% L) {% K3 N" |6 J //Clk_Enable(ClkXTH, TRUE);
8 R+ j6 Q/ |. _6 P6 j- [3 w9 E Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟 ; @3 A9 F( I$ C. g( ?
# \. T/ l/ N0 @2 @3 R. Z- e
stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//
0 \7 U, b: h' N' | V) } stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;// 9 B+ U; P& `, w/ E$ ~8 J# z1 _
5 w. ^, n! D2 q' G0 H stcTime.u8Year = 0x17; ! S6 r+ t) }3 n6 p3 g* y$ X
stcTime.u8Month = 0x06; 3 t+ \9 p8 Q( J8 k% z; @
stcTime.u8Day = 0x07; 1 a$ t/ j/ s$ Z/ f; C' Z
stcTime.u8Hour = 0x12; ' Z4 X/ L- S6 n
stcTime.u8Minute = 0x59; 2 C- h8 M* |# ]+ l: G. @, i
stcTime.u8Second = 0x59;
& o: ^' o6 k* f, @0 X8 j( p stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
* Z) P# L( L$ {% i. W+ x; ] stcRtcConfig.pstcTimeDate = &stcTime;
" N# ^) I |+ g) l B* T. @ & `* @2 V# [3 A, [1 @
stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb; 9 r- M3 B1 ~( q) ?3 ^3 S, l
stcIrqCb.pfnTimerIrqCb = RtcCycCb; ) w* [7 U. h2 f3 g$ N2 K
stcRtcConfig.pstcIrqCb = &stcIrqCb; - x1 u7 F7 d/ f8 g" _8 Z; y
stcRtcConfig.bTouchNvic = FALSE; $ S+ W) f7 T i
, }$ R p7 n* c7 T6 Y& j0 U Rtc_DisableFunc(RtcCount);
) Q1 E8 t$ U+ u Rtc_Init(&stcRtcConfig);
. d S+ `5 k1 \; R ) x/ n4 ^4 E, o
; Y2 r2 j( f8 z5 x# s% z0 L Rtc_EnableFunc(RtcCount);
7 W* z9 {4 Q+ Z Rtc_ReadDateTime(&stcReadTime);
% ]% E) {4 K' c7 | while (1);
, x& m! z3 \( E. |. K( t" k4 K ' r4 K' s$ l( [& \
}
0 @# D! B6 i8 r: d0 G# \$ A
u$ ] Y1 ]5 n& n7 O# t/******************************************************************************
( s6 F |; ]# \' ^) m *EOF (not truncated)
2 i- ^. s h6 U& \ ******************************************************************************/ 6 n- ~8 m4 |+ a8 Y, _# t/ {
# e3 Q7 R% {4 L; Y7 B |