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