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