找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 49|回复: 0
打印 上一主题 下一主题

华大M0+低功耗MCU RTC模块示例程序

[复制链接]

4

主题

4

帖子

60

积分

二级会员(20)

Rank: 2Rank: 2

积分
60
跳转到指定楼层
1#
发表于 2018-2-9 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
; |; B5 o4 ~& M9 J+ @* j/ [# D& O8 |
/************************************************************/
" u, ~7 a8 U2 s- {
/*******                 样例使用说明           *************/

1 g, S) U0 c" ^7 b: X# [4 Z
/*******                    版本历史            ************/
; Z' X: d1 E" ?- @3 p4 K. i4 N: I
/*******  日期       版本    负责人  IAR   MDK ***********/  

3 O, d+ g' f- }* ]
/*****    017-07-14     0.1     CJ    7.70    5.14 **********/
0 u; G# k% F2 c( j& Y
/*******  QQ:3386208645                       ************/
2 j/ x# Z- w& e1 h; s4 Q  ?
8 I/ D7 Z+ W' y& ^" O- n# D
/*******               功能描述                  ***********/

3 E: [2 O; @  S4 g. x5 \
/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/

! A; d. c8 y6 x8 C( ~8 T$ n$ }
/*说明:                                       *************/
7 [2 o' B2 ?5 ~3 A& R- n
/*计数初值写入计数寄存器                       *************/
. |& \5 E- u: q- R! r
/*启动计数                                    *************/

' P( I) @; V/ @
/*读取计数寄存器数值                           *************/
: u3 N6 x# o6 Q8 Q( |" }$ e2 _% g
/******* 测试环境                              *************/

& R3 N2 r, t) P9 L6 D
/*     测试用板:                              *************/

7 N# ?; v: d/ X* N- _
/* SK-L110-TSSOP20 V10                        *************/
( W8 [- Z9 l2 d3 K2 }
/*******辅助工具:                              ************/
/ O8 k5 _: J9 P  l/ z5 i
/*  JLINK调试工具                           *************/
3 q7 N+ H( ^/ Z* M9 D% z2 Q; c
/************************************************************/

7 I8 G* G+ C8 d4 {! `7 e2 G
#define IS_VALID_CLK(x)             (RtcClk32768 == (x)||\
! F1 j4 G. x/ I, D
                                    RtcClk32768_1== (x)||\
+ O6 S/ F/ o8 |  l6 z" V" V7 x
                                     RtcClk32== (x)||\

- ]) {6 m  y; _' C3 N! ~% o
                                     RtcClk32_1== (x)||\
. b% [& m# b! |0 z# J
                                    RtcClkHxt128 ==(x)||\

4 a3 E$ |3 I( `: i
                                    RtcClkHxt256 == (x)||\

# V, G3 E9 U; S+ @
                                    RtcClkHxt512 == (x)||\
9 Y6 C# r% K1 ]5 r/ X9 ]6 a
                                    RtcClkHxt1024 == (x))

% v4 u; O( X  H( _
* U9 r$ k7 S: l' E
#define IS_VALID_CYCSEL(x)             (RtcPrads == (x)||\
7 F$ K) E9 m3 u+ X
                                 RtcPradx==(x))

: S+ i$ g  W- @# h0 G+ H

6 a8 y. l( X3 M) d4 `
#define IS_VALID_PRDS(x)        (Rtc_None == (x)||\
- E2 A4 r# n4 e7 M, ?
                              Rtc_05S == (x)||\
, P/ a1 O! E0 n" x* X
                              Rtc_1S == (x)||\

; X5 r2 N5 I/ z& J
                              Rtc_1Min == (x)||\

0 i1 z8 v" C: c: I3 F
                              Rtc_1H == (x)||\

, o6 z. B5 i: g0 }8 q0 `
                              Rtc_1Day ==(x)||\

: A2 \* j, n/ L) V' E9 |
                              Rtc_1Mon ==(x)||\
3 T* `0 @5 A+ |, s6 F
                              Rtc_1Mon_1 ==(x))  

* J. b' L5 g0 n2 P; g  L) h2 O, ^
  n% ?, X+ g4 F1 A% ^
#define    IS_VALID_IRQ_SEL(x)      (RtcPrdf== (x) ||\
* [. k: p" U5 y7 _
                                      RtcAlmf== (x))

0 y) h3 c+ K+ H; L. h1 |) c
2 Z6 D' x; e+ V* Y9 |; R/ E
#define    IS_VALID_FUNC(x) ((RtcCount<=(x))&&\

6 r! c( q; H$ q  ?9 i
                              (Rtc1HzOutEn>=(x)))

7 F, ^. I% @+ X! J6 F5 Y( J4 o
#define    CkDateTime    0x7F

: Q* t, o4 J2 t6 o3 |
#define    CkDate        0x78

) |; E4 S! ~& b( U: T8 b
#define    CkTime        0x07
6 }2 X5 R6 @6 q' n
#define RTC_TIMEOUT             1000//test 1s
8 z: }' [: i4 o
#define    T1_PORT                 (3)
  ^) n  M; a$ P" Y2 f9 t
#define    T1_PIN                  (3)

/ f  j( t! @# H4 ?' k0 b2 Q
uint8_t cyccnt=0;
0 c2 P# T7 `2 o7 N1 A3 C/ _  q
uint8_t u8Alarmcnt=0;

  x. z0 D! e3 `5 \- ~
uint8_t flg=0;

! d( y! }) A1 I! q9 m
stc_rtc_time_t  stcReadTime;
+ K+ C" k1 x# H6 E# B$ t

! ]+ W# m$ F1 r; [) w* a
/********************************************************************************** \brief  RTC计数时钟选择
1 Q8 h. Q: H& r/ h$ g5 Q4 u7 B
** ** \param [in] enClk时钟源
. _, M+ @' @" ?: P8 U  f
** ** \retval Ok
  Y  u5 U1 j: f1 D$ R
******************************************************************************/

& y5 V3 _/ ]$ w6 g7 D
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)
0 d4 V1 q% L+ q) V
{
+ K. o) X- ^7 N
   en_result_t enRet = Error;

, D* [8 b: C( ^7 K- t8 ^: c7 n' {
    ASSERT(IS_VALID_CLK(enClk));
0 F2 a! t% @/ }
   M0P_RTC->CR1_f.CKSEL = enClk;
2 p9 j* v5 F. b  c( ?% _" m
   enRet = Ok;
0 n7 e- }" @; j% Y+ L  a& V
   return enRet;
: m5 D  l! }6 `, ^7 X: Q
}
2 t2 f! G( K: J6 ]* R
/**

$ D* U/ L) \) L0 E/ E- q; k+ j- q  S
******************************************************************************
: |' W8 \3 V4 v9 H- {- w
**\brief  RTC周期中断方式选择
) Y' g# Z1 f3 _5 |6 |2 |+ M
**
! E- j2 ~2 q! I: y$ o
**\param [in] pstccCyc周期中断方式及周期间隔选择
* V8 \0 |/ C; E& `- I
**

, a! T6 c9 \) r0 q. t/ J5 Y: b$ g
**\retval Ok

, ]- B8 z2 W2 h/ @- e* W: m7 e1 M
**

8 Z4 t" i3 u* X' f+ A
******************************************************************************/
$ v2 I% Z3 F) a2 j( Z. o* H3 }2 n
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)
1 ^0 N' c3 _: \2 C* h( \3 R% K
{

8 Z/ |/ h7 i; S1 u+ }1 u' N
   en_result_t enRet = Error;

0 \( _- @& v6 }! C
         ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));
0 ?5 r. h% Y, j
         ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));
6 P- q' O) S4 m8 d# f
         M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;

2 R" n  E5 ?0 K; Q3 f: L- s0 a
         if(pstcCyc->enCyc_sel)
