EDA365电子工程师网

标题: 华大M0+低功耗MCU RTC模块示例程序 [打印本页]

作者: deepskin1213    时间: 2018-2-9 16:53
标题: 华大M0+低功耗MCU RTC模块示例程序
0 X+ H0 d7 X+ U: ?! Q
/************************************************************/
0 z9 }2 a& ]7 l, g, g8 I6 P
/*******                 样例使用说明           *************/

- X# W3 G3 `1 I8 G3 Z6 y
/*******                    版本历史            ************/
! A* ~8 V  Y8 ]& r5 l
/*******  日期       版本    负责人  IAR   MDK ***********/  

0 b' U' w- T7 h  o, Y% y4 a+ S# m9 }6 ^
/*****    017-07-14     0.1     CJ    7.70    5.14 **********/

# t, G- j, N2 L2 G+ ^
/*******  QQ:3386208645                       ************/

/ ]: r' e% b' O
, g6 }6 E8 N1 ]- P
/*******               功能描述                  ***********/
/ r% a6 F$ \% _8 c3 P
/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/

# q9 g# w& y, i1 n( x
/*说明:                                       *************/

% n5 `8 o) P5 B# D/ h) Z
/*计数初值写入计数寄存器                       *************/

5 w0 [6 f% f% @/ a1 B' T3 t1 b( D
/*启动计数                                    *************/

& E0 u% X% @% [! j! Q
/*读取计数寄存器数值                           *************/

0 u* T3 u; C+ q; j  W) y+ D( E; @
/******* 测试环境                              *************/
" {8 X7 t4 |! k. H  Y6 C7 o( S
/*     测试用板:                              *************/
) L6 D- z# U/ _2 n5 c2 |' m& i
/* SK-L110-TSSOP20 V10                        *************/

9 L5 U; [( l9 [% a- @2 {
/*******辅助工具:                              ************/

7 N/ z% h4 w; _7 |" l- ^/ {0 z
/*  JLINK调试工具                           *************/
$ N  E, x2 t. V
/************************************************************/

* I8 X# J, y' |" d1 N
#define IS_VALID_CLK(x)             (RtcClk32768 == (x)||\
3 n! A9 I5 ]0 n% h" O' w
                                    RtcClk32768_1== (x)||\

, g6 W! U3 I  V! o
                                     RtcClk32== (x)||\
; J: @. G( I) o
                                     RtcClk32_1== (x)||\

9 r6 e# ~1 I( Q
                                    RtcClkHxt128 ==(x)||\
( c- M: F& X( s4 c$ \" {* B
                                    RtcClkHxt256 == (x)||\
2 T2 h" ?4 ?4 t! C
                                    RtcClkHxt512 == (x)||\
4 C/ E9 R" s7 I* r. ?+ ]
                                    RtcClkHxt1024 == (x))
7 N0 F! G# }; X0 |( l' g+ l
# J6 p% E0 o. j% M; ]
#define IS_VALID_CYCSEL(x)             (RtcPrads == (x)||\
/ e2 n5 L; B2 x5 d0 b
                                 RtcPradx==(x))
3 T' h1 {8 o- \' _6 _

2 Z* z3 |0 w+ ?7 E. D$ d: \
#define IS_VALID_PRDS(x)        (Rtc_None == (x)||\
% U! p) q8 {: _! }* Y
                              Rtc_05S == (x)||\
4 {$ [  ^' }2 ~$ E, y' R
                              Rtc_1S == (x)||\

. t7 S7 a2 }; p0 N4 {) L( k
                              Rtc_1Min == (x)||\

+ {9 b% b- b! o8 U
                              Rtc_1H == (x)||\
- v8 Q  M( N' x0 [8 \; H; V
                              Rtc_1Day ==(x)||\
3 N6 s& @! `9 K- X, R
                              Rtc_1Mon ==(x)||\

8 V- d# ~* Y+ n9 B* L
                              Rtc_1Mon_1 ==(x))  
9 Y# P; k# l4 _, c

: Y, m3 i; ^* @# Z
#define    IS_VALID_IRQ_SEL(x)      (RtcPrdf== (x) ||\

" \/ a) z2 K" {* q' @' C; u
                                      RtcAlmf== (x))
; |/ x9 t- j! o' O

; ]2 j+ s6 Z, h" S/ N5 y6 `+ {
#define    IS_VALID_FUNC(x) ((RtcCount<=(x))&&\
" z; z; g6 u! b/ A
                              (Rtc1HzOutEn>=(x)))

7 r0 P# A* O' F4 _+ y# S
#define    CkDateTime    0x7F

5 ]$ _/ }; l0 r! m
#define    CkDate        0x78

5 W, w, G  B- f) V! G% i+ c( ~
#define    CkTime        0x07

' Y- W% Y$ `2 Y' _- i
#define RTC_TIMEOUT             1000//test 1s
: |* a$ l* b/ t
#define    T1_PORT                 (3)
! x8 Q* v$ F4 Y+ s* U# |( G6 r3 S
#define    T1_PIN                  (3)
3 C! h* G7 R: d8 o* u' m9 n
uint8_t cyccnt=0;
" }- |. l; h7 ^1 W. F. ]4 ^# W6 W
uint8_t u8Alarmcnt=0;
4 g0 n; j4 z4 {5 T% c) `& G
uint8_t flg=0;

( }# X+ n& h$ h* i
stc_rtc_time_t  stcReadTime;
/ f# i$ x- h8 x- h( Q& t; T! K  x6 Y
* Y9 u) T2 ]2 @( G' H/ z- _
/********************************************************************************** \brief  RTC计数时钟选择

! U2 W/ a! n- e+ i% W; @
** ** \param [in] enClk时钟源

! h- ?; z/ q9 R9 a5 h
** ** \retval Ok

" d" z& z" G( ]; d& c2 D* _
******************************************************************************/
: W- j: |( n* e; l3 o/ `# x
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)

) n3 o  z! t( C$ r& j# `
{

  y) m- t! i. H2 h% b6 r
   en_result_t enRet = Error;
$ t5 B, e' m8 C. K5 |
    ASSERT(IS_VALID_CLK(enClk));
- W' F7 L: N4 H! b8 i2 H( o
   M0P_RTC->CR1_f.CKSEL = enClk;
0 ]8 m& |9 ?  W( @
   enRet = Ok;

. t( ?* h/ m  z9 I4 |
   return enRet;

) ?* c0 O6 N; E6 d0 I# w
}
& @* ~) r) J9 v( `# s
/**
+ N  D2 {! f* O$ K
******************************************************************************
0 \; ]7 W/ u, k3 B7 v
**\brief  RTC周期中断方式选择
7 f7 j8 X/ }& m' n2 L- L
**
; R# u" O1 B5 e
**\param [in] pstccCyc周期中断方式及周期间隔选择
$ a1 w/ Z4 g1 d  Z4 x/ ^
**
) W0 D$ n+ I  ~1 w, b% G5 \6 V- \
**\retval Ok

/ ~- r1 Y) {9 ~+ i
**
& m2 K1 ^: K. [+ [; X- I* h" C) p
******************************************************************************/

3 R4 e" Y9 S- O0 v- ?
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)

1 @& J9 z( x- O
{
$ D  r  m2 V, |8 m8 Q0 N0 f* l
   en_result_t enRet = Error;
+ Y' o4 D4 I- Z, a* _
         ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));
$ U5 Y9 p& [) X. l% I$ A; z
         ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));
# U9 w! r1 e7 `! p' r; w4 z6 F
         M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;

# s/ l  h5 [' x( Z1 o; _
         if(pstcCyc->enCyc_sel)

" F2 C+ x5 E/ h# d) k
    {

0 d% ]: B0 G  D$ w
       M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;
( w2 X& @0 ^# r! P% K  O
    }

; A" ?' P/ M9 R9 U7 C( d1 R& U
         else
  C, x0 ~7 N0 Y% U
    {
* \6 C2 B7 G1 m2 P, R3 C3 }, M2 e- h
                   M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;

$ W& |* t$ D( c
    }
+ _1 r% V- D7 S* m* _9 l
   enRet = Ok;
6 g+ |7 _9 ]+ f/ D* s
         returnenRet;