7 U: y7 Q7 b: S5 ?3 m
    {

" _! r6 B2 l" c3 |
       M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;

, A9 e, {7 q+ C: T7 M* O
    }
0 H) [3 ^" |! _% W& Z2 Z
         else
7 V0 G% B7 K3 O
    {

6 D0 \7 T# L# B  }1 k# d0 s
                   M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;

, l1 b; t9 P$ W) M
    }

" `: j9 `. ^5 q  m9 @
   enRet = Ok;

8 i9 Q2 J! B+ {+ p( x
         returnenRet;

' c! {# o1 |( f- n# _
}

0 |2 T, u. n) P% ]# R. X, M# ]# w
/**
; j6 S: D7 Y5 Q# t$ ~0 G; y5 ?; T
******************************************************************************

4 ~- F9 ~  `  H- T' k+ V
**\brief  RTC时制选择
$ ~0 L. w& Y* {
**
: a. l' Z' e" @4 h( P  S; h
**\param [in] bmode12时制or24时制
" \! E5 s5 K, q  J; g) n8 Q
**

# @* E# V8 k$ l" A; W9 U/ t
**\retval Ok  设置正常
/ s" V$ `3 T$ {3 A
**\retval ErrorInvalidParameter 设置异常

! b) J& q9 A; \$ v$ ~9 \
******************************************************************************/
+ d/ @# d% ]8 ]9 K$ Z  o/ p; F
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)

0 Z/ H+ M6 D: _0 O4 N7 p) Z
{
% p9 O1 m1 A0 l3 \
   en_result_t enRet = Error;
# u& `  ~3 J. X
   switch(enMode)
! _- j5 @' s' y# Z% ]6 y3 ?: D
    {

7 M3 w! N1 M$ q' `% l! I! O
       case 0:

1 W# O' K8 t- X- G7 ^
       case 1:
( Y) J+ q6 c) [4 S) z
           M0P_RTC->CR0_f.AMPM = enMode;
' h- y0 A2 B+ i; C
           break;
* w6 T  A* P6 x. k0 ^" H
       default:
2 f' v( J2 M1 x2 ?
           return ErrorInvalidParameter;
# G, w% l2 Q% s- e$ w0 a
    }

+ U) F* z$ a* `
   enRet = Ok;
' d6 d4 {! t. a
   return enRet;
" u, V8 t5 H% Z$ J2 u
}

" w3 L% Y) S  b# j! v! Q# |
/**
; s3 U( V3 a, [( M+ H8 r' h* W
******************************************************************************
2 {- H% V; D3 o7 v1 q) c
**\brief  RTC闹钟中断设置
; n1 U  ]& }3 X. c$ E
**

9 o% ], K" S2 [. p* O: e/ O; @7 P$ O
**\param [in] pstcAlarmTime闹钟时间时、分、周

3 I3 a& i  U; J2 U. m
**

! W& F- T6 a) \" n* R) p( _8 _
**\retval Ok  设置正常

7 S* G: P7 v( z4 p3 q' }8 @( L* T
**
- j% X. i. K8 F! ?6 w% D0 R
******************************************************************************/

) L& X8 q; F. x4 X; N7 c; T
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
% z; O6 l& l6 `* U) K
{

6 T1 Q! t# f+ k; P' I5 C
   en_result_t enRet = Ok;

/ g; h, W' e, `
   ASSERT(NULL != pstcAlarmTime);
( b7 b. N! V4 Q5 m7 \3 p$ t! M
   if(Rtc12h == M0P_RTC->CR0_f.AMPM)

/ y% X% i. w0 w* @; U8 E+ h3 c
    {
8 O$ f+ @: |7 g, _! G
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);

& n, Q' y+ ~$ r: H
    }

* U! ~* Z+ k9 j- K1 T
   else

  R" [" D9 Z  K2 ^2 D, ]
    {

4 l0 Q9 @8 M8 }! O, H4 r4 t. G
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);

1 n' W: E" ]  G# G2 y* c" m2 `
    }
7 ?2 l0 O" w# P+ m. B* E
    if(enRet != Ok)

: Y7 {( k+ }$ ?  ^
       return enRet;

+ Y; v% g  M( i4 c/ G2 X; Y
   enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);

8 D/ t1 A# ~1 x% r; [; b
   if(enRet != Ok)

. F/ i2 R4 W' J6 x5 N
       return enRet;
' O  d0 y: u# g
   //enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);
( m6 c2 x/ c3 Z0 I8 v9 S4 y
   if(enRet != Ok)

  }: A! L+ g, e) N2 h  f: s: X
       return enRet;   

: m) e" N5 k, I% u; E8 z' v! u
   M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;
0 O3 \: Y$ d+ s4 V0 S- I
   M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;
4 K; m+ E! w2 E1 Q* C; R4 D
   M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;

' B: z+ P% }5 U3 V- r0 W, Y
   enRet = Ok;
" a( R0 W. S' g8 v6 W9 }
   return enRet;

! f4 y5 S' k' L) _/ f  L7 t
}

- k% a3 ~; Q0 d1 q& m: D
/**

5 J" ]7 W1 G! g* V( w0 E+ C
******************************************************************************

7 }4 e( y4 j# ]: X' x
**\brief  RTC闹钟中断时间获取

1 F" ?$ E* P% u, Y
**
& s: J% _) ?1 H
**\param [in] pstcAlarmTime闹钟时间时、分、周

9 u% ]  e) W, H/ F
**

# w& ?( L) c. H: {  g5 s  a& t$ J
**\retval Ok  设置正常

, t( a$ I% o) W# d
**

# H3 _) B# M* H4 x2 d6 @
******************************************************************************/

4 T9 w" L8 _$ H4 G9 a
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

6 H, A% u; O$ l0 ?4 @) R! b% g$ ?
{
: w! [9 Q2 J1 r/ ~
   en_result_t enRet = Error;
4 E1 ]6 h# ?% Q2 K! k
   ASSERT(NULL != pstcAlarmTime);

& l  [6 ~( A6 w2 e+ U
   pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;

) M# C1 d/ S9 q) N4 b# @0 r+ K
   pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;
7 h. P5 v& |8 L$ K8 u& k4 }
   pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;
3 u; Y" K- `8 l( x9 Z  S$ Y
   enRet = Ok;
0 l; X2 `8 H, n# r3 h$ ^2 J
   return enRet;
6 n6 b+ ]! J$ Z( a9 p
}

0 h& W: _/ K. W6 f, [3 B
/**

4 @% s3 F( m5 v' s% Z; K
******************************************************************************

' v  m! s) X$ L
**\brief  RTC 1hz模式选择
( {) w# B' B7 k# j
**

2 Q  ^# c& _; P  H
**\param [in] bmode 高精度和普通精度

% D0 `0 c. F# P0 w- d
**

4 j( U+ @' q8 M$ V6 }$ f! u
**\retval Ok  设置正常

0 _* x( V* P$ F
**
0 G2 ~; F; R+ b! }5 o( \" W. }& t
******************************************************************************/

* B! ?$ X/ p# ?  j# v
en_result_t Rtc_Set1HzMode(boolean_t bMode)

" n  z9 x, \6 y
{

# ~' Q, t# c* X( i' d0 Y
   en_result_t enRet = Error;

5 T# T4 l9 s4 }- V0 M
   M0P_RTC->CR0_f.HZ1SEL = bMode;
& M  _/ ~7 _, w7 r
   enRet = Ok;
' Q$ Z6 I0 G4 \8 \
   return enRet;
+ @  w0 g  Z! P; M
}
5 v3 x" A" T5 a( L+ ~4 g
/**
: W) n9 |' ^" `
******************************************************************************
8 L8 a# T3 j0 g1 _- o1 u
**\brief  RTC 1hz补偿值设置

% b9 s( j3 ]& R+ K) R+ `
**

& H1 u! T8 g% X+ q9 D- t
**\param [in] u16Cr 补偿值

2 p$ h% f; }3 L0 @. A
**

( Z! j1 z5 F6 A: Y1 r: A7 `8 [2 ^5 e' B
**\retval Ok  设置正常
( \& I2 H( |8 n) r5 F4 J
**

% D- |' Z' P+ t) k7 i4 H$ j
******************************************************************************/

3 W9 K0 i3 f; C8 S
en_result_t Rtc_SetCompCr(uint16_t u16Cr)
5 B, ]7 j. W# k: G& \/ ^8 T
{

+ \$ f' ^; a( Z+ @' P' V1 n- ^2 j
   en_result_t enRet = Error;
0 n9 z$ v0 X$ _
   M0P_RTC->COMPEN_f.CR = u16Cr;
$ N+ u6 x" k9 e8 w9 g
   enRet = Ok;
; u# F! e0 u0 ?5 f+ m7 a1 U5 @
   return enRet;
" S% [9 w5 r' ]8 u
}

9 X/ O" {( P8 r' A
/**

( B# _6 |+ k- a
******************************************************************************
) `# b0 l0 e* Q" |: J( ?
**\brief  RTC 功能使能设置

. y0 M7 ^0 @2 p9 O; y2 h
**
& g  p. H1 F$ H. u" W" r& I
**\param [in] enFunc 功能选择
2 h  \  S$ h* E0 j7 }
**

  f# v3 M* [2 n$ T2 ^4 L
**\retval Ok  设置正常
6 U9 X# Q5 }% s' A* z: w
**\retval ErrorInvalidParameter 设置异常

& c1 ]2 e  f+ p: A- \! l. ?% W
******************************************************************************/
$ P9 H% `+ X, G+ [/ u1 f
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)
9 ]% s+ r, u) J3 b% X3 O1 r( p
{
1 B$ Q6 e5 `: I, Z1 c
    ASSERT(IS_VALID_FUNC(enFunc));
6 \4 H0 I$ A! G. m
   switch(enFunc)
5 ^& i" \! r; i- H
    {
8 L9 \1 @7 ?0 m$ }. F% @! l4 y
       case RtcCount:
+ w% }. M! ?$ T5 A( l
           M0P_RTC->CR0_f.START = 1u;

' W" F, d" j  d9 _9 n
           break;
% `. I: W& p$ i0 b# z
       case RtcAlarmEn:
" c* b7 e, O& `
           M0P_RTC->CR1_f.ALMEN = 1u;
/ ^5 H* D) Q" q
           break;
5 C4 o2 a. \/ S: P4 q: _/ {
       case Rtc_ComenEn:
5 m. Q0 S6 a/ x' i
           M0P_RTC->COMPEN_f.EN = 1u;

4 O& {; x. a" w- ^
           break;

* J( U: N$ N- F' t$ ~
       case Rtc1HzOutEn:
7 d1 i8 U0 ]! M4 D. m
           M0P_RTC->CR0_f.HZ1OE = 1u;
; ^  m( J0 d3 Z. v7 k
           break;
) {% |8 {; F5 Q( v- B& |% M- P% }6 t
       default:

" i. O. ?3 H9 M4 ]) o! J) r4 f
           return ErrorInvalidParameter;

# n4 m" f5 y. c$ U. O
    }

& V2 ^+ V( m% C
   return Ok;
' d7 O  Z: a& w  N
}
) C* w+ v5 j' b) c
/**

& C- u+ g8 j: K% \
******************************************************************************

! ^3 S/ K3 e9 }) Z1 E* d/ R
**\brief  RTC 功能禁止设置
5 p3 P6 \) c% P4 N
**
, a6 Z  U9 `+ w- i8 O: c
**\param [in] enFunc 功能选择

7 Q4 h7 d7 x3 w7 M, Q
**
& K  q6 K/ Q, O8 |- Z
**\retval Ok  设置正常

1 w7 r; d6 M5 e* H; j
**\retval ErrorInvalidParameter 设置异常
3 b! k! S9 F* p' s8 s) z6 ^
******************************************************************************/

) l' }0 b7 g1 V4 q7 B& o1 [
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
9 k# ~1 Z9 y, j6 ?5 c
{
4 o; L$ X  c5 i
   ASSERT(IS_VALID_FUNC(enFunc));
  |2 `4 X9 h% c5 R: i
   switch(enFunc)
0 C: ]& `5 y: r  L% ?% X
    {

/ @+ y$ W+ O) e# c' Z4 y( d0 x
       case RtcCount:
/ a" o: y4 {; x' x- x
           M0P_RTC->CR0_f.START = 0u;
/ n1 h1 n, `% ~5 `- }% b# V' {
           break;

- {6 {) U* C: x; S! c/ G% i8 |
       case RtcAlarmEn:
' r9 b+ f1 C0 Q/ z- H
           M0P_RTC->CR1_f.ALMEN = 0u;

, T/ k4 G- y; r/ N' k8 V# Z/ c& _5 V7 a  P
           break;

3 ?* E" I1 Y5 A: j
       case Rtc_ComenEn:
/ d0 i2 t. ?. X/ `4 B: E2 t
           M0P_RTC->COMPEN_f.EN = 0u;
- f& [- M9 i- n; Y
           break;
( r4 ?5 q. D, Q! N# d' v- ?6 V$ H
       case Rtc1HzOutEn:
+ Z8 s) Z) R) X
           M0P_RTC->CR0_f.HZ1OE = 0u;

( f% V" U' l. i) r
           break;

7 m  d$ A) o' d2 b
       default:

! C) ~+ {) ~! K) l
           return ErrorInvalidParameter;

$ e; {3 s1 \- Q( q* i8 x
    }
! ?+ W4 Z5 X, `/ e9 H9 X0 j. l
   return Ok;

9 U# z# J  K4 Z
}

. G4 h7 I! m# P1 [' q( W2 m: n
uint8_t Change_DateTimeFormat(uint8_t u8sr)
4 ]9 J2 J2 M* \3 K& t) [
{
! X; T& j) B0 Q- `- r9 G$ \
         uint8_tu8de=0;
2 g  _$ ?) S8 o2 v, Z, o
         while(u8sr>=0x10)
1 ^& l& G# a& X. v
         {

: T0 f' k- m: J% m& J% L" q) R* C! k& n
                   u8de+=10;
0 J7 H; O1 `- ~
                   u8sr-=0x10;

( U9 S$ P, ]6 i
         }

& r6 D  J: `$ d: G( B
         u8de+= u8sr;

% o6 Y  b# f: W
         return(u8de);

0 g* F9 E( d1 @
}

: z! T  M6 J3 n0 F4 ~4 a# ?' G4 G
/**

% g! Q; g, w& U( z' c
******************************************************************************
4 Z- o* e" M# J. t: b5 q3 ?
**\brief  RTC 平、闰年检测
4 }( P5 H% _. K- B, ?, t8 q' b1 L2 l
**

" H4 N+ @, l+ d4 d
**\param [in] u8year 年十进制低两位

  K  ]# ]- |4 ~! Y2 x
**
0 e1 f5 y9 w% B1 ?: _. ~* u4 S
**\retval 1  闰年

3 b* [# y! G* E5 N  w/ {2 g
**\retval 0 平年

! |1 @( Q# ?/ @
******************************************************************************/
: V- x: n6 d6 g
uint8_t Rtc_CheckLeapYear(uint8_t u8year)

! Y. N( y3 `# L
{
6 O( y9 K4 v- T& h' {* C
   uint8_t u8year_shl,u8year_shr;

( M- L* F8 u4 n$ e( P
   u8year_shl = u8year>>2;
* K- \+ Y& [6 ~7 N2 L4 a6 @
   u8year_shr = u8year_shl<<2;

; r: m7 C. A, s1 F: x0 f( B, d
   if(u8year== u8year_shr)
5 V6 q' S4 }9 D) J+ O# d. {
    {
# P, B. _. ^: ^6 f" d4 p2 d( }
       return 1;
8 j) A* W! T, v5 |+ E
    }
* I) {% {3 x+ W/ u2 |% D/ _( Q
   else
# M( c+ d- p& c$ A0 R
    {

% t: d0 K% y9 l
       return 0;

3 s3 \' \6 O  V1 r% C' Q3 y
    }
: @0 X' }8 R2 f; P' ], \- w
}
. q3 g% r+ S3 A4 o4 N
/**
/ x' {; s! S. N9 T" u6 V; _+ W
******************************************************************************
  Q, j6 a" k0 k( m) I& a1 w
**\brief  RTC根据日期计算周数
% Q6 }* ^% Z6 o/ E
**
) P3 M& v" ]5 N1 a- {% q* [7 ^
**\param [in] pu8Date日期

. P5 y, J) G2 N/ x) @
**

3 q; V7 b3 D( N* g0 h5 {4 V$ v
**\retval week  周数

) D2 {$ P5 ~" s; s9 p
**

& B0 N* `5 Y# X* g( b# t- B5 X
******************************************************************************/
0 V) @) z4 b/ U7 [
uint8_t Rtc_CalWeek(uint8_t* pu8Date)

3 \$ }7 O+ M- A' j" m1 ^; R( q" U4 l
{
3 \6 B* P5 @- t/ [& m/ l& S; k
   uint8_t u8week;

- L) a. M) }1 z2 O" F
   if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))
' Z% b, |+ q3 o& M( A- k
    {
1 X" N5 _/ @1 k/ ]6 \0 `
                   u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
- B( N) ^- y- z6 o( o% R$ C
         }

! a3 a' u0 C% Z3 I
         else
* K/ ]! q7 L2 @
    {
' G# }4 G: ^9 ~% b9 g* X$ y# ~
                   u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
4 t! |, ^# L3 R. s" I
    }

8 }! W) K3 g4 J
   return u8week;