: |( \. u3 _5 ?$ _; x( D* c/ @& Q
}

9 o0 s; j1 X  t
/**

" U- n6 ^" f) F0 x0 C% D% ^
******************************************************************************

( L: t6 T1 y2 T6 x; Y% Y% |- K  ?
**\brief  RTC时制选择
" M# ]/ x! k) G% \: z' `
**
# A' ^4 ~5 [/ e/ s& B4 T
**\param [in] bmode12时制or24时制
( u! U0 \/ x! O, Q) I
**
; O+ F2 t' f; ^/ e+ @, v! r' A1 Y7 |
**\retval Ok  设置正常

5 J8 W3 n# v, i( h8 k, E+ Z3 I
**\retval ErrorInvalidParameter 设置异常
5 b: `7 H/ P6 G2 W4 y
******************************************************************************/
2 j+ y$ @. @9 e  O( s- K$ Z
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)
6 h9 ~' h! S8 Y. \
{
# N! g; y7 v2 v7 I+ F9 j3 j
   en_result_t enRet = Error;
, s6 G( O5 a" M0 L  ?/ S; Q
   switch(enMode)
5 V) ?+ Q" S( d0 i- H3 v& I
    {
9 V) A3 Z! M8 r+ y, U
       case 0:

; q) ~* A) i% w/ R6 S& p+ g  m
       case 1:

3 j6 _- w5 Y$ |9 L
           M0P_RTC->CR0_f.AMPM = enMode;
0 r3 y4 @) v) H1 A" {2 l
           break;

  ]" Q" m0 m9 H3 h" }! L. X
       default:

; I) u1 m9 N+ k  [' |6 J( |- p
           return ErrorInvalidParameter;
: m2 O3 P8 q) l% p
    }

; P) I* Z% }6 @& p8 t
   enRet = Ok;
9 W5 c+ ]6 O9 ?% @% a8 T
   return enRet;
7 F7 B: _8 ]0 R* j  m' V! t- ^( w9 `
}

- L9 x5 q5 `- F( c  E
/**
0 ^: i1 h+ b: c1 K& C3 K! ^+ `, V
******************************************************************************
( Z: L9 w! v( t2 z2 V, Y. D# Z
**\brief  RTC闹钟中断设置
" Q$ Y; }; R9 |1 h5 K
**

! n+ a2 D* ^8 t) o3 r
**\param [in] pstcAlarmTime闹钟时间时、分、周
1 [/ }5 m+ V0 M% R2 O2 G
**
+ ]: a$ A& ^) ?7 G
**\retval Ok  设置正常

, s; X. H4 M+ [$ F$ e
**

9 ?/ B% B0 H* D
******************************************************************************/
; d$ o% i' e9 z. }& Q' X! N- ?
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
  d! d9 U7 G+ C0 o3 k; \% I
{

3 m5 [* ?6 o  W- l$ w9 P
   en_result_t enRet = Ok;
3 O% a1 K/ e/ F( F8 J
   ASSERT(NULL != pstcAlarmTime);
; a, ]4 E8 p5 i/ I
   if(Rtc12h == M0P_RTC->CR0_f.AMPM)

9 V) Z4 U: N- ~" C6 t1 a
    {
% D1 d$ r4 `) \
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);
1 V, J2 D0 @1 Y7 l3 E( f; V7 O. X
    }
/ ]' u) c9 _% u5 N, @* U! ]* k/ i
   else
/ A5 ]8 p! Y- l3 I5 d) W1 P: J
    {

. L( ~. |7 x: s1 z& y
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);

- a# q8 ^" F8 k
    }
) B" o3 ?8 X5 V( ~9 M& Z2 B* @
    if(enRet != Ok)

" x6 d$ b7 O& I  ~
       return enRet;
9 u/ {/ X0 X) n
   enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);
0 w4 {# d5 O) U1 d% t
   if(enRet != Ok)
7 f( w$ u' b0 Y* z! X4 t
       return enRet;

: V/ H: q+ w1 Y& p
   //enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);
+ I  k$ E, N  A$ D* k0 N+ ]6 Q
   if(enRet != Ok)
3 Y& N! E! h; z
       return enRet;   
$ s5 _: I1 w7 P' r
   M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;
  z. d  T* c9 r- F" N  \7 W/ f6 ]
   M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;
# ^+ A# F) V1 ]* ]
   M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;

! j6 |5 k/ c! g+ B5 T
   enRet = Ok;

, j. ~% S4 p* f8 O* Z  W+ v
   return enRet;
+ y* ^& x- f- x) U% y! E
}
+ q+ L$ q/ [1 z
/**
. T. B1 Q# P! Y7 ]& V! w9 a
******************************************************************************
- S! ?- i0 c1 S4 K: D
**\brief  RTC闹钟中断时间获取

0 h% u; _1 D' }. D5 W9 P+ l
**
- q' L$ c7 B" |* ~3 B
**\param [in] pstcAlarmTime闹钟时间时、分、周

4 r% g* E8 g9 X2 N, n9 ]
**

0 V! P1 {2 D6 b2 h0 T
**\retval Ok  设置正常
' {) a4 Y$ X3 w( @
**
6 M! l3 N/ J4 Z% B0 I2 j4 K  n$ H
******************************************************************************/

2 d: t1 {/ ?1 X0 t) o
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

2 S' ?, d+ g& v
{
! y" u7 Y: h+ M3 e, K
   en_result_t enRet = Error;

, g2 e8 h+ k+ z% B1 }6 ^
   ASSERT(NULL != pstcAlarmTime);

* x" g6 A4 a  w& B6 B) q2 R7 i# m
   pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;

7 ~# V! V8 u; ^- Z
   pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;
! U. `3 c5 D& ^% K8 {5 q
   pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;

2 w2 }; Q1 w$ b4 u/ R* M* b
   enRet = Ok;

, ?, O) c9 m5 H
   return enRet;
4 P! d, V) ]* h
}
3 h) M" k" @0 N* S: R7 k+ O4 ?" g" f
/**

4 _! ]3 E) M( S( V2 K
******************************************************************************

  e1 G) D; ~4 W3 Z5 R% n
**\brief  RTC 1hz模式选择

' h1 X8 t- C0 c7 z; f
**

! C6 A1 R* C  l7 v% M5 D
**\param [in] bmode 高精度和普通精度

- T% P6 k# N& u0 ^6 y: c8 d
**

2 x/ [6 F/ _3 x+ }
**\retval Ok  设置正常

! \* j" s  F4 Z) ?- }: n' y
**
6 ^6 ?9 }$ O5 d* b& j
******************************************************************************/

) A4 F% a9 _: J' W2 |
en_result_t Rtc_Set1HzMode(boolean_t bMode)

! M* g+ }* m( f; i: ^
{

3 X9 x, a" e: U% w
   en_result_t enRet = Error;

+ N; L. R7 W, L5 a+ e, _6 p9 u
   M0P_RTC->CR0_f.HZ1SEL = bMode;

8 v0 |; A. I  d1 N( Z
   enRet = Ok;

# K. F) [1 F0 C, B! y. J
   return enRet;
0 {3 h  x& j7 z
}
8 f4 {. e: k5 d/ k# g
/**
1 t" H4 b: s; Y, _
******************************************************************************
& x6 \1 Z4 A/ d( Z) i# |$ T  V$ B
**\brief  RTC 1hz补偿值设置

# j2 z! w- `) |
**
* P) H4 w, j( Y! o
**\param [in] u16Cr 补偿值
* O0 |0 O9 i7 s* {2 E) o
**

1 P0 q3 h# w& C5 _8 |" ?& f
**\retval Ok  设置正常

- m3 t% v. l0 W9 `2 x
**
7 n) D% Q5 M  A( P- x3 t
******************************************************************************/

* `8 O. |5 j8 N! @
en_result_t Rtc_SetCompCr(uint16_t u16Cr)
# A" q! S& O% }! C) ~( z
{

* K3 i7 Y# l3 h5 y7 _
   en_result_t enRet = Error;

0 J3 U# f  M! z% A- q6 S
   M0P_RTC->COMPEN_f.CR = u16Cr;

5 l7 m6 f0 F: f* l& W
   enRet = Ok;
" D) m/ H6 M7 m5 r7 ~2 B9 z
   return enRet;

/ U# C. }9 I3 F- c% w# M# o
}

" \+ ~4 ~9 }& f7 x& j. e( t
/**
' ^+ G+ ^( N& T1 z; L
******************************************************************************
1 }5 C4 D0 V' I6 d- E7 n
**\brief  RTC 功能使能设置

, J0 y  `  ~" Q- j6 c5 Q% z
**
3 _+ N. ?& o/ n* p# F+ i1 ~
**\param [in] enFunc 功能选择
8 A% E2 O2 c" g0 @
**
7 P, r6 s; A8 ~% v/ y
**\retval Ok  设置正常

0 u: ]3 k1 d" e6 r$ A, m& S
**\retval ErrorInvalidParameter 设置异常
* M4 [) I" @! p, u: l  R+ {
******************************************************************************/

. Q# F  O3 H# a. h7 q0 C# C
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)
2 I, M+ H$ ]. m0 K; S* Y) ]
{

" R" ]7 i0 k# e# @3 K# F' ^9 [' u
    ASSERT(IS_VALID_FUNC(enFunc));
7 O+ ?  @! C$ `5 Z7 A7 R
   switch(enFunc)
2 I% U1 V8 V  D1 O0 g& m' w0 E
    {

) g7 d1 f# J+ T5 y* X5 h
       case RtcCount:

/ w0 X+ o+ N$ Y* L1 M  m
           M0P_RTC->CR0_f.START = 1u;

- C; S1 z" b7 {3 ~* L- H
           break;

. |0 b: O1 |3 c$ q1 q
       case RtcAlarmEn:

. M, C. |4 E# W$ \
           M0P_RTC->CR1_f.ALMEN = 1u;

- A! z' S3 j# I4 `& S' I3 L. k: `
           break;
% i! X' I1 E& k1 s
       case Rtc_ComenEn:
' d; D& |# C7 Q) A
           M0P_RTC->COMPEN_f.EN = 1u;

. a: @: \# d6 Q7 ~
           break;
% F% O* V: [3 T2 a$ m
       case Rtc1HzOutEn:

; X9 v  S6 |! s: K6 r0 F9 D0 L3 T
           M0P_RTC->CR0_f.HZ1OE = 1u;
- D; A9 ^( y& u: b( h
           break;
4 V/ x5 E. E& S
       default:
/ F5 j& F, S8 C, e
           return ErrorInvalidParameter;
" Y0 q1 S: {- E
    }

/ {# s6 v( h) A' Z) g3 V
   return Ok;

0 p9 C& e* O8 o: K7 ~% E
}

6 x0 j/ a! v5 V0 I* d% \6 n8 Z6 @
/**

' j  f& E0 n; {: `& A# `  E% [) j1 }
******************************************************************************

& ^" u* i  h5 G% ?
**\brief  RTC 功能禁止设置
+ H% Q  e  M# _$ |% G% g2 {
**

8 }4 A- B% b* S2 a
**\param [in] enFunc 功能选择
; |9 V1 ?3 P0 }) J
**
# Y: ]0 E( _+ ~4 f- g
**\retval Ok  设置正常

2 B" ~$ Z7 Y7 c0 A. Z. T0 T: E
**\retval ErrorInvalidParameter 设置异常

( f7 [/ g# |, D6 a7 A9 K' E
******************************************************************************/
) D! B2 }7 i2 d9 \$ `- t! C* Y; ?# t
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
" A0 o- e. v: H3 z5 O* |
{
! v" f$ \1 I1 c" D7 d: U% {
   ASSERT(IS_VALID_FUNC(enFunc));
% Z9 ~& h: g( s& \. R2 F- N
   switch(enFunc)

3 V: U$ q4 u% [
    {
! E& z& {& I8 g% Z9 j7 o4 c
       case RtcCount:

0 w, E6 H8 Y* ]) H* O- t8 h# n
           M0P_RTC->CR0_f.START = 0u;
5 k# u9 |; b: x) a' @. j
           break;
/ h% t/ y6 ]* Z7 X6 f# J
       case RtcAlarmEn:

8 s7 ~, Q( l( [9 [# ?8 S- q
           M0P_RTC->CR1_f.ALMEN = 0u;

) ]0 w. T$ n/ w0 e# p) E
           break;
6 `0 x& M+ r* g$ Y+ }
       case Rtc_ComenEn:

) S8 f7 l" s! s+ N' M3 T3 |
           M0P_RTC->COMPEN_f.EN = 0u;

) b* A4 O7 u0 K9 |5 }8 A' N; ^
           break;

! M- R6 }& s& s& W- M. C
       case Rtc1HzOutEn:

9 i7 k  i3 f0 \) m8 h5 _
           M0P_RTC->CR0_f.HZ1OE = 0u;

; s7 ]3 k6 V2 l, u4 \0 R
           break;
* G- H. _4 Y( ~: k  F1 [8 K, v
       default:
8 `% `9 {+ L1 w: ~4 Y
           return ErrorInvalidParameter;
) \* u+ H6 f. O7 O5 ]
    }
5 u0 Y% N  z! u' \
   return Ok;
/ o, G" b1 a' ^7 T5 y/ f; N
}
& n2 l! l4 K& g) o+ b
uint8_t Change_DateTimeFormat(uint8_t u8sr)

2 Z; Y& e8 T0 a; M/ A$ z8 {4 y/ I' X9 V
{
& N2 Q1 h+ }- q& P) x
         uint8_tu8de=0;
! x+ k7 b+ L0 W5 m
         while(u8sr>=0x10)

  Z4 X2 q9 T8 L! v; e
         {

" p+ [& T. n  M  E" c% r. ~
                   u8de+=10;

- h0 L% o: Y9 i; X1 X3 D  M
                   u8sr-=0x10;

9 ^  J5 A/ r% P$ j; w3 |1 b
         }
5 v7 d: ?; M4 w$ U
         u8de+= u8sr;

% T  \! v/ M* O! R' F
         return(u8de);
: a$ j1 H* p$ e7 g2 M
}
! m4 c' k0 O) t! X" h
/**

  s, w1 t/ |+ T
******************************************************************************
% P6 g4 g, m: J/ }
**\brief  RTC 平、闰年检测

1 K- a1 }5 Y# v+ [' P
**

* H9 `4 I3 Q  H. f* O
**\param [in] u8year 年十进制低两位

% M( g2 l8 P, n  B9 M& ^  {
**
$ E- q0 ]& Z2 C
**\retval 1  闰年
5 d6 q' d3 v1 ~8 m7 b0 J6 }
**\retval 0 平年
% ]9 D0 n# F5 u& J# o& \+ r
******************************************************************************/

" H0 ?6 r* @' I* U" n" q; l: M/ ?
uint8_t Rtc_CheckLeapYear(uint8_t u8year)