- P/ k) ~1 m; c! l/ i* b
}

- C) p  j8 h% i6 N
/**
0 V7 @5 [% X, E% x; ~6 N+ S" a/ r
******************************************************************************
! K* Y) i! D! Y7 M9 S$ c9 }# U
**\brief  RTC根据年月获取天数
% X$ h3 X9 G/ }$ d  z. P  H
**
' U( J& w5 E5 s; m+ t5 x- X
**\param [in] u8month月份,u8year年份
8 h2 P; l9 S( ?( o6 U! O2 D
**
( T( f5 `7 M0 M
**\retval u8day天数
: R$ e. X( m+ N1 D; a. V0 J
**
4 c" R' h$ Y( ~4 ^( }" d
******************************************************************************/
3 j! s4 f8 s- f9 N$ q: F, H7 }
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)

& r$ o' Z: l- Z# R' |" x6 T
{
: h; A% S- M; X+ e7 r, C, U* L
         uint8_tu8day = 0;
$ u6 z6 D! C; q5 l2 {: B
         

; U: Y, h) Y9 n: ?! ]. e
         u8day= Cnst_Month_Tbl[u8month - 1];
! E; n. L* |8 h
         if((u8month== 2) && ((u8year % 4) == 0))

3 w9 J# U1 c6 A; Z- L6 e
         {

0 J3 R/ y" t' o
                   u8day++;
/ T& L) S1 h# ~6 ?8 \2 N4 ^
         }
) N& S& T2 k: G
         return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31

) g) m1 {6 o/ B( F: }
}

& v9 \' B! r0 O
/**

1 |9 L0 k  a1 {+ i# j( `
******************************************************************************

- F. t  p) w) W" S7 K
**\brief  RTC根据日期计算周数
( U, u+ l3 i9 u5 ?
**

9 c- _6 t$ I! U) ~
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值

+ x5 y4 x6 b$ q6 F
**

( a2 x$ p# S$ |# T0 e+ o4 b4 G: m
**\retval Error 错误,Ok校验正确

# ~1 d" z9 \9 Q6 |
**

4 l% h( N' N8 E" k6 m) c9 C6 ~
******************************************************************************/
) ?/ d. J6 ~& j* i% x( j
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)
) E9 ?* P6 Z5 Z& T
{
$ z/ Z( w# ?' Y6 \7 q, }) K

, ^7 u+ T6 ~0 \. p2 E) u, S
   if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)
, q+ c7 D! E# A2 {: P8 S
   ||(u8data > u8limit_max) || (u8data < u8limit_min))
  l6 u" b- b# Z+ V0 I3 V* X
    {

3 I7 {1 D' N$ M& W: S) ~
       return Error;
& o3 y! B4 Z6 D7 n- i4 k5 U
    }

# P! y, p! ^9 O; c" S8 x* h0 M
   return Ok;
6 o, m( Q+ B( O! P9 z9 a: P
}

% ]4 c$ a! Y$ K. S
/**

" a1 t  V8 O  [, K
******************************************************************************
7 n5 s8 F! V5 }8 }
**\brief  RTC时间格式检测
! `- b4 }! \. o
**

- P' G  a% R- \
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式

' q5 F7 d' ?* v# q  |, u
**
0 |3 b' e; R* b3 R: w
**\retval enRet校验结果
9 J* r! r1 i, k) K0 B
**

4 @7 I3 E) `8 Z
******************************************************************************/
( p! @7 |+ o' v( s
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)
& B5 e( l6 L$ V, A
{

8 g- a! |' i  l- T4 F1 E
   uint8_t u8i=0;

) f! s  L" I$ s% o
   uint8_t u8mon_max_day = 0x28;

& w0 |/ T& \( Y/ i5 P$ \( A1 q# `
   uint8_t u8date[3];

7 Y9 k" p/ ~7 n, K0 Q. _
   en_result_t enRet;
3 t% U" o& J& _3 v4 b# p+ W
   while(u8i<7)
: Y1 g2 i# f2 E. i) a" {% O% F, s
    {
9 W& N$ z0 I- k! b- D4 E  q4 C# f8 C5 n
       if(u8Mode&&(1<<u8i))
) F; R3 L3 Z6 R# S# c2 C8 i
       {

* E! I3 ]3 k1 y2 d& Z
           switch(u8i)
8 r% Y0 ?; K- j! w  d
           {

( r4 f5 k! w6 f9 Y: [9 d3 p
                case 0:

9 P8 \$ w( ~% ^  M1 l
                    enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
" c- o4 o+ Y( t- ]  T
                    break;

' u! f" ?, m6 T( [7 N/ s
                case 1:

1 [2 s$ g/ e9 a$ a% m/ f. u) C
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
7 A2 T1 W# l( ?+ X
                    break;
! M2 @; l! G1 z1 _( }6 B7 a9 G
                case 2:

( T* o7 L) s. W) P
                    if(Rtc12h == M0P_RTC->CR0_f.AMPM)

9 l1 q! K  ]3 a6 \, ^3 y
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//
3 I0 ?5 M! Q. i3 r
                    else
2 M& g- `3 \) ~- t+ O7 P" S
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);

; n% v3 f5 M' U$ X( h
                    break;

; a+ z% d9 v7 e( m, S# B
                case 3:

2 ?4 `6 B  L6 P1 d
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);

/ k  u' L. k4 i0 [  V& s6 \) u2 c" N
                    break;
) C. ~! `; x, V' y2 p8 |. n* b7 ?
                case 4:
3 m7 m1 P/ z! o0 R$ u" J8 S% m
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);

; S5 q8 i# o) v- w
                    u8date[0] = *pu8TimeDate;
3 u) }' P( q7 l+ M, I& D6 H! V
                    break;

$ u5 U# h( v- f2 Z( o
               case 5:
" O) \& J. D$ e; ^- N
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);

. _! B( N  I8 Y, a
                    u8date[1] = *pu8TimeDate;
8 `* j) \2 B, t* Q0 f; i: H
                    break;

5 I4 v" p" {( G. V9 G, c
                case 6:
: x7 d! ?' U% |* C# C3 T$ N
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);

: V) p8 g/ E5 H! E5 w
                    u8date[2] = *pu8TimeDate;
: ~, v6 C7 [1 B3 @% K. T7 D: t% C
                    break;
  [) o" E, ~( s
           }
' j; t5 \9 k: Z6 W
           pu8TimeDate++;
; c; {$ f, f, r/ W8 F# \
       }
$ H9 _! U+ G1 \' U* F5 c
       if(enRet!=Ok)

% j$ O3 c& q+ B( d% @) G! B- h( l
       return enRet;

3 s# E' L& B6 U( V. R! I" P
       u8i++;

- u3 w5 T" Y( Q/ R1 ^7 l, ?
    }
; x2 r/ d) z7 i6 \2 s! a
     if((u8Mode&0x10)&&(u8Mode&0x20))

: i3 i1 }! ^" x
         {
( V/ x+ E4 b/ ~3 `* M9 A7 x
                   if(u8Mode&0x40)

; O  d( X4 w  c1 o' S
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));

! ~3 B+ k+ A& V
                   else

7 j; L; x0 j. s9 b5 M
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);

3 q2 l7 r! Y' h( D% g
                   if(u8date[0]>u8mon_max_day)

+ P- _$ p' z5 ]
                            returnError;
" [8 c! t9 O* g+ R; K# m0 O
         }

6 w0 P3 C, `+ @
         if((u8Mode&0x10)&&(!(u8Mode&0x20)))
& B4 }0 E+ S* W% a
         {

$ L0 f7 b, |9 @: U  Z/ g
                   if(u8date[0]>0x28)

8 P* ]2 y! V) i4 l' A" N
                            returnError;
( F$ U% q9 ~3 V1 s
         }
5 J5 l/ ~2 V6 N8 l* n
   enRet = Ok;

5 y* f) E$ n, o: T
         return(enRet);