$ V( J3 O' i9 D8 e1 @$ m* n, ]2 J- V: ~. |
{
9 B  b- ?* p) q1 L1 e
   uint8_t u8year_shl,u8year_shr;

7 V5 v# s$ G% p3 a
   u8year_shl = u8year>>2;
3 G7 x: u  R: z2 A# B
   u8year_shr = u8year_shl<<2;
2 Y( r# ]) w0 j. p& q3 O% z3 ~
   if(u8year== u8year_shr)
. z7 n! O6 y' O: z6 [
    {
; Y3 N) t3 z. D7 i) ^
       return 1;
  L9 s, {% i  x
    }
  }( c0 y5 ^# M# K  O# T/ w& ^
   else
( b4 {8 R) U8 @- N7 V9 \; h) x
    {

. g0 k9 x/ J1 w% `! e
       return 0;
9 T2 P* |$ H" k% L
    }

8 u! H  N! W8 J6 o% N+ Z
}

# Y6 v9 i% w3 p2 U' m% l* d
/**
; S* A& J8 G( `' R
******************************************************************************

# S* w! F4 m( g  Q0 F
**\brief  RTC根据日期计算周数
0 a9 [$ Y! v3 r
**
9 V; y# E/ r( k
**\param [in] pu8Date日期
& l9 V, @5 Y+ Z. Y0 B( M0 i
**
3 w7 N3 Y* z3 g% T$ Y5 R" R
**\retval week  周数

2 ~- F4 _' Q5 g& G2 u/ p
**
1 P* \; |7 u7 {! Q% t2 ]* {
******************************************************************************/

, @0 G( Z& q% n0 W: [( P
uint8_t Rtc_CalWeek(uint8_t* pu8Date)
" }+ }  D; F) m% _
{

: u+ R# J; f  G9 x# M7 v( i0 A& C
   uint8_t u8week;
! R' O' k4 L0 w: m- w) \
   if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))
& g* f3 R) Z2 t- R! w( `
    {
# e. W% n) J1 [: K
                   u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
, X* o. z' W1 u4 s, T' p% U4 ]
         }

, z/ {; N# [; C3 x! o1 h
         else

) j  y& Z8 L9 D0 G
    {
+ N+ X5 [8 h3 k$ Y
                   u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
* A- h1 v. y5 J7 L' O
    }
$ a5 S$ n" V7 g" ~/ ^
   return u8week;
- Z# N1 o# Q( c: r3 D5 s
}

( y( h  c5 l8 ~( O
/**

/ [" x9 T/ d! ~: N- G" }8 B1 n# B* {
******************************************************************************

7 v8 N7 Q4 w+ q) ?) U, r# B; v
**\brief  RTC根据年月获取天数
# q5 k4 Y0 ]+ X1 ~/ ^/ L/ G* j
**

  ]- B1 D$ T. v9 j
**\param [in] u8month月份,u8year年份
5 i2 `1 g: J# u: e6 w( U
**
" q- y3 c, J- b, @
**\retval u8day天数
3 L& D, I/ W, C0 U1 T3 e
**
2 h+ Y' t% ?2 n/ @7 M2 x
******************************************************************************/

0 L# x9 w" ^. \  ?2 M
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)

& R6 q0 u( Z% @2 F3 n1 F
{

, B" ~" q0 y" ]- J# ^. q2 D4 B
         uint8_tu8day = 0;

& D. d" i( V: c1 e0 \
         
7 K0 P& T, u6 o  F( e7 V
         u8day= Cnst_Month_Tbl[u8month - 1];
0 T  k  Q) z; l0 X/ D
         if((u8month== 2) && ((u8year % 4) == 0))

) f4 L4 k- g( y2 k4 l" z- Q1 F) Z
         {

5 Y6 V. N  G$ x/ n( ~! D* P7 f$ W! N
                   u8day++;
- Y' `9 s% K' D" K& J1 Z0 Z8 B
         }

; E3 ?/ P: i9 l9 }+ ~* t, l: f" h
         return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31
8 i$ B# S3 `  a/ Z7 L
}
4 Z: y9 H! [1 f
/**
! o3 s& N% x" p/ b3 P
******************************************************************************
: |7 {1 m$ o' r& \+ I' N' y
**\brief  RTC根据日期计算周数

% m/ r6 ^3 U4 M# f$ S* L
**
: n* c, Y, z+ J# o: Z
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值

4 F" K* e! r; x! H1 v& V( C
**

% t# r& b& m9 w3 ?% Q
**\retval Error 错误,Ok校验正确

5 I- e! j) B$ m, k
**

) @4 U0 a7 k7 D9 w
******************************************************************************/

" }" r; H4 }& ~# i1 I3 q- @
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)

8 _* i- f8 L. h. E+ C+ ]' O+ z
{
) M% ?# Y4 M+ F( C

  G. \( }9 E0 Y8 B; w+ v
   if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)

& ]! g# @- k! ~( @
   ||(u8data > u8limit_max) || (u8data < u8limit_min))

9 ^0 V4 ?6 a! [& w
    {

  X0 [8 R/ S3 T, p
       return Error;

) A7 u! R( t+ u% ~5 A
    }

' }. }5 j8 `" J- k' |, x* e
   return Ok;
+ H2 e! h7 O* V
}

+ \" V/ N/ N) \; j3 F
/**

4 r# h0 ]8 d7 Y
******************************************************************************

: _$ z. s8 X- K) O
**\brief  RTC时间格式检测
0 ~6 j  y6 x2 N! F: q  j
**

: k0 N: g* V3 J
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式
1 P! j0 V4 L( R& ^6 J; q7 r) x$ V% {
**
7 S6 ?3 o7 {4 c
**\retval enRet校验结果
* t; a" r* M- l# N9 L
**
( F# A% s: X; S) G3 y- e
******************************************************************************/

# [$ [* G1 f2 |! L3 h
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)

" Q, k3 [1 }# ]/ f9 ~
{

6 V  u# [+ A) a/ i/ r$ ^( u# k
   uint8_t u8i=0;

( h  `# n0 ^3 e+ F/ \# q8 {0 Z
   uint8_t u8mon_max_day = 0x28;
1 q; ?4 V! o& v
   uint8_t u8date[3];
6 h+ _( v# |0 Z
   en_result_t enRet;

0 P7 I6 g" R- h  V: g9 x+ X
   while(u8i<7)
: a: ^8 r6 e4 X3 t2 `
    {

& F: ], n' I5 I+ a+ u$ \. i) b
       if(u8Mode&&(1<<u8i))
- I% S: a/ j5 X* P6 v+ e5 R
       {
& B# q2 m) T  }" x4 f
           switch(u8i)
1 K7 z& b' ]* @7 R
           {

# n2 I8 R7 R+ Y$ U! N
                case 0:

+ \) ]0 D. \8 G
                    enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//

, @' Y* I9 O* T6 y  n6 @3 e
                    break;
6 B9 F4 {9 S5 ]' B. D- Z% c! C
                case 1:

" \; k  _0 H# @& N+ L
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//

+ N8 M) _1 P1 r$ q/ \
                    break;

/ T% ~1 Q3 z% G5 b% j
                case 2:

$ S& P/ i% n9 S0 W% ?
                    if(Rtc12h == M0P_RTC->CR0_f.AMPM)

+ ]2 q1 t$ T  _! l
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//

  @1 A: l7 n7 V0 U7 v* P/ l  X- I$ P- o1 k
                    else
) V  c3 x: {9 s& w& Q8 ]/ w& ^
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);
) z8 f( T# D  e( O) P- C+ X
                    break;
" Z* T( D/ |, }4 [0 c
                case 3:
9 z# n1 {5 ~+ Z5 x; }; R' l; g
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);
0 N6 E3 `7 r- }. B+ A3 P; N8 u( `
                    break;
( m, F0 |% o& t
                case 4:

9 [+ P0 e; P+ {: E+ u4 e( L
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);

1 t2 D7 U1 s* @1 i$ h
                    u8date[0] = *pu8TimeDate;
) ?  S( \5 U0 x& N
                    break;
5 I2 ]: ?% c- q, G' c
               case 5:

3 j1 i1 D0 U  m& [) Z% _4 Q! c: o
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);

' ^  ?8 f9 o+ R. E5 M8 _! H
                    u8date[1] = *pu8TimeDate;

% P4 q# S" m4 L  {
                    break;
( @. P$ W6 r- V6 b
                case 6:

, ?9 K* a% O) p4 E
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);