1 z. I2 V6 B  {9 C4 i: l3 u
}
4 F# }$ K. c) r( `, h
/**

4 v0 N- w0 U! H' _( |
******************************************************************************
( Y. S3 h7 D' ?1 p
**\brief  RTC设置时间函数

/ |* C$ }8 g" f/ a: t% v& o5 J
**

% k; B# O* R, v6 b; ^/ E
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期

' k) I6 [2 V6 C+ t! p
**

3 ?7 q5 m6 a- K9 c; M* Q" _
**\retval Ok  设置正常
  P1 _" z3 I! e' R3 ^! M6 Q+ E7 |
**\retval ErrorTimeout 时间溢出错误
* Z# c' K; ~9 k$ E6 {
******************************************************************************/

8 K$ y! T/ j# ]8 F
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,

6 M2 Y7 n3 p& V( B; i9 j' \
                            boolean_t bUpdateDate)
2 K% q# z$ M+ A0 Q4 a. w
{

, `! O& O9 ]+ }+ S+ M9 \
   int32_t u32TimeOut;

# h5 s3 Y$ K, M& Q) r7 G  u
   u32TimeOut = RTC_TIMEOUT;
. ~' |- ]6 P% m
   uint8_t* pu8TimeDate;
4 _" P% G5 B0 g& V. S
   en_result_t enRet = Ok;
5 Z6 l( M4 T! T- p+ K0 D
   pu8TimeDate = &pstcTimeDate->u8Second;

9 a0 X5 A/ H7 i6 m5 N, o
   ASSERT(NULL != pstcTimeDate);

+ x! V# b/ W- R. j7 w7 S
   if(1 == M0P_RTC->CR0_f.START)

3 v2 w: @4 k& j( p: ]$ [' j7 b  a
    {
9 |* ^6 Y. ~7 j+ m8 B0 u+ ^1 S
        M0P_RTC->CR1_f.WAIT = 1;

" a3 q" g4 x2 k8 W% I0 S
       while(--u32TimeOut)
- M8 Q  ?5 p+ G9 n9 i
       {
6 A3 `4 b* h; |- u' f5 A4 H
           if(M0P_RTC->CR1_f.WAITF)

' ~) j) W8 L+ c9 ]0 I0 K5 S
           {

, E0 d" `9 V" G) @2 b
                break;
& {/ I1 Y8 ]. ?3 [
           }
& J# w2 Y2 F# t% l# C/ H' u8 x* o. v
       }

; u( u, }2 r' D( i* Q* P4 D
       if(u32TimeOut==0)

0 ?/ W9 e: U9 S
       {
$ K! b0 Z. V# \9 D2 I( x' [
           return ErrorTimeout;
! L, Z% @/ N2 ?
       }

; }+ c' N$ s' L3 H/ p
    }

* a9 r6 F) ?/ V. |( C: m
    if(TRUE == bUpdateTime)

: R$ U6 j  g9 Q3 z
    {

% d% w; A% Q% ?0 u2 [
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);
( N8 `& u' J/ ]; C
       if(enRet != Ok)
6 M. Z4 y# w8 A5 ^( }2 }6 K6 y
           return enRet;
% Y1 H& S) i, j9 p4 y
       M0P_RTC->SEC = pstcTimeDate->u8Second;
: |; U( W' R' a
       M0P_RTC->MIN = pstcTimeDate->u8Minute;

" Z0 I9 n( P  x: O
       M0P_RTC->HOUR = pstcTimeDate->u8Hour;
0 I: j1 V  u" F; M
    }
, p3 V0 D/ ~/ V" U. v
   if(TRUE == bUpdateDate)
$ _) Y2 J3 I$ k0 K' I4 G
    {
, i- g7 P7 B7 Q/ h. g$ F1 F
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);
9 h( ~7 X  q6 U+ ^, Z4 k( |
       if(enRet != Ok)
( L: |6 i4 R5 }" d
           return enRet;
* f0 U9 P. K, {* b* I% ]+ C, C
       M0P_RTC->DAY = pstcTimeDate->u8Day;

& _& }" U5 \2 f. D, \2 F+ M
       M0P_RTC->MON = pstcTimeDate->u8Month;
0 L9 u& B% e" y9 u; _7 _
       M0P_RTC->YEAR = pstcTimeDate->u8Year;

5 k. p/ k# `/ U( Q
       M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;
2 ^- b( w! X4 S2 L2 o
    }
1 a/ h& O+ Y+ v/ y! \* E/ g
   M0P_RTC->CR1_f.WAIT = 0;
8 j9 b/ c5 u9 u, w% O
   if(1 == M0P_RTC->CR0_f.START)
$ f6 Q* _  o" l
       while(M0P_RTC->CR1_f.WAITF);

  K* i. |, r6 s% {
   return enRet;
! h9 J# o* \3 q! E8 d( b
}
/ N; z7 o+ _  F
/**

" I% s7 P" C' i+ H) [
******************************************************************************

1 b0 u! A9 b0 V% ~& M
**\brief  RTC获取时间函数

: w+ \" x  |. C- a5 `  M2 k$ M
**
* ]8 X+ V7 i) v1 A% [  A4 J
**\param [in] pstcTimeDate日期时间数据

) g$ X7 T! n7 d9 ~8 D$ }0 X* O
**

+ c/ k7 B3 q, _) R& r! I
**\retval Ok  获取正常
$ H3 G; F1 o: Q: f4 t
**\retval ErrorTimeout 时间溢出错误

) y( e' O0 w6 c1 C
******************************************************************************/
% Z# v4 \3 ]  J8 F5 {, l
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)
# K" \6 a, O* k  h0 s' n3 r9 |5 Y3 s
{
" w# H0 t) t; R$ `+ D' w
   uint32_t u32TimeOut;

' X! i4 z9 @. Y. ~/ D5 b7 x8 Q; i
   uint8_t  u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;
% C$ \# l4 N+ C: M! W8 c" r

& |: T9 B: @! ^! |
   ASSERT(NULL != pstcTimeDate);  
( E' f' K. j8 C- c
   u32TimeOut = RTC_TIMEOUT;

5 [7 U3 C$ B! x6 A/ M
   if(1 == M0P_RTC->CR0_f.START)

* X- Y7 z3 N: E, X
    {

+ c# l6 j8 U. \" V. q4 t
       M0P_RTC->CR1_f.WAIT = 1;

4 h5 C& S- O3 j. G, _
       while(u32TimeOut--)
; Y+ h  v  r& _  \0 S% d
       {
' H# m5 R: t4 I7 X6 a# J8 @' I
           if(M0P_RTC->CR1_f.WAITF)

; s" E, J) m8 V/ ]) |
           {

- h" S3 v& y! c0 o" C8 _* O
           break;
$ g, R. C+ f. w- e
           }

$ u# j0 D2 c, O/ d$ m0 v
       }
! f8 w2 K9 c7 @% K  K
       if(u32TimeOut==0)
* I! \5 f. J! L9 z
       {

% u1 d7 p, B3 n9 D! o/ a" c
           return ErrorTimeout;
8 C+ x  n3 _# ~( l& c
       }

, g/ v$ H& u. Z- p5 n7 S  K- d
    }
  E# S& K! R# `; i$ }: z
   u8BcdSec  = M0P_RTC->SEC;

& C! d1 b0 j) }4 s+ i
   u8BcdMin  = M0P_RTC->MIN;

! B& g1 }8 Q4 \: w* {% i% x
   u8BcdHour = M0P_RTC->HOUR;

* i6 x, t( N0 |# h3 @* c
   u8Day     = M0P_RTC->DAY;
. u) a8 L1 j7 D7 d) ^5 _' h2 P$ S
   u8Month   = M0P_RTC->MON;
: l) A& {: ?1 R+ H5 [7 a
   u8Year    = M0P_RTC->YEAR;

# [9 O5 |. w% Z( X6 r
   u8DayOfWeek = M0P_RTC->WEEK;
1 P8 a" s1 v3 K# O# V$ F, ^/ l
* U. X* o0 b9 w* V, ]7 s
   pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);

7 g: K. w  R$ J' K# c  J
   pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);

7 G1 z  x3 Y& S. t% w2 T5 R6 }
   pstcTimeDate->u8Hour   =u8BcdHour;//BcdToDec(u8BcdHour);