8 h* Y! G! W' p6 U3 G
                    u8date[2] = *pu8TimeDate;

1 t' q7 J9 \/ }* M
                    break;

5 b& H) u" F1 M2 a
           }

$ ?$ O+ d# f0 W$ G1 s+ J# X
           pu8TimeDate++;
; z( N  _% m- E2 M7 i/ t0 I
       }

9 {# N( I  O! Y1 ~  m/ ]/ J/ K+ d
       if(enRet!=Ok)
/ P6 }& p- Z4 n3 ^  m" d
       return enRet;

: k, E: ]$ \& `% \8 l+ B, [; X0 e( s) }
       u8i++;
# H* b+ q4 `* B( q' o& _; P
    }
) q) ?$ a5 N" u$ W$ W
     if((u8Mode&0x10)&&(u8Mode&0x20))

$ f6 p  n. |4 Y  Q' d
         {

8 L" Q, j* `% _
                   if(u8Mode&0x40)
/ T* }" Z+ `8 l+ P: l
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));
8 v2 q, ~2 {6 |3 u6 b8 t
                   else
9 p2 ]- H, J# M6 l7 `- C+ }( X
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);

; J# _: Q# {4 I$ C* ]0 y" Z+ B5 @
                   if(u8date[0]>u8mon_max_day)

: g6 v, `, L1 Y/ G
                            returnError;

, i% Z4 b/ z* E$ @' F4 B" G; i
         }
& U3 s  c; s+ Y2 K0 t4 j; L4 ^
         if((u8Mode&0x10)&&(!(u8Mode&0x20)))

5 A" K. i* R' O% H" Q
         {
' y8 C# N+ g/ W4 o, B
                   if(u8date[0]>0x28)

% P, Y, n0 T2 `0 Z
                            returnError;
; L7 N1 c& H# T
         }
' P; @9 p4 w! j. ^- R8 m' ^
   enRet = Ok;

) a  B6 G  Y4 {* W) j* p
         return(enRet);

! s+ H) U. g4 M; U& E" z4 Q. m
}
; H; M/ Q8 h' e' Q7 v. K0 J8 Z
/**

; ]. @# E/ u& `
******************************************************************************

# p1 `$ ~0 t' ?: ]3 k
**\brief  RTC设置时间函数
- l" o9 D; F  s7 g% T
**
9 }3 o& I2 w& d! J& g  b6 L4 n( |
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期
: \* ]/ W+ c% l9 ]
**
+ q  t4 O' F4 M" r$ B
**\retval Ok  设置正常
. c" Z3 D' a1 D1 B2 I7 \
**\retval ErrorTimeout 时间溢出错误

9 N0 n1 s3 @$ J4 g- _) z- D7 c
******************************************************************************/

4 q5 f- @, n1 a' u9 C# M7 ~
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,

% F: Q  Q7 s9 D; \) \0 T
                            boolean_t bUpdateDate)

" Z, @, k+ _7 G# `2 F
{

; v; P9 V" J' j1 q$ R, z6 m8 b! n; j
   int32_t u32TimeOut;
: c5 e6 g2 S, G% [/ w
   u32TimeOut = RTC_TIMEOUT;
/ k4 @) `- [7 w' o
   uint8_t* pu8TimeDate;

1 u( @# H) T( e) G
   en_result_t enRet = Ok;
4 r; ^! Y0 Z9 W% Z2 I
   pu8TimeDate = &pstcTimeDate->u8Second;
" b  _* S0 U/ l% l9 o1 M
   ASSERT(NULL != pstcTimeDate);

& b" w8 m, ?$ D( ]* B8 J7 a
   if(1 == M0P_RTC->CR0_f.START)

0 F/ K1 ?- a1 `! u
    {

4 q0 ^- R, s5 D) h( R% o
        M0P_RTC->CR1_f.WAIT = 1;

! \0 E" K1 p4 j. C( B' S
       while(--u32TimeOut)
0 W0 H' I, i# I/ G
       {
* K$ H9 \# K3 S" l- r' R
           if(M0P_RTC->CR1_f.WAITF)

9 T2 P4 c( c* J8 z4 Y: @
           {
! y2 t% |* ?: B7 ?4 A! q: B! ?
                break;

4 ?  m- T! U) H1 A
           }

- f0 G4 p) Z: R2 i$ a5 Q) {
       }

" ]- v7 M7 S7 @) [  d4 ]
       if(u32TimeOut==0)
7 U% E2 ~2 U) A
       {

5 Q! W# P" O2 @3 X
           return ErrorTimeout;

# J6 A: }. j' T
       }
. i( ?4 a2 F( c. r3 [: T+ r
    }

! k5 g+ q' z! n% |0 w
    if(TRUE == bUpdateTime)

* w1 U; n. o: f" r" k7 P  K
    {
1 P8 I/ `' |1 |& V0 t5 a) }6 \
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);

2 E2 N8 ?7 E  m/ x! S7 ^
       if(enRet != Ok)
) E* U' O4 }8 E) [
           return enRet;
- ~9 m* c, i" [- T' g" L
       M0P_RTC->SEC = pstcTimeDate->u8Second;

8 _% e! c2 e  j' k' K, z+ u* W3 w- S
       M0P_RTC->MIN = pstcTimeDate->u8Minute;

3 P# D, J) ^) r$ z  f4 U) b/ @" J
       M0P_RTC->HOUR = pstcTimeDate->u8Hour;
3 \* @% _5 b( N
    }

" n0 {% {7 p1 ?: O2 S+ I
   if(TRUE == bUpdateDate)

% B. k0 d/ \1 `0 A) ^; p5 K! T
    {
8 o/ W* ]4 _( X( L; K) ~0 P/ F5 R
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);
% a# B5 ]; p% R7 n- B1 ]) x+ [
       if(enRet != Ok)
7 J/ v; ~8 ?( u2 d7 B
           return enRet;

# Q! s8 A6 W- [% \) F+ f# x
       M0P_RTC->DAY = pstcTimeDate->u8Day;

1 E, X( l0 o' j  k( Q  `! t
       M0P_RTC->MON = pstcTimeDate->u8Month;

: U+ _, ~5 w3 x) L! r5 r
       M0P_RTC->YEAR = pstcTimeDate->u8Year;
. x* S8 J" y& y. D$ M/ f; u
       M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;
  f+ V9 C9 h% L5 G# V2 a" N
    }
1 Y$ G$ g; E4 H! k( q
   M0P_RTC->CR1_f.WAIT = 0;
1 A, {' z6 w/ M" X, o
   if(1 == M0P_RTC->CR0_f.START)
$ i* c% a  \' s3 G4 H3 |; ]
       while(M0P_RTC->CR1_f.WAITF);
1 e4 a( z' y! ~; t% V; V; Y
   return enRet;
/ E; `/ S' t* m
}

2 H$ G+ }( e) l2 X
/**
. d2 D' g5 q. W) u) m% X
******************************************************************************

, b6 p/ g% f7 R4 h5 d
**\brief  RTC获取时间函数
' y) Q% x$ T( i8 r" _7 u
**
  ^9 i8 R% O+ J- a& q
**\param [in] pstcTimeDate日期时间数据
$ K3 k1 f; H7 r
**
! @2 A( u; N" }2 A/ F  }
**\retval Ok  获取正常
% L1 v- B6 H* M1 m, `
**\retval ErrorTimeout 时间溢出错误

! w; t6 y  A' E, _# a
******************************************************************************/

7 U5 ~2 C8 D9 x* [% u
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)
' L+ f! T8 E* u
{
+ B8 I8 x: t: e& y/ y  a
   uint32_t u32TimeOut;

7 M2 o- d8 @3 I1 Z. ?
   uint8_t  u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;

) B+ c( Q8 O+ x8 \
% v( [+ q; U6 U- I
   ASSERT(NULL != pstcTimeDate);  

/ Z) G- t( H* f4 V( T; e# i
   u32TimeOut = RTC_TIMEOUT;

/ ?) G4 P, V* i8 [7 f4 W
   if(1 == M0P_RTC->CR0_f.START)
' n) T$ _& M& P
    {

8 P% E2 |- L6 e# E7 L
       M0P_RTC->CR1_f.WAIT = 1;
$ p; D. f) y3 K4 |' u! a0 c
       while(u32TimeOut--)

/ ^7 |' V- {9 e7 k; A5 o
       {
# d8 Q/ q# O' q" k
           if(M0P_RTC->CR1_f.WAITF)
% @5 H7 v5 g5 E# z
           {

) U! L- ]0 o/ Y. _
           break;

4 h$ Y' b) B# q- U
           }

1 N$ h0 H: t) B' _9 S
       }

: L* E! ^; a+ F2 d
       if(u32TimeOut==0)

& R) s- S, D3 _$ `+ u
       {
& J' K/ R9 F7 k2 j7 A0 H  u. I
           return ErrorTimeout;

# {/ k- A: U0 t# @- J
       }

, S- g$ |! g) Y! K. o" j1 f+ @
    }

3 `( h# L0 D) D6 F
   u8BcdSec  = M0P_RTC->SEC;
4 g( r$ y- D( E# t, @
   u8BcdMin  = M0P_RTC->MIN;

' d. M8 h3 X( M' T, ~
   u8BcdHour = M0P_RTC->HOUR;

& ]1 K% O8 O' p3 d# i
   u8Day     = M0P_RTC->DAY;

# P# e; ]4 O* i
   u8Month   = M0P_RTC->MON;
- V' ~  ]4 Q3 v( r  V3 S: [
   u8Year    = M0P_RTC->YEAR;
# j9 K  o& R& {
   u8DayOfWeek = M0P_RTC->WEEK;

- {4 E9 k* z- H5 ]+ Y0 Y  S

- P* @5 j$ T" y6 D+ \( |6 a
   pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);
9 ~" s9 Q2 q! b0 r1 t
   pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);
" n" K, x' Z. C* z8 e! }% d# w0 }
   pstcTimeDate->u8Hour   =u8BcdHour;//BcdToDec(u8BcdHour);
8 h* S; s) ?9 |- k4 R2 d6 Z0 B" d- q
   pstcTimeDate->u8Day    =u8Day;//BcdToDec(u8Day);

  l; `2 j# o4 m( W- {1 U* j" k
   pstcTimeDate->u8Month  =u8Month;//BcdToDec(u8Month);

" C( ~9 G1 Q, m; t, x. x
   pstcTimeDate->u8Year  =u8Year;//BcdToDec(u8Year);

$ {1 S% x0 U4 [, e0 d* u$ ~8 x  ^
   pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);
# {( {2 K) w7 w: M. M8 @* U; |- J( r
   M0P_RTC->CR1_f.WAIT = 0;
0 g! C7 a/ D7 H3 A4 C3 U* B! @
   if(1 == M0P_RTC->CR0_f.START)
7 f# X! P1 a5 j$ I% m- |
       while(M0P_RTC->CR1_f.WAITF);
; Q  v: y* o* o- M; h9 }' i7 i
   return Ok;

$ Q* X! b7 O" P. x0 S1 U( q
}
2 o2 k5 ^" i: {2 z2 c# \0 }$ ]3 I
/**

3 t- l: i5 W' S, U) _: h0 l
******************************************************************************

5 F8 D! ~& W8 C
**\brief  RTC计数or读写状态获取
' m% e3 z+ s0 Y& @
**
. e  @* A! ?+ d% c. ^
**\param [in]
2 V7 S) B& O+ ]: S
**

/ z* Z6 @. @) ]5 i+ C7 b! \
**\retval 计数or读写状态

( K1 _2 d8 x9 u' s! y
**

; c' T3 t  {/ s# S3 u/ e5 j6 d6 K
******************************************************************************/
) P8 q3 `. ~) A& k% c0 @6 T+ m
boolean_t Rtc_RDStatus(void)
8 G1 l/ [: H& a- P$ |
{
: ~# @' V: O/ J8 L# D
   boolean_t bRet;
; h- G3 l+ y2 }2 O) C0 F% A+ H
   bRet = M0P_RTC->CR1_f.WAITF;
1 X$ V6 O* O1 j
   return bRet;
+ f; g0 `7 `, W# w3 Y
}
& z& B8 ]/ Q  f, s9 j
/**
. Z. }3 }8 W* D8 V; M
******************************************************************************
* }9 N% c! n  h& a+ a) v! @! y) e2 n
**\brief  RTC闹钟中断使能
' {9 g9 B* H. n2 U- [
**

/ ~1 N) r- B& _- F0 d
**\param [in] enordis中断使能or禁止
* n- u, _" d# c  L) Y% l
**

& @" D. [6 p1 Y3 q% w+ Y, B* G
**\retval Ok设置成功

! Z) g; J& T) I$ x
**
+ z* f. v' I" v7 k) d
******************************************************************************/
8 K. @7 R" m( S$ A
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)

2 C9 [! w6 P- E4 {( C* m2 h7 K
{

! c6 ?+ s) U: O0 X* x  W
   en_result_t enRet = Error;
" a, m. s1 n" E& |- J: N
   M0P_RTC->CR1_f.ALMIE = enIrqEn;

: u" h7 J  d. A5 y. \' N- a
   Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记
8 t+ E* ^3 ^3 f/ |- c
   enRet = Ok;

0 ^4 q4 Q" {1 ~# X
   return enRet;
! z5 O- I, N( z3 h% b$ |
}
2 W; ~7 T: _0 p$ G8 h' F3 Z6 @
/**

0 A9 P$ W2 |4 c; ?$ ]
******************************************************************************
" f; `7 Y( }* p9 d7 G- k/ P
**\brief  RTC中断请求状态获取

! y; g0 B) w& y3 n% N* I+ I# ]* I3 z
**

- g+ A* Z  W  h  y" ^$ g( P
**\param [in] enIrqSel获取哪种中断请求
1 u* N) V+ |$ N: g8 G
**
% Y0 v) H  _; k. k) j0 L
**\retval 中断请求状态

/ H) l3 C+ P4 }: g+ H
**

( |$ w+ ]8 d/ u
******************************************************************************/
5 Q, ?, G5 [( c) ?' F2 V  R% n
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)

% e- I& Z% {5 [9 v
{

' F9 w% W5 u& d$ {/ t; b8 A/ w" c% V
   boolean_t bRet = FALSE;
' I) U; B+ c, [# C$ t' T: }
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));

* p/ S7 O* O6 P1 a. U6 h
   switch(enIrqSel)

/ _1 x8 [( [. n7 Y4 A$ p# x
    {

; X- B) u3 c+ x5 [: Z9 ?9 E
       case RtcPrdf:

- _$ Y0 n* B* a: g' A) @+ f
           (M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);
4 z# T+ K! ?! l* Z& J, W
           break;

9 q/ q; J9 h- x( H1 y2 p  |
       case RtcAlmf :
+ n0 n! d6 J! w4 J( ~" q
           (M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);

8 T- h+ Q  ?8 A0 a6 ?
           break;

+ l. z3 l" `% n6 u$ j+ I
       default:
3 R( i- M0 I- J& o; d5 ]
           break;
2 o) R) V: ~* B6 u4 p0 f
    }

; e) ]$ Z5 S6 E1 r+ H+ w
   return bRet;
! r0 z, [- a7 x
}

! {& r& U$ }) x7 J6 y
/**

& K* Q: J( ?$ ?0 b) x$ w
******************************************************************************

! l. R( r+ I! T/ ^" r
**\brief  RTC中断请求清除

. A- b: }0 x6 r2 O
**

% m# C/ d( \, o# a
**\param [in] enIrqSel清除哪种中断请求
7 i5 {( C2 ]  B5 Z. }" p" B
**
( i7 ]  d" N1 m, D3 @% ^
**\retval Ok 清除成功

% a2 h# I8 H# e
**\retval ErrorInvalidParameter 清除失败

3 {. q; H* x" W  s2 L
******************************************************************************/

0 Z% T! x6 v2 u9 E" d. K
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)

4 Y* S7 ]" P% s, Q: c
{
: r- _8 Z! f5 c5 Y
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));