7 v$ w, o1 N$ \1 [
   pstcTimeDate->u8Day    =u8Day;//BcdToDec(u8Day);

! e7 X, d4 v' e+ C
   pstcTimeDate->u8Month  =u8Month;//BcdToDec(u8Month);
; D# I8 G1 \( M  h
   pstcTimeDate->u8Year  =u8Year;//BcdToDec(u8Year);

- I1 I2 h+ A$ s
   pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);

% @# n. q1 f3 {- N3 i
   M0P_RTC->CR1_f.WAIT = 0;

5 E9 ]* b- c/ h6 T! c% z" O8 d2 ]. ~2 o
   if(1 == M0P_RTC->CR0_f.START)
3 U6 L7 P* O! x  B7 B1 j* x
       while(M0P_RTC->CR1_f.WAITF);

) X9 u* f2 D/ Q3 S! V
   return Ok;

4 M0 X- B) Q+ O
}
! Y! G5 @7 ^: G$ h& w+ c" Q# N: p
/**

% g4 X" \& @7 d+ D) n
******************************************************************************

6 m- V8 x0 _0 h4 e) x
**\brief  RTC计数or读写状态获取

$ R( q1 @) L+ ^
**
* \- ^% g' C& s) M) m3 C
**\param [in]
' X4 D1 A$ C6 A3 s# K6 G
**
4 T9 v. t" D6 H/ b+ x  o
**\retval 计数or读写状态
4 o' G& |7 K# K. U" i
**
$ \  h% ~6 G: p# N+ s8 e7 l
******************************************************************************/
3 ?+ R1 A1 i: r
boolean_t Rtc_RDStatus(void)

5 s. r% t, N: z: [2 i
{

2 }0 {% V$ k) B4 I" m1 j
   boolean_t bRet;

1 A' i* s8 ^) m. {" R+ g" K+ g
   bRet = M0P_RTC->CR1_f.WAITF;

: J8 l' B5 U9 G7 E' n. v1 r3 W
   return bRet;
+ `; z4 n( z4 L
}
6 |# t  G" }( ^7 h
/**

3 |& ]+ p& W" [; t) W) W& D9 S
******************************************************************************

- V$ C3 ~: c6 W( M! s; ~2 A2 s4 m
**\brief  RTC闹钟中断使能
: ]$ Z$ l; o$ a% j! n9 S) w8 {" T
**

7 J# D( ~5 @7 h
**\param [in] enordis中断使能or禁止
  ?' R' G: i  o5 `3 f
**

) g; k8 P( U, [  }: u- Q
**\retval Ok设置成功

) v  h: p+ h1 y/ b/ ]4 e" g
**
; d- I: R% W9 e, N" G- h8 G
******************************************************************************/

3 ^! @! [( u: g! V* y
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)
' U0 j/ |1 ~8 f4 R6 s4 L
{

* ]1 f) v' Q7 Y- Y; u
   en_result_t enRet = Error;
3 H4 j* b, |6 Q! Y, N9 i! D( `
   M0P_RTC->CR1_f.ALMIE = enIrqEn;
& v1 |6 N  R; G
   Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记
7 B2 k3 u" h# E$ U6 f
   enRet = Ok;

+ C0 o" P# I: d4 z8 M  N$ P
   return enRet;

, |8 v% d. a0 }( G
}
4 F7 F+ ~/ M8 k* P0 ^8 @! x& k  U
/**

. ^; N3 [0 z( ?. K( b* g3 ~
******************************************************************************
; d. E) T& D$ S( _8 S
**\brief  RTC中断请求状态获取

0 V. J1 J( t( R& w( ~3 x6 l0 U9 b
**

& w( m. M+ \& O/ r; A
**\param [in] enIrqSel获取哪种中断请求
+ i8 m' v, j+ @* @+ d/ B0 y
**
; ~" F: Q$ H8 H: [
**\retval 中断请求状态
8 m, X3 Y7 F5 U# M5 K
**
% H' S3 b  J/ }$ Y+ s
******************************************************************************/

/ S: ~4 }& F# c* @( v; w& ]. F% c0 l
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)
; T* h2 r# {, o' F) y
{

# L! I& |- F$ \
   boolean_t bRet = FALSE;

3 x" r  l' r4 A: f+ Q3 z* j: S
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
( V, q7 ?! G# A' ]3 A
   switch(enIrqSel)
& A: ~( y+ h5 ^. X6 y6 |
    {
: |0 p) H+ r8 {4 R2 v
       case RtcPrdf:

* n* K7 X2 U  R2 o
           (M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);

' t/ r$ m' {9 U$ v6 [+ P
           break;

7 W5 P* n& v, r' ^
       case RtcAlmf :
) l2 B, @  C" [7 o7 Z0 Z: o- ^
           (M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);

$ z1 n7 f  c% Y: Z+ j0 F3 D8 |3 E
           break;
. Q" s( C7 r/ V' l. X+ W9 z
       default:
, s* o! y9 U6 F5 F2 O" L4 U
           break;

9 o& A8 q8 e1 ^) x4 b0 J7 v
    }
- @7 g. W# j7 J; T
   return bRet;
- y: g1 j0 H% z6 o' X6 t
}

! @* @( J& P; m; [& p- O' S
/**

" H2 W9 W: k) {. \  X# e
******************************************************************************
' @5 @' P/ ~- ?% K% B, N0 O6 l6 r
**\brief  RTC中断请求清除

6 }2 d/ s/ W( I) b
**
5 h+ q9 f* v1 Z
**\param [in] enIrqSel清除哪种中断请求
8 r. A6 l" [5 ~, ?$ o" [# e+ G  a
**
/ K/ A8 ?2 T/ R9 j7 ?/ e
**\retval Ok 清除成功
9 M# g0 m1 ]! I5 N" q# p
**\retval ErrorInvalidParameter 清除失败

  e1 m$ d  v% G- i/ t3 J+ z- |3 a
******************************************************************************/
; X+ y: y. s* M- {% o+ G6 s( |5 f6 Z
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)
5 j" i. G$ e/ B+ t) X0 H- Z7 }' Y
{

1 r! H: ^" z4 K! {, e& {
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
" j9 L0 s; |$ H2 Z3 A" k( y9 R* {* e$ n
   switch(enIrqSel)

) w  V* _# ]. w& H. h( M1 t9 k
    {

5 \( N7 u# X, e, x( q0 T$ s
       case RtcPrdf:
2 ?+ g4 q) v3 X! y7 O; E
           M0P_RTC->CR1_f.PRDF = 0;
  J3 n+ }# M5 I0 ]' L5 D
           break;

5 k% L, K0 t! ?# H$ Z, i
       case  RtcAlmf:

- c* B/ h5 R) }
           M0P_RTC->CR1_f.ALMF = 0;

7 M: N9 Q3 Y: G$ w! J* n' m
           break;
9 Z4 }4 K" O7 ]1 a+ Z  J+ ?7 k
       default:
& b) i) `6 q7 ^. x: h: p2 M
           return ErrorInvalidParameter;

9 [: @4 o& J5 l2 F
    }
1 B* N$ {7 a8 g' f4 q; R$ S
   return Ok;
0 b+ o3 ]% d: A! q3 r
}