4 v* X/ ?. ~  s0 E' q# ?' N
   switch(enIrqSel)

, |! t6 h# X" s. _; ?- @
    {
* v5 x# |4 ]& z+ g0 `) N8 Z
       case RtcPrdf:

) \) t" w% J4 |9 Z$ K1 J
           M0P_RTC->CR1_f.PRDF = 0;

4 U, p5 n8 C% A& @( s1 A3 K
           break;

* z! c$ U  M2 U3 M
       case  RtcAlmf:
/ `* G$ M# J7 O: s4 ?
           M0P_RTC->CR1_f.ALMF = 0;

. u4 ^; P" W/ S7 ?" z
           break;

5 u& S4 G" `: }. b  ]1 p4 L  O
       default:
2 {+ x( {% Y9 f6 I4 h/ `
           return ErrorInvalidParameter;
+ q. b( @. G2 s* a3 w$ Y; o
    }

7 k; |8 W2 t. t" r; g/ W
   return Ok;

2 r8 I' d( _# f
}

+ E$ D% e, M2 ~
9 i  ~7 J  Y* A
/**
  L# c7 W1 u3 h+ `2 @
******************************************************************************

9 K1 J7 N% W2 Q4 O5 _
**\brief  RTC中断处理函数接口获取
0 t9 h' G) j5 u6 Z( s
**

& z4 q) T7 p% [/ O) ?
**\param [in]
7 k# e3 j4 x8 e8 ~! m$ m  D0 L. ?
**
% `4 W" g: a3 O5 H5 m! K( h( ]
**\retval 接口函数地址

5 t0 Y, e/ `) r  H5 z
**
, v3 F' k  C6 z7 x% p( X
******************************************************************************/
% O/ x. G% D# H8 X$ j, A, w7 u, K
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)

$ `/ V" R% [3 v* Q" n5 P
{

  s; B7 d1 j/ W0 t& I, \- e
   return &stcRtcIrqCb;

0 _% T) U) P. k
}
# V) a- Q! K& {! L/ R( R, s& a
/**

. Y5 B& ^4 d  k' V% R5 }1 u+ W
******************************************************************************

  `3 |/ o4 ?- b. H4 |
**\brief  RTC总体初始化函数

2 D3 g5 R9 F; f3 c% G+ |" y, P
**
) M( K' N' y0 b9 |) e
**\param [in] pstcRtcConfig初始化结构

' }$ T2 V- e, c8 i9 F$ o3 C
**
! G5 T% l+ \% P) b" ~7 N
**\retval Ok初始化成功
' ^5 |* s" m* o" a
**\retval ErrorInvalidParameter 初始化错误

3 ?+ @' T" `& y$ b' ^3 ~* g) u
******************************************************************************/

' R1 H' }7 N9 G" O
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)
9 Z. C  [7 @; O# S: ^; Q/ E9 X
{

. C; X6 X9 N* a- y, M; B; ~
   en_result_t enRet = Error;

4 n: ~; ?' G  c. g/ h( I" R- ?
   stc_rtc_intern_cb_t* pstcRtcInternCb;

7 R; T' {( l* F& l6 @- q
   if(NULL == pstcRtcConfig)
, O4 U! P: O* k3 I! g" W6 H" j2 `& @) D! N
     return Error;

  [5 r8 d) V, |' ~7 c
   pstcRtcInternCb = RtcGetInternDataCb();

& Z. m1 q/ n9 `1 [( Y! _
   enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);

9 }  Z9 n. F. U$ f" h2 q
   enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);

* A, l) ^9 ^# ^2 }; t8 \: K9 Y
   if(enRet != Ok)
6 ^1 N0 N: _: x
    {

- `* O5 S9 A3 J/ `- p
     return enRet;

5 H+ V  {3 T  e  X+ Q/ S, Z" e# \" X
    }

$ x' R0 \+ Q! P3 N9 L0 t
   if(NULL != pstcRtcConfig->pstcCycSel)

) n0 P+ R6 D1 i6 U
    {

% I, I6 G( X+ t6 l0 g; t
       if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))
- U+ y$ p6 Y) d: o! }
           return Error;        

& g, ]6 h; k- ^5 M
    }

6 [$ a$ ~& N% W+ m6 q* u. b
   if(NULL != pstcRtcConfig->pstcTimeDate)
% a- {  I- n3 s1 F" P/ F  X
    {

* x  H! m" d. k4 F7 J9 P  n( t
       if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))

. O0 G2 d- J% t1 Y( N
           return Error;

1 I  M6 q  }& n9 N& \
    }
) _3 N6 G3 w& C8 }  b
   if(NULL != pstcRtcConfig->pstcIrqCb)

$ `2 I5 W8 }7 L  |& S) O  _/ I
    {

8 F0 h% f+ b" k/ K( c; {, O. J
       pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;
% S. \0 Y) D: S0 P4 l: f. P
       pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;
  V, n+ p4 @3 L
    }
- T6 [/ _6 b& K$ v5 {  R( p
   if(TRUE == pstcRtcConfig->bTouchNvic)

& p: N! X9 a2 Q4 m# q
    {
! S. D4 \) c) ]7 L
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);

( z; T3 ~, s" u" e4 D  o
    }

9 G% a8 O5 M  {4 J- ^3 ^
   else
, {5 _$ e0 S( a$ W, {! K: L$ O
    {
- k7 q. v# \. i" d' G. Q6 {3 f
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);

; m5 ]$ s6 Q7 }3 v8 N$ o' r' T! z
    }

* x; g" E% A5 ^- i: _
   return enRet;

3 B: k# ?( [7 k0 ]6 q+ P
}
' l9 |1 {5 p! p7 D, T: E0 t& J
/**

; y- ~" W1 j' @' H8 r' Q' U; x
******************************************************************************
& m  C2 q6 z. c  J4 s( r+ S
**\brief  RTC计数禁止函数

% D, _3 `, m7 R, B: ^6 _( J3 f8 `
**

6 M1 {& |# P5 }& i) q
**\param [in]
( ]) k5 p, W3 T$ k- v% A% r! _
**
3 @# P1 w. R/ t7 k' y- ?/ l7 ?
**\retval Ok禁止设置成功

. h) T( o: `: @$ m8 n
**
: v: Z: @; v9 @0 Z
******************************************************************************/
+ P6 i- x9 I4 `" s5 J6 i3 m1 d
en_result_t Rtc_DeInit(void)
& |7 `( P  z% p" T+ ]* j# Y& W
{

4 s" L! i# V( n9 t0 F7 ?$ x# P7 V
   EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
6 s( N" d: |$ g) u, P
   Rtc_DisableFunc(RtcCount);

2 E. @2 q3 R, z: c5 I5 I" ?
   Rtc_DisableFunc(RtcAlarmEn);
4 m* O  `) Q& S
   Rtc_DisableFunc(Rtc_ComenEn);

2 k# J1 L; K- |! d& [
   Rtc_DisableFunc(Rtc1HzOutEn);
% a9 B; T1 H# C! ~# h* \
   return Ok;
6 e- w) @4 C. |# I
}
# c) s5 C1 d. _% L6 b$ F
/**

, u5 Z, g4 z) U5 [# V" j. ^- l
******************************************************************************

+ J% g( k, S# `) R
**\brief  RTC中断处理函数
: z8 Q, Q! Y  W9 ^, }/ C  g$ I1 c
**
0 k; |3 O! X+ G5 ?) A
**\param [in]

, p, Z# j; T' E6 t* s
**
3 t: W& O' ~2 c5 F1 L
**\retval

2 s5 w, x: P: `- H) q
**

  N, @, B, B- y, v  H, P. g
******************************************************************************/
9 N# }* i! Y) F& ?* p
void Rtc_IRQHandler(void)

' T) p; x8 W  z, T+ |* w
{
0 A) l# L7 _$ z7 |3 |  K
   stc_rtc_intern_cb_t* pstcRtcInternCb;
4 ^7 N# [$ K7 U3 {8 V* u
   pstcRtcInternCb = RtcGetInternDataCb() ;
; ]5 O; I+ U; z; c  B  J$ U/ h
   if(TRUE == M0P_RTC->CR1_f.ALMF)

: W' X: X( H: z0 H6 W# i& I, Z# @
    {

2 e2 u& X* p/ }  i3 k# Q
       M0P_RTC->CR1_f.ALMF = 0u;
  D; [& V$ W; c6 S6 S4 K
       if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)
+ {4 O) X" Y" ^7 b/ X1 y6 j) ?
       {

# z# W% K4 `' H; ^/ z
           pstcRtcInternCb->pfnAlarmIrqCb();
, l6 t7 I# W: ?9 ]
       }