: K; D3 _1 j, n  |( v$ r6 |+ [' X
( S# u) a9 Y' m; v5 E
/**
; e' u) d; q) m1 Z
******************************************************************************

' p  u2 e5 i/ L* ?9 I  g% f
**\brief  RTC中断处理函数接口获取

2 x) y5 C( R5 W0 l; L
**

7 w* M7 v9 e+ I$ ?9 d' W# D4 ?
**\param [in]

8 b: N: M; L( A" E0 I# [
**
9 n- P& Z. \1 l# P0 C# [% M2 {  S
**\retval 接口函数地址
, m, r9 @! w- X4 R3 }
**
8 g* c0 L1 t. P% F4 S% B
******************************************************************************/

& N2 A, E3 r4 A, }! l) r% G
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)
! K' \4 F' v2 ^# }7 k+ E2 z' x# @) d
{
4 J9 d# \$ i9 o2 D( e
   return &stcRtcIrqCb;
0 V. j( ^& ~! q5 Y
}

$ X/ A- |' S0 z) p
/**
* Z9 F8 a5 G' V* z8 N
******************************************************************************

. y# v* Y2 z0 o5 f6 N1 a& ?) Z
**\brief  RTC总体初始化函数
! ~2 q* y8 P% i+ r
**
# U# ~$ `; D9 Q% a! R9 z( ^
**\param [in] pstcRtcConfig初始化结构

0 V$ B% R) F+ ~5 i
**

/ Q  P2 X$ t1 M- l  A1 l% Q4 [
**\retval Ok初始化成功
% c6 N' u) {$ s$ A  F
**\retval ErrorInvalidParameter 初始化错误

" y' E% i* B) L$ |/ V
******************************************************************************/

, V. z0 M) i. @/ T/ @# W7 m* }6 l
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)

0 t) V9 C/ }& n+ C% }8 N3 x
{
% P, `  t/ U# R6 d2 w( T+ V0 L
   en_result_t enRet = Error;
, K  H2 u% o  Y' u
   stc_rtc_intern_cb_t* pstcRtcInternCb;

; Y  e2 ?) u3 T- E
   if(NULL == pstcRtcConfig)

. b0 B$ W8 @) |! U2 F
     return Error;
% I/ O2 m5 `- n4 }( O) \5 Q7 A" R
   pstcRtcInternCb = RtcGetInternDataCb();

) x, `  G+ ?( k8 ?
   enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);
( I8 _" z3 q+ a2 D7 J# }5 n% F
   enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);
5 N2 b0 |8 m# q+ I4 T4 T7 B
   if(enRet != Ok)

2 f7 ^8 W! f& U' b1 s
    {
. U7 V3 U% N7 `$ W/ K* N6 O
     return enRet;
4 h5 H& A" G% f9 f
    }
' q; N, n8 d0 j5 r$ \
   if(NULL != pstcRtcConfig->pstcCycSel)

( t) y, b" R/ u5 g
    {

" A/ z5 I6 K* |5 `6 W2 ~5 Y
       if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))
: |" x$ U8 w: n* _
           return Error;        
( E$ e' u9 M. Z6 c% t
    }
1 c' V, W0 C9 U" G' _3 N
   if(NULL != pstcRtcConfig->pstcTimeDate)

9 G. R! y1 s1 J+ B6 m$ W2 ?
    {
0 X* U  s) ?+ [
       if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))

1 m; T. J5 m  n- L% B% K6 y2 m8 f/ Q
           return Error;

) d; V6 I- L9 m7 T0 P! P! l3 E( j
    }
6 z+ l3 y0 H! Z
   if(NULL != pstcRtcConfig->pstcIrqCb)
, A) a% ^# ?4 p- M3 K( q+ w/ l
    {

3 ^* @7 Z, [% v' [5 @& o. G. e
       pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;
( b  G( W* `  o3 }1 ]
       pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;

! I2 b9 G4 a- a; [$ N) _3 Z
    }
, D8 u+ R; l8 n
   if(TRUE == pstcRtcConfig->bTouchNvic)

* ~" q; G0 |: k/ w+ w5 Y
    {
7 X5 o, {- S3 [4 a
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);

( a4 R, W% h" W7 d) q/ c0 _
    }
! t0 q% n! z- C) w4 F
   else

0 L: C* x# h- v) q* `
    {

0 t1 _$ R* B& p) d7 S" P9 ]$ a6 s
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);

8 ]: C8 i( Y# h5 ^6 e2 I/ l- `
    }

& o6 v( X% S6 \4 n6 K6 Z( G3 J
   return enRet;

3 ~+ ~+ h- Z+ E- S% n3 R
}
3 L  K+ l7 `. H( g' O
/**

9 `+ v: e* B. W2 o9 U
******************************************************************************
# y) w3 I& m0 z0 A9 }
**\brief  RTC计数禁止函数
- Q- l" y, d" G" G) D' y
**

5 x# S5 z$ V/ t) i2 A/ |( G1 g, ]
**\param [in]
3 i# d1 L# k5 x" K! O
**

9 h1 g! e8 h- V$ s9 d
**\retval Ok禁止设置成功
$ J+ U8 D5 b9 S
**
' D/ }8 R, _( g$ a1 h$ M
******************************************************************************/

0 r: U- E' `0 O8 k5 r. T
en_result_t Rtc_DeInit(void)
0 r& O2 i$ r4 V  a8 ]+ r8 H9 P
{
- d' T- t& O( v4 Q# t) y& z
   EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
' H. W+ j* i9 o
   Rtc_DisableFunc(RtcCount);
1 S9 {' f4 Z0 l. s" Z& k
   Rtc_DisableFunc(RtcAlarmEn);
$ T# n1 j( a/ h! l! E- @
   Rtc_DisableFunc(Rtc_ComenEn);
+ L7 u' k1 P6 j7 j
   Rtc_DisableFunc(Rtc1HzOutEn);

$ v- u' `* e& ^8 Q5 i2 o: p
   return Ok;

* u+ A  j( f6 }% K; i
}
) t; N7 W. A$ C  G  Z# S" k
/**

/ s- V7 ?( j" |' `6 \
******************************************************************************

% S* _$ a5 h4 v* D7 y- R
**\brief  RTC中断处理函数
1 n+ X# [" j% ?
**

8 `6 ~$ j4 E. d% M4 G/ w$ N
**\param [in]

0 |4 w' I5 D: H5 h$ p* O" p
**

4 y! A0 g- [$ S4 M/ d8 [7 ~
**\retval
* \- w4 m& Z- {5 B
**

8 U; k* ]4 p0 ?" i) ]7 s
******************************************************************************/
: j2 h5 ]! a* w" u% s" i$ n
void Rtc_IRQHandler(void)
; i! Y. E% b( y# _" }+ Y) t
{
1 _% q) T  X4 e! [& Q
   stc_rtc_intern_cb_t* pstcRtcInternCb;
) i7 m$ M6 N& R) z) Q
   pstcRtcInternCb = RtcGetInternDataCb() ;

7 P0 e/ m6 f4 o, d0 R* o" ]
   if(TRUE == M0P_RTC->CR1_f.ALMF)
8 Q/ S  k# d' V3 ?3 m3 X- @
    {
0 s! L& }3 j% G$ W; H7 D
       M0P_RTC->CR1_f.ALMF = 0u;

$ v5 e. g% e' ?" R
       if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)

( Y2 L( N: U: |0 C
       {
+ e# n2 ?8 G0 Y. ~2 G  Q9 F8 m' G! G1 h
           pstcRtcInternCb->pfnAlarmIrqCb();
* a- T5 c/ |1 `; U
       }

: v" u$ t3 W  _# B0 `
    }
" f7 T/ Q$ p. P6 ^0 Q: s  r3 M
   if(TRUE == M0P_RTC->CR1_f.PRDF)
' l4 b9 G& F3 v
    {

# a+ ~1 L& O6 _- `& c/ F
       M0P_RTC->CR1_f.PRDF = 0;

; ~/ x- L' ?9 y# N% o( A
       if(NULL != pstcRtcInternCb->pfnTimerIrqCb)

" |" H1 f/ s! G! ^
       {

/ x5 z1 g6 z8 x( ^9 X2 ~
           pstcRtcInternCb->pfnTimerIrqCb();
& C# _5 @! ]3 r  ?3 L. @
       }

+ c" f) R" g3 |& a5 Y; Z
    }

( j+ \) g: s% K0 f& W* f: [
}

2 o/ z; o# M4 }, @* i" ~1 Z) o
  q7 |. V0 q3 R
0 H! b+ s5 W& t; |9 M, p; C. p
static void RtcCycCb(void)

5 U$ i/ m4 i# ?  s; x# F' |# k  F
{
5 D2 A% T8 e4 y2 `
   cyccnt++;
1 @& z0 }" O7 I' E+ N" A, h
   flg = ~flg;

$ s2 ^5 |! a; L; G2 E) K
   Gpio_SetIO(3,3,flg);

! |# h: X0 C; x, Q* i7 s
}

7 {3 A$ G3 f% j0 M$ y) `( {# ^
static void RtcAlarmCb(void)

) i% U. _( M' F; l$ k) [# ]6 H
{
8 M! {6 P6 ~( S' K8 u  _2 P( B
u8Alarmcnt++;

* C+ Q4 Z& ~/ C
}
, q0 _. G( e$ \/ t1 C
int32_t main(void)
& n6 O: q0 _% e& Y
{

+ b( ]" e2 t0 a. [4 J9 ~: I
   stc_rtc_config_t stcRtcConfig;
/ s" G8 j; ^# _6 p7 A; }0 D
   stc_rtc_irq_cb_t stcIrqCb;

1 ~' M' d# z$ l) g
   stc_rtc_time_t  stcTime;

. h$ \2 w; y0 w4 R
   stc_rtc_alarmset_t stcAlarm;

  {; u2 _$ {+ k9 }+ k9 f- E
   stc_rtc_cyc_sel_t   stcCycSel;

( c& X. F1 ^4 O
   DDL_ZERO_STRUCT(stcRtcConfig);
1 Q) u; y8 p2 ~9 F( @  Q! Y- n9 c( i
   DDL_ZERO_STRUCT(stcIrqCb);

' z/ n- @) H3 S# K! d+ R. {( R
   DDL_ZERO_STRUCT(stcAlarm);

+ V' v8 R8 s7 }3 o4 ?
   DDL_ZERO_STRUCT(stcTime);

, f; t5 Z% ~! X( T7 c& n
   DDL_ZERO_STRUCT(stcCycSel);

5 e0 F& O+ R6 e. ]
   

3 P1 d1 |/ J- Z; ^
   Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟
0 F. R, F, w( A! Y  [
   
! F! f3 }4 a2 O% x! L/ }
   
" w# T# y) [# @, c1 @% X
   Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口
! k+ M1 v/ z; V# f) Y6 q6 y
    Gpio_SetAnalog(1,5,1);
; f" L6 c- _8 w9 p" l( t- ]
   Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768   

( G; ~" E" v3 O: c& h
   //Clk_Enable(ClkRCL, TRUE);
* o' F! C/ ^* ]
   //Clk_Enable(ClkXTH, TRUE);
+ [" y8 e' q; E
   Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟

" M. c$ ~' E8 P4 }( A( B. y% C9 D
   
( r3 d& h9 y0 }- j
   stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//

( R! r- M. J- j4 G
   stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//
8 t. a6 q9 ]6 n
     
0 E0 H0 H! d" a5 C2 I+ l
   stcTime.u8Year = 0x17;

; k. P: z$ f0 L, k# x% W
   stcTime.u8Month = 0x06;

- F! \. ~9 f% `$ R2 G
   stcTime.u8Day = 0x07;
2 m! f% E/ i2 F, Z- ]' F9 }, ?
   stcTime.u8Hour = 0x12;

% z9 E- u9 U3 N/ r2 A$ y! b
   stcTime.u8Minute = 0x59;
6 V! z7 {, m- L8 @' t) P3 T, b0 V
   stcTime.u8Second = 0x59;
- o: }. N3 Y; l3 v
   stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
  ^4 m* [/ W- T, ^. Q+ K
   stcRtcConfig.pstcTimeDate = &stcTime;
) M% ~9 L: @  k* u+ c# }9 Y
   

. [7 M# V+ c  r' {% C0 J% _
   stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;

& d; y$ m' V/ U
   stcIrqCb.pfnTimerIrqCb = RtcCycCb;
* i( u. \2 f, h  y0 t9 X
   stcRtcConfig.pstcIrqCb = &stcIrqCb;
0 E! f) ]0 E4 R) Y  V  D0 c
   stcRtcConfig.bTouchNvic = FALSE;
1 ?* Q0 C7 x  u# M+ |* f' x0 T
   

9 A) U. d2 R7 ?, ^6 r2 ^. G$ I
   Rtc_DisableFunc(RtcCount);

$ \6 z8 B$ i( Q
   Rtc_Init(&stcRtcConfig);
5 b: X' r  {' M+ n3 A
' G0 s7 @: j; T) E+ j6 h( b. [
   

5 `$ T) m; F3 R; y( c! ?/ E
   Rtc_EnableFunc(RtcCount);

$ C* z) q& B* S3 W/ p% W
   Rtc_ReadDateTime(&stcReadTime);

& Z. S! n7 X2 |: F' B* |
   while (1);

. E. P4 n3 E6 _$ O3 d

8 B6 N0 N) t+ I( C1 V
}
0 m1 h; d% x5 v+ g7 z: V8 y
4 a7 I4 P. ^* P9 X- I% }/ l4 W6 d
/******************************************************************************

( K$ K2 I! \5 h- l$ v: ?; l
*EOF (not truncated)

2 [6 a6 W1 P; @/ c. x# g
******************************************************************************/

8 ~* ~$ J" J+ _. X4 S
6 m* T- [0 x- e( c& j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-4-27 06:40 , Processed in 0.073716 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表