/ z( B; T, B) K) Z
    }

" `; a/ O1 l! `4 k4 o
   if(TRUE == M0P_RTC->CR1_f.PRDF)
" A" T4 O/ M9 D$ j
    {
1 Y7 S( l' z: E$ X4 h( |
       M0P_RTC->CR1_f.PRDF = 0;

& X# @- C1 O  e; J3 c+ U
       if(NULL != pstcRtcInternCb->pfnTimerIrqCb)

( `% y% f: w# {4 Y- O
       {
$ g! ]8 G6 ]2 _5 E2 K
           pstcRtcInternCb->pfnTimerIrqCb();

/ y5 i: U7 g2 p) y: Y5 W
       }
0 u! ]' r7 E! n) L4 y. o' ]' T
    }
1 n) J2 I  c: U+ k$ e8 z5 m1 G. `
}

+ ?8 \5 k4 b8 `# p

$ J, r6 P1 R0 d! W+ C
& U* u6 s% y# ~  F0 R# X' y3 i
static void RtcCycCb(void)
  J2 E  y, ^1 h. Z( j+ N/ x  Q
{

' r1 a" D- R+ [
   cyccnt++;

/ R$ c: q8 s  ]5 A4 B$ Z
   flg = ~flg;
" M% r' L9 M# B2 I
   Gpio_SetIO(3,3,flg);

7 y" b6 ^" w3 Q
}

& t9 f0 L' n- g+ _3 q
static void RtcAlarmCb(void)

6 y* h2 s% e, [; t
{
9 M9 W- M4 w9 Y
u8Alarmcnt++;

) H. h; D8 H* V, L+ ^
}
2 T9 Q! Y2 U0 o* k# G
int32_t main(void)

" C6 R( f0 y  q) D$ b9 o# D
{
6 x0 _7 c) `. A1 Q0 o
   stc_rtc_config_t stcRtcConfig;

9 g' n9 o# L7 s+ k" T; X
   stc_rtc_irq_cb_t stcIrqCb;
5 Z( y% x8 p9 \$ F$ J
   stc_rtc_time_t  stcTime;

7 g) h, n9 K- G: y( G5 [2 Y1 o/ g: l& E  G
   stc_rtc_alarmset_t stcAlarm;
( O1 G8 H7 Z; w2 g* i, G
   stc_rtc_cyc_sel_t   stcCycSel;

8 Z8 x- U- H& ^
   DDL_ZERO_STRUCT(stcRtcConfig);

' y+ P! r1 d! W" ^+ X$ R/ y) q
   DDL_ZERO_STRUCT(stcIrqCb);

# o4 b! w: K5 B; y1 G
   DDL_ZERO_STRUCT(stcAlarm);

5 \/ B2 I6 C: n+ b1 L
   DDL_ZERO_STRUCT(stcTime);

" X. r$ v+ e5 k# m
   DDL_ZERO_STRUCT(stcCycSel);
, S$ k$ U( _8 }5 R. o: H& F
   

0 y) N  j3 f+ U
   Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟
6 j. W( l  _+ v- t
   

: C7 @" G- i3 @; @! d$ _' u- ~
   
/ _7 n: Q, Z( y. C4 z: D9 r
   Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口
5 k- _$ ~& f6 S6 @
    Gpio_SetAnalog(1,5,1);
8 y# {/ I" G+ v  n) }; }' H
   Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768   

' R1 P0 @& G1 H% A. F$ |
   //Clk_Enable(ClkRCL, TRUE);
) A" Z% q$ b. {1 s( G: J; o. c. Q5 D
   //Clk_Enable(ClkXTH, TRUE);
- I0 r& @7 D# o1 ^9 U4 t+ _1 n9 C
   Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟

1 _7 U  D3 g$ a
   
. a% @3 m9 J& j$ D8 Z* t  B
   stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//

- Q. U+ o, N: a# X- T9 Y2 q
   stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//
, D- D$ ?9 y# x( E9 S9 J& }
     

3 b2 r" y+ {0 b" E
   stcTime.u8Year = 0x17;
  S; i' ?  a9 _4 c% p- A1 q
   stcTime.u8Month = 0x06;

4 ^3 U) n. Q" q) m. i+ q3 ^( C" M
   stcTime.u8Day = 0x07;

+ \0 u: v! q3 O
   stcTime.u8Hour = 0x12;
6 O, z" _/ K  M% w1 V
   stcTime.u8Minute = 0x59;
( M! A; ]8 X- I, h7 b8 Y
   stcTime.u8Second = 0x59;

( Z) J4 }: s" L: o+ ?& m: r
   stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
; j3 i! V# M9 }
   stcRtcConfig.pstcTimeDate = &stcTime;

0 G. Y5 T* `0 I; ~# Q6 I
   
5 F5 {% G( F1 B; c% p% f
   stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;

3 ^" T* t& _: _" s9 Q
   stcIrqCb.pfnTimerIrqCb = RtcCycCb;
4 B! Y! o, T3 L- x* H0 }8 n  K
   stcRtcConfig.pstcIrqCb = &stcIrqCb;
; {6 |" Z0 y: ], B& S
   stcRtcConfig.bTouchNvic = FALSE;

! m' e( B( v+ D2 t7 y
   
2 G( P( J2 y5 Q8 {3 V6 `9 h
   Rtc_DisableFunc(RtcCount);

4 v) Y# F, |# S  v0 e, R8 w# h3 t
   Rtc_Init(&stcRtcConfig);
! ?. L, d. l- m  Z, c
* A0 A/ |# a5 U5 ^1 _
   

1 t7 C- |0 x0 \/ a" f
   Rtc_EnableFunc(RtcCount);
; C0 z! f0 \2 H- ]7 G5 B
   Rtc_ReadDateTime(&stcReadTime);
6 ?5 X, @3 {% b+ w! p% c& Q
   while (1);

# n( {: t6 I, H
2 A( Y% G# T/ i% H  z' J. A. I
}
9 A) P0 g0 Y$ m0 q: U( W/ g
- L1 w/ u$ f, y1 ?. l
/******************************************************************************
0 O8 B" W) ?) E
*EOF (not truncated)
( u2 x* f, ^  j  y
******************************************************************************/
7 N* q5 m" n# r4 `

: g$ Q  l$ O/ s




欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) Powered by Discuz! X3.2