找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

4

主题

4

帖子

60

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x

! @- ]6 k7 A! Z) c' N8 j& s
/************************************************************/
6 m- U- k; }* n( `# h4 ]% c
/*******                 样例使用说明           *************/

2 A7 J1 j7 n7 e7 l% d8 P
/*******                    版本历史            ************/

, T; E% [5 D, r6 j0 I. E/ g4 B4 s1 T
/*******  日期       版本    负责人  IAR   MDK ***********/  

, g2 B2 I" F7 Y" t; L# Q3 s
/*****    017-07-14     0.1     CJ    7.70    5.14 **********/
4 ~  E! k, B8 y3 I
/*******  QQ:3386208645                       ************/
$ L& N( r: z% N6 V  [% @& P4 L5 a
0 l! V6 ^1 E9 s. a
/*******               功能描述                  ***********/
+ ~* W: {1 o- Q0 K/ Z
/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/
1 t" l# q% ?% w, L  g
/*说明:                                       *************/
" z9 h! I( m% f/ s
/*计数初值写入计数寄存器                       *************/
8 D% z% \7 |! s& O! T
/*启动计数                                    *************/
! K9 b! |" y6 J& i
/*读取计数寄存器数值                           *************/

- F3 j, ~: O& L- Y$ E; J- f3 m
/******* 测试环境                              *************/
% ]# ^3 M, R8 O/ V9 k
/*     测试用板:                              *************/
/ E5 a$ ?  N2 H) q
/* SK-L110-TSSOP20 V10                        *************/
7 @3 B2 ~1 m; j  s+ F. J
/*******辅助工具:                              ************/

' Q3 G" c$ J; H: |# C
/*  JLINK调试工具                           *************/

* a% Q6 Z$ D/ P! Q) {1 H
/************************************************************/

" K# G6 z& A2 S/ I# |9 J; t
#define IS_VALID_CLK(x)             (RtcClk32768 == (x)||\
4 O4 i* t% ]! R- g. k
                                    RtcClk32768_1== (x)||\

3 H& {( R" E# o  V. J- J' H  D
                                     RtcClk32== (x)||\

3 {! Y5 ~4 v+ p/ \2 x6 S# B* Y
                                     RtcClk32_1== (x)||\
) o: U6 ~; P; D8 O& [
                                    RtcClkHxt128 ==(x)||\
) T$ b/ v0 y4 [, ^8 v
                                    RtcClkHxt256 == (x)||\

0 Q8 o. D7 T6 |, r
                                    RtcClkHxt512 == (x)||\
% N# [. y' M9 E$ W+ ]
                                    RtcClkHxt1024 == (x))
8 F! o% ~6 _. y0 E8 B* T' x

, {0 }3 t5 j$ Z  i9 M9 L: D
#define IS_VALID_CYCSEL(x)             (RtcPrads == (x)||\

0 E; s5 X. Q! {9 J5 v5 R
                                 RtcPradx==(x))

/ f, ~, G6 |. t3 M  j. X0 s; j4 C

  r% N$ [0 l( s1 z
#define IS_VALID_PRDS(x)        (Rtc_None == (x)||\

1 h; g0 [! I* b/ p% j5 p, l
                              Rtc_05S == (x)||\
( I: @- ~0 L" n/ {  L
                              Rtc_1S == (x)||\
* F, g8 |) `! l
                              Rtc_1Min == (x)||\

7 i( \) \( d$ ?
                              Rtc_1H == (x)||\
8 y$ l; E6 Z' f, K. S0 T2 e
                              Rtc_1Day ==(x)||\
0 e: F. [7 @* ^- C& t
                              Rtc_1Mon ==(x)||\

7 S9 j! P( }  ~0 c1 Z
                              Rtc_1Mon_1 ==(x))  

  z' Q' |) H/ t( P3 d3 G* l

- o* R* H% q( @9 x9 p8 y9 ?
#define    IS_VALID_IRQ_SEL(x)      (RtcPrdf== (x) ||\

3 C& C! z1 i" _
                                      RtcAlmf== (x))

8 }2 k0 ]4 C$ }5 b2 W
  q2 [1 H* t6 V8 D1 @
#define    IS_VALID_FUNC(x) ((RtcCount<=(x))&&\

- T! h& w) h2 I, j7 ~" S1 J/ z9 }
                              (Rtc1HzOutEn>=(x)))

) i) \" t- D  h8 Y5 ?2 n5 j
#define    CkDateTime    0x7F

# `* s# Y6 B8 k7 T
#define    CkDate        0x78
6 R- _2 f: a7 H( _+ O! O! \1 f% {
#define    CkTime        0x07
0 L" R. @  V+ L+ u/ }) n, I2 ?! J- W
#define RTC_TIMEOUT             1000//test 1s

. K+ B6 J- R1 E" a% t
#define    T1_PORT                 (3)
" X2 H" q' O$ ^/ ]" g0 r
#define    T1_PIN                  (3)

; d) g4 f. G: t4 C
uint8_t cyccnt=0;
$ Y5 g3 V* Z- ]$ W* k6 f' ?
uint8_t u8Alarmcnt=0;
* ~# k( M4 r8 t! c4 r# |& E7 ~
uint8_t flg=0;
+ [1 h% i2 A- d% X  Q6 }/ i6 L
stc_rtc_time_t  stcReadTime;
. }+ r9 z! B- V  H( h, {6 u+ O# a, T/ K# F

4 _, H2 Z% p0 \5 V
/********************************************************************************** \brief  RTC计数时钟选择
7 t$ Y8 T* Q) a5 d+ B
** ** \param [in] enClk时钟源
# j$ F6 C, k8 B2 R% k, S& H8 c
** ** \retval Ok
& `: f' Y; ^9 k; R
******************************************************************************/

0 M+ y' S8 B: V( S
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)
$ V4 T+ _# S+ V' C( P2 u
{
: g( u! G! _9 B
   en_result_t enRet = Error;
: ^( A/ o  a9 M9 R  v3 z; m" v
    ASSERT(IS_VALID_CLK(enClk));
) ~' d; Y$ G* i0 B& F, e) W- l
   M0P_RTC->CR1_f.CKSEL = enClk;

( Y  X; d8 l0 ]
   enRet = Ok;
" d' u- h, H# K
   return enRet;

) i7 `- u: U% f
}
  S# Q8 C" a2 e
/**

9 ^# l7 I8 F/ S5 `+ t
******************************************************************************

& s% n2 T- S' v2 n) A. b7 q
**\brief  RTC周期中断方式选择

$ S2 V. [2 g5 a3 _* A" A
**
/ Q7 O: }+ ~; G* T2 f( Q/ F0 f+ A
**\param [in] pstccCyc周期中断方式及周期间隔选择
# X4 t' ~) D0 H, B! H9 O: j& B6 R
**
8 X; X5 B0 u$ l0 U- ^1 `
**\retval Ok

9 z" n8 V$ z; }" O5 ~
**

9 G: e4 e! g; z, q" Y/ t" r+ h
******************************************************************************/

. S" {3 X# D2 K
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)

: c$ I% s8 _2 q: ^. o8 e' E
{
" ?' |2 b+ [# f
   en_result_t enRet = Error;

0 @8 Y% H' B  |4 t) B: R
         ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));
$ K  `) D' w2 f$ |7 O6 ?/ c
         ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));

" F2 b. W0 E. ]& k  [) s, T
         M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;

4 D. G0 h$ {5 Z. q9 ?2 s" I
         if(pstcCyc->enCyc_sel)
7 @8 v) Q/ Z3 W$ R( f
    {

& y7 V! F9 y5 J  s9 v* b/ i
       M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;

% P1 X8 R9 J1 J5 Z5 R) }( ~
    }
. M% \" q% y& X5 }) m  _
         else

' C. c! Z% X+ k6 @  ]" q
    {

5 T) v# {) g7 v7 \
                   M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;
/ c4 T0 \0 l. T, Z( M2 c6 f
    }

5 V" U1 x1 f, M
   enRet = Ok;

! T( n; B8 x9 V: U. C! Q
         returnenRet;
" F) b% y2 |7 X; ]/ a# K
}

( [+ w& D5 z" @
/**
$ b! U! [+ A' i. E
******************************************************************************
0 B( W- ~# `7 u1 W8 G  J
**\brief  RTC时制选择

" f2 @' S  ]) i+ o/ I* S
**
- \; O. L8 t- [
**\param [in] bmode12时制or24时制

" W3 P6 N/ j) o. I4 l5 N. V
**
' G4 v2 Z4 S/ `$ k( B
**\retval Ok  设置正常

; n" _; N; c5 @! j' a. j2 B4 u
**\retval ErrorInvalidParameter 设置异常
+ V) n( S9 Z8 m/ h0 s
******************************************************************************/
5 ?. L: ^8 M2 V' _, W- j8 e
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)

, @: ]) A3 w4 e8 @5 L6 z, V$ Z
{

, Z  I# F8 Y0 x: \' Q
   en_result_t enRet = Error;
5 W+ [) l# Y- J' \
   switch(enMode)

8 H# S0 G7 v! h% B) i1 h) x
    {
* K5 M' f6 X0 A8 ?
       case 0:

+ g: P' x4 i0 J0 q
       case 1:
0 [; Q" _& h6 Z' E% W
           M0P_RTC->CR0_f.AMPM = enMode;
! F2 A. B9 p5 C
           break;

# K: V8 Z$ [( N+ j* {6 B
       default:
$ i9 ?0 z) Y0 @& M0 V
           return ErrorInvalidParameter;
7 m# W- v- `/ U# n
    }

; S$ G3 S5 y2 r" `. I; G3 H& K# h
   enRet = Ok;

- s4 \3 C( H" _; S1 c8 `
   return enRet;
: y- \" z( w& X; ?4 x+ c& H2 p
}
" h! }9 w" r, q5 M& P7 ]
/**

) g& j& C4 h' Z* q. W- Y# L
******************************************************************************
( t2 l1 F: z3 [
**\brief  RTC闹钟中断设置
+ [; ?' L( P  X' x
**
. `3 B0 i1 N1 {8 a9 ?* e
**\param [in] pstcAlarmTime闹钟时间时、分、周

" g) ^* c; E5 M) m4 k6 N6 m
**
+ i3 r/ Z+ N+ ?* {" B
**\retval Ok  设置正常

5 z* X4 R' |( q9 [7 W; ]7 V" y
**
& U$ g) r, t1 ~. z: a
******************************************************************************/

, P$ w6 S' |3 e
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

2 B' j6 g! }! |% n+ F0 R6 O
{

/ Q6 h1 k6 ]. T3 S) l8 g* v3 d3 Y. _
   en_result_t enRet = Ok;
! F5 m& a8 ]3 r7 k
   ASSERT(NULL != pstcAlarmTime);
6 j0 `9 |7 `6 b; L1 [9 V
   if(Rtc12h == M0P_RTC->CR0_f.AMPM)
' {2 r3 j/ ^% I) h$ t( L8 p# i1 V
    {

& Z" p: f  B' j% v8 I/ b5 H
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);
$ i! a! T" A; v+ `& @7 a
    }

- I! x- @2 y7 \; j
   else
; ^: k/ e3 e5 N, d5 {$ i
    {

7 g/ ~. _! o( j8 K" g# k8 H7 y) ~
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);
* J: B" [1 L: ?6 k2 x  \2 {0 t
    }

# k: w5 R1 r) P. r2 K
    if(enRet != Ok)

- Y* |( t8 t- N# t( K- Q
       return enRet;

4 g$ A' d9 p7 h9 N+ b  ^% i/ b" i& N$ o
   enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);
8 |9 r, [0 D; u) F2 f, C& g
   if(enRet != Ok)

% H& B8 z) p; V* Z- w1 a
       return enRet;
& ]3 N/ Q. S1 g) V) ]2 _* t
   //enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);

0 f5 t/ ~9 j  O5 v: A+ n' F$ k
   if(enRet != Ok)

" D* d3 a: V3 b% h% C
       return enRet;   

; [+ s" r  U% ?5 j3 e. c
   M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;

5 k1 b1 m& a& q& T
   M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;
' p  m$ c  W0 z5 t+ G$ H$ q. o. O/ o% _
   M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;
# E$ y* u" ~9 a% G" D& k
   enRet = Ok;
0 e" o5 Q! ]  R3 b
   return enRet;
+ H# w  K3 \' a5 m
}
5 _/ M7 v9 d! Q1 n* c
/**
; M8 b1 z. G0 r1 X
******************************************************************************
, N/ `  z, ?. ]# n. k
**\brief  RTC闹钟中断时间获取
% W1 R. b' {+ t( J
**
  R3 J; l8 k7 V4 @. }3 T
**\param [in] pstcAlarmTime闹钟时间时、分、周

' R/ Z) J. ^3 v- G$ {4 B
**

3 y! j& q4 p! K# E
**\retval Ok  设置正常

5 Y/ b' r+ V" E
**
; Z5 C7 K0 V# ?$ Z3 q
******************************************************************************/
5 x' T* {3 M8 O# j* u
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

$ o# T5 i. w0 M$ ^  Z1 Y5 z" {% b
{
7 g9 u$ N2 Y/ {- D  ]
   en_result_t enRet = Error;
7 j2 q  C* J# [6 \
   ASSERT(NULL != pstcAlarmTime);

8 m5 Q# Y2 H/ |
   pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;
5 `: A; \/ C( s( }
   pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;
) V7 N0 {$ V3 D! A2 j# T
   pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;
" c8 ^1 I$ T9 p* F* a
   enRet = Ok;
; R4 P: A8 h7 s5 M) e3 b. V/ Y% ?- f
   return enRet;

! \5 M9 W, {8 L5 @- t
}

8 `1 f  `/ I: _3 {5 H0 m
/**

$ H% X) m1 E) v  x
******************************************************************************
3 W' y2 ^1 J( q  H! l" z
**\brief  RTC 1hz模式选择

+ ]7 C9 {% `; t; F. N
**

- h& W* Z1 q5 P; S
**\param [in] bmode 高精度和普通精度

( s7 h+ X( z$ s8 A( z
**
6 @% [  A! e. K- V* |. ^
**\retval Ok  设置正常
' Y$ d8 p* j) i: G
**

7 C8 k+ a, h. j2 p
******************************************************************************/
. g: `4 x4 s3 Y- X' y
en_result_t Rtc_Set1HzMode(boolean_t bMode)
) m* ^' X: I' M; q3 d- u" u
{
1 t( z# s! j6 `8 E, Y  ~5 T
   en_result_t enRet = Error;

3 C/ M( _( F3 C( O4 h
   M0P_RTC->CR0_f.HZ1SEL = bMode;
! f9 ]+ W- K, Y! b3 L
   enRet = Ok;
: ]( d; {& \/ p9 C6 H
   return enRet;
. l: z/ s6 c& }$ n9 [
}

0 U4 U( a5 \1 m9 D: ^2 f; \
/**

- H% w: v  \6 B4 g2 T6 i1 |! C/ r( m
******************************************************************************
9 G$ o) j5 h& \  M- ]+ D3 r- P5 t
**\brief  RTC 1hz补偿值设置

) `. R4 |- `6 z1 \
**

3 `6 P+ [) T* K3 E$ g
**\param [in] u16Cr 补偿值

) Y5 A6 b' k0 y7 r. \9 t5 n' Q
**

8 F2 U: S: e3 D) I
**\retval Ok  设置正常

4 V3 X3 ?$ n; B0 ?; G
**

  A) g+ p8 H/ S& `, M8 E
******************************************************************************/

& ^. w, a1 j5 v/ C; S, s; _' q
en_result_t Rtc_SetCompCr(uint16_t u16Cr)

, ^. s- e5 Z8 ~( u  A3 B
{
/ U% i& e/ x" e4 q# w/ F0 j
   en_result_t enRet = Error;

7 ]  m& s" i9 {9 o% }2 S* ^; m/ B
   M0P_RTC->COMPEN_f.CR = u16Cr;
, p/ u% h+ E* C
   enRet = Ok;
8 d; |8 D" z! H# |. C
   return enRet;
8 O& V" o; C2 n) K1 q
}
6 g. W+ h% y' o, E8 W! F
/**

3 [7 j  z$ H& a2 F
******************************************************************************
+ R0 O8 O$ ~  k: C5 v5 F; t5 l3 ~% k
**\brief  RTC 功能使能设置

* P: \0 n6 V7 A9 O1 L
**

/ F5 ]  Y4 z/ b* L! t
**\param [in] enFunc 功能选择

( ~, ?! M8 \& `2 o9 x: A5 q. K
**

& {( s7 H5 A; v( o  _
**\retval Ok  设置正常
4 X2 @( j/ y4 n/ y' G- R- U* x
**\retval ErrorInvalidParameter 设置异常
' K' M- q! u9 f" |
******************************************************************************/

' K2 U5 L3 F' w% S
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)

5 Y' Y7 ~- E: P6 Q' t, ]$ N: _
{

5 E9 i0 M7 l; X( l' d4 H
    ASSERT(IS_VALID_FUNC(enFunc));

- V# P+ A/ l! P5 M" p# V8 O2 x1 J8 l' L2 j
   switch(enFunc)
: z! l( R4 y- @5 m: p
    {

( ]8 M. A% w5 k
       case RtcCount:

  C5 j; |% l# d( K, Z
           M0P_RTC->CR0_f.START = 1u;

8 y' f8 w, |# H7 ?# `
           break;
" D3 u, |( t+ J$ O, o- B( \  o
       case RtcAlarmEn:
0 z" h, J2 O2 K+ F  [
           M0P_RTC->CR1_f.ALMEN = 1u;

. @0 J! }  [3 F  H
           break;

0 I% J5 j& y: U% O" o
       case Rtc_ComenEn:

$ a& k$ D/ E) u3 R$ B* q
           M0P_RTC->COMPEN_f.EN = 1u;
# _& ^9 i  M1 @0 p0 L/ A
           break;

) t+ z. s* d  [9 a' v
       case Rtc1HzOutEn:
+ g8 F- {7 t7 S' _/ i% r
           M0P_RTC->CR0_f.HZ1OE = 1u;

5 f# b( _9 z' z, O
           break;

2 l. q3 M- `4 m' v  b9 N5 ^1 G* L; o
       default:
& Y/ z& i8 M& g
           return ErrorInvalidParameter;
2 `1 l. h' I/ s$ U! Q
    }
6 X1 \+ ~8 j; \
   return Ok;
, ]4 C# ~) v2 y* I
}
7 }7 G9 ?0 d/ e8 R1 O
/**
- b( s& L; u. b! a0 w
******************************************************************************

& i7 g( F2 j/ p6 s! B' v* `
**\brief  RTC 功能禁止设置

" H* n' J) x; i
**
, u+ }- i! _8 ~& r/ R- o
**\param [in] enFunc 功能选择

. n$ N" j8 h5 c2 w, }
**
; V0 D2 k7 M- ^" l$ {
**\retval Ok  设置正常

8 V& g, z! S9 b
**\retval ErrorInvalidParameter 设置异常

! ?& J. |( O- G
******************************************************************************/

0 v& a+ ^% \0 E5 g4 g$ K# f& g+ x
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
; ]* G+ V3 k- O
{

# c  W8 P# c: c2 _# ~9 }# e
   ASSERT(IS_VALID_FUNC(enFunc));

$ T( R5 e1 N! X- z
   switch(enFunc)
$ c( |8 z  e) I7 G- B
    {
8 X( w& ]+ s1 v! T! O7 T" x
       case RtcCount:

' I0 @+ S7 y: m* @* w( J
           M0P_RTC->CR0_f.START = 0u;

1 l/ u0 W% k- i4 _& q4 z7 ]
           break;
+ A6 Y1 [9 k/ |, f3 L
       case RtcAlarmEn:
8 m. ^# O* K" `5 S9 @3 d5 x
           M0P_RTC->CR1_f.ALMEN = 0u;

3 ~: }! t* B5 F! t. |) B% u2 a
           break;

! H! G2 ~& u1 q& `: G$ M% U
       case Rtc_ComenEn:

5 H0 |* N4 s" n% I5 L
           M0P_RTC->COMPEN_f.EN = 0u;
; o7 t* o4 x2 P, B- Y
           break;
1 e1 a- v1 h# F% t
       case Rtc1HzOutEn:

9 x; Y3 h& N% \0 B+ v0 O
           M0P_RTC->CR0_f.HZ1OE = 0u;
8 M+ _* z4 b1 X! X/ S# F2 ?. u& y7 M
           break;

" l5 x! ^5 w& k& j/ g5 m% A
       default:
6 _' Z3 x" Q6 k/ y# _: _
           return ErrorInvalidParameter;
& r5 A* B5 A" Z, v; _9 q
    }

/ w% N+ ?8 J  c9 _
   return Ok;
: r0 Q$ o+ ]3 ]
}

( K+ H/ [# h$ p. x9 w% R  ?
uint8_t Change_DateTimeFormat(uint8_t u8sr)
5 x6 b1 k5 u" F$ D1 L1 ~
{

$ F* J" S# q; `: m4 n0 p/ ^: @
         uint8_tu8de=0;
9 O. Z0 b6 d  |, F& D& Q: M: x
         while(u8sr>=0x10)

0 V  @% ]8 W$ z9 \
         {

( t* F/ Z! E( O+ I" O- g
                   u8de+=10;

- s( ~; E9 @6 q
                   u8sr-=0x10;

' v% l: |  v$ i
         }
( p1 L+ Q' L1 C) n! x  U, d4 h% I
         u8de+= u8sr;

5 `% e5 y4 f4 R- a/ R
         return(u8de);

6 r% V- V9 ?7 C) j# r* l' W8 q
}
; f8 ^0 u# ?) h7 J# E
/**

0 _0 {: O" W" D% k1 A  Z
******************************************************************************
; h" a2 O' h7 }2 U) O! B6 d) ]
**\brief  RTC 平、闰年检测

# r; z& F/ S# Z/ t( S' _  B' C
**

1 j% Q, [5 y! S) j
**\param [in] u8year 年十进制低两位
8 m4 H  B0 \( G  \/ T
**

9 ]  _( l4 V; C3 x7 s
**\retval 1  闰年
$ w# D2 v' y' R5 k
**\retval 0 平年

( S2 r. W3 w  @# t
******************************************************************************/

- A' R/ s, W8 X7 o9 T/ P
uint8_t Rtc_CheckLeapYear(uint8_t u8year)

2 i* Y- |/ F7 p8 t6 _6 ~* U1 W
{

" V0 @% \0 L0 f: V$ w0 `* @
   uint8_t u8year_shl,u8year_shr;
% g# g$ S) l# n9 w
   u8year_shl = u8year>>2;

- g( N& ~6 p2 o. b
   u8year_shr = u8year_shl<<2;
4 P1 Q$ j9 d5 U( K  c, a1 Y8 |
   if(u8year== u8year_shr)

2 V3 ?0 T3 e9 c5 Q1 |
    {
) P% f8 x0 P3 O# K
       return 1;

3 a2 A$ R% R! c5 h5 I
    }

8 U4 o3 d6 c- i, m. @
   else

! k* i: a- m' a' J
    {

$ a; a8 f$ b+ [* V6 A
       return 0;

& l0 t1 H! r  p: ]! B6 f
    }

' q7 S5 E4 u9 \# B* X6 C
}

% o  m  c) y6 B
/**

5 Q5 h0 O2 I# J; X
******************************************************************************

# Q. o- c) y" @/ i8 }: P  B
**\brief  RTC根据日期计算周数

: j  e0 E3 ]% I1 l5 V
**
% E  T3 E1 U7 _6 G
**\param [in] pu8Date日期
8 n5 }' \  x# [4 B; j
**
3 p5 H6 @0 D9 e, D, \
**\retval week  周数
1 T& b/ D: z1 c
**

& Y' ]2 \) U0 O1 G2 p
******************************************************************************/
4 z; s. V5 l3 c5 w" |: y
uint8_t Rtc_CalWeek(uint8_t* pu8Date)
& \% y8 M+ y2 o$ h- ?% A5 c  E5 P
{

2 h+ O8 d+ p, V; Z$ Y2 r
   uint8_t u8week;
- ^0 v4 {. P8 F& ]& P( y) y
   if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))

* O* w  e; \3 \7 }6 K* l
    {

" n8 h! G0 T$ \8 g( s1 @
                   u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;

3 l: A% Q6 I5 e/ \, b, I1 e% L, d
         }

  e1 R% l" N: I: \6 }
         else

4 ?5 {. D/ Q6 G6 R4 O- v8 o; x
    {
- `# c% [/ G0 q' _8 ^
                   u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
1 Y- _6 D  Q( P: I, b, g
    }
) w. R5 G8 A) p4 }
   return u8week;

9 x$ d( [: g8 G* T  N8 O7 r) t
}

; d" b* M- c+ H% ?3 E& Y
/**
8 a, c3 ^% x/ m
******************************************************************************

' s) m6 _2 O; L; z; n
**\brief  RTC根据年月获取天数

+ G$ e6 ]" d. J. V" P) t
**
! @+ r* m, _- u9 E
**\param [in] u8month月份,u8year年份

  C) N  m3 U: f7 q5 c# C  I
**

8 B4 b, f8 D* w) O
**\retval u8day天数

' ^4 D& m5 R6 }: D5 I! ]5 y, n
**
4 B0 }6 J; ]- h) S6 f, f
******************************************************************************/
: n% M) W7 r" d# q/ E
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)
5 `0 m& R; |: v8 y
{
1 J; e0 Y& n, U
         uint8_tu8day = 0;
& ?* [9 X9 v. N4 b8 d, B7 A
         

6 @) O$ A  {% _( h
         u8day= Cnst_Month_Tbl[u8month - 1];
) U1 K6 h' f1 ^! K
         if((u8month== 2) && ((u8year % 4) == 0))
; ]3 R( R) A6 O3 x* G* k. J
         {

% |9 E1 p8 n% u5 n
                   u8day++;

( Q: _& ?8 O, L) k+ {
         }

- k' P# g% ^5 z3 F) |0 y8 t
         return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31

; H5 R* I( |- e/ r2 v
}
; F, z4 `3 G% }+ I
/**

1 r3 n0 C2 V2 s5 g6 K- Y
******************************************************************************

  A8 h+ `4 a6 D* j/ u- o! |
**\brief  RTC根据日期计算周数
, g1 v; Z* m7 G$ ~* R
**

6 F) q+ j: W$ A8 N- U5 t" E# u
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值
3 p, B  q4 V0 T
**

" f8 v5 E  N; C+ U+ D% Z/ B. k8 s
**\retval Error 错误,Ok校验正确

3 r% q4 e6 c9 v* k0 x1 I
**

/ ~- k( @, f& {+ V! u2 m' O, Y
******************************************************************************/
% ?( g: u8 y4 y8 a6 o
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)

# [# v: [/ z! L3 m
{
, X4 S; }& K1 S' [

* ]/ a9 }6 [+ ^8 |
   if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)
# @* `( b% E3 o& E8 T1 v1 L( c
   ||(u8data > u8limit_max) || (u8data < u8limit_min))

5 \; R" x" P3 Z1 I2 x" E2 X2 o  `; L
    {
' B0 b) p( {9 t) E& h+ D5 l) B5 }" \/ r
       return Error;
, Z! \8 B9 a9 L" J3 H7 E
    }

8 `1 q& J# m; c
   return Ok;
/ B! N" _: @; n' {3 h
}

& A% w) ~- x& s* b& U
/**
: c0 |2 p, a- i. K; r
******************************************************************************
4 z0 ?* w  h6 O
**\brief  RTC时间格式检测
8 c+ o( N: @0 o# a1 U9 s4 Z2 s
**
4 R- g' R" q" `6 S# N; Z! Y
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式
7 B/ w5 E6 N2 \
**
$ [' \6 _2 _! `  Z, [" W5 i  K3 L
**\retval enRet校验结果

$ k  F. b3 W: S) {8 V6 s1 c! Y6 H
**
0 ^: `* p7 D: Q! b, j
******************************************************************************/

: Z& @$ f: ?9 y9 A- [& v. T3 a
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)
1 `; @1 H! C# W4 ^4 Q# a( I6 Y+ t
{

% T0 t- u% V: L& P
   uint8_t u8i=0;
  Y1 l; o, d, D4 U; c6 N
   uint8_t u8mon_max_day = 0x28;
6 Z" A/ D3 P: q% p
   uint8_t u8date[3];
7 D$ g. T* ?: b! G8 O
   en_result_t enRet;
1 t7 T) w2 j9 y
   while(u8i<7)

; h$ X( v9 Y' v3 Q
    {
& B; O5 g  g2 W6 F
       if(u8Mode&&(1<<u8i))

1 {4 e$ K, W) \) H
       {
* c/ p, m5 ?( k2 r# s, c
           switch(u8i)

) f8 Z7 A+ T& D: t$ ~& V# Z. B
           {

9 g. h# B% F: V3 w' d* p
                case 0:
1 ]' m3 ?$ h# M  ^1 h. `( V& _9 [7 `
                    enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//

5 u  U9 F6 V4 P4 K' X
                    break;

) i2 V6 e4 D! W0 I
                case 1:

4 T/ k/ W4 O0 n7 [
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
- T# I& ~+ I, ~( [; O' \& w: i  A9 e
                    break;
% k& t8 i$ D7 K) @9 V# j
                case 2:
' i) r/ H8 p% \0 v
                    if(Rtc12h == M0P_RTC->CR0_f.AMPM)

) B  C! ^% T1 }8 L2 f) l6 g
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//
( L/ U! ^3 c) {+ Z9 Z. `  Q
                    else

, E, C( S( `; T$ e
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);
# k6 e$ q, c( k8 i/ G7 Q; o
                    break;
; w7 G$ T# P. [" e+ i- h
                case 3:
4 R5 y5 X! T# `; E, z3 P, j
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);

/ c" v# ^7 K, j! F
                    break;

7 ?+ _/ r% u) m' g, P4 q
                case 4:

! f+ H) d+ l* d! G$ O/ s# Y5 ?
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);

. f% W' @0 ]$ M: X4 j
                    u8date[0] = *pu8TimeDate;
$ v$ W3 Z0 r; r9 v8 E
                    break;
5 a8 o) d5 V. Z1 j0 }7 O6 G
               case 5:

- W3 V* V% @. ]+ n: m. v
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);
9 K' r6 \- ~) }! {" L, N% W
                    u8date[1] = *pu8TimeDate;
' R2 W3 N5 ~* ]8 d1 a: C: E- ~- Y9 l  ]
                    break;
; f4 K, L* E3 ]* o- a; ^
                case 6:

/ Z# W3 G( F+ R/ v
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);
7 H/ t; |* U1 x
                    u8date[2] = *pu8TimeDate;
) i- v+ B. N# A
                    break;
( Q7 N; k2 S# X. Q% [
           }
! t; L+ I5 U( G  S7 t
           pu8TimeDate++;
" L3 D. L- H; X, G
       }
7 `. L6 c$ x  Q3 K0 u) f
       if(enRet!=Ok)
, g/ Q3 N# s7 o
       return enRet;

' U% x( K2 @: n1 V0 ]& F' Z1 F  p
       u8i++;
. @6 y" L0 G3 D4 b/ H
    }

1 {# |  @0 ~& Q( N) O  `
     if((u8Mode&0x10)&&(u8Mode&0x20))

1 |! J$ `: l% i/ ^/ D9 _, T
         {

% Y0 \- d# f" W/ k1 G' C3 g
                   if(u8Mode&0x40)
+ k, }" @: Q2 C3 {; X: U) \& ~
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));
2 }) P+ ]+ v* Z
                   else
, A% v! U8 ?. g7 E7 Q, O# N/ c0 m* A
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);
' c6 N% l3 A# ]/ d. a- s
                   if(u8date[0]>u8mon_max_day)
& p3 Q7 c: N( L0 I. s
                            returnError;

( V! [& X$ a+ d1 A* F4 b3 V
         }

8 X$ }9 A$ l! V
         if((u8Mode&0x10)&&(!(u8Mode&0x20)))
) B9 ^# I0 |4 k' u
         {

5 \; B- K; R; r8 n5 Z
                   if(u8date[0]>0x28)

5 o0 ~5 N5 `- U! K3 U
                            returnError;

0 l, o! \. m' m) E6 U/ o0 i" k
         }

" t# ~. _& e$ @0 C
   enRet = Ok;
& m+ J! V- K4 f* K8 O
         return(enRet);

8 B3 a  A( x; @6 L9 j" a* o0 V
}

: C, y3 W/ R1 m- W, D, C, P' l2 n) q
/**
. |' I. z1 v: D$ ^$ F
******************************************************************************

% l4 t" ~6 E' s0 f9 [+ v4 |
**\brief  RTC设置时间函数
$ e2 U8 z+ T; v1 o
**
# O% b& U; x1 w& h1 b7 K1 g
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期
4 k2 Q8 e! E, Q6 v: m5 d9 U
**
7 ^5 g% n" o, a9 [" v% @1 T
**\retval Ok  设置正常

8 J( u8 O% A; g7 A. V2 ~: \
**\retval ErrorTimeout 时间溢出错误

) g8 l& @+ O6 H8 m+ C# u
******************************************************************************/
  z: q1 T% l" H; D0 J+ a
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,

. e. f: B3 x: `. J
                            boolean_t bUpdateDate)
2 H6 m, E: f2 q$ P8 T
{

; @7 E4 I% l: X" r& X
   int32_t u32TimeOut;

9 u7 O  ?, Q  Z7 t
   u32TimeOut = RTC_TIMEOUT;

% m- W" Q5 B- \8 j1 H# _
   uint8_t* pu8TimeDate;
4 B/ o2 q- c2 \1 k- T# \( D! ~
   en_result_t enRet = Ok;

7 F) u& w  `, l$ I
   pu8TimeDate = &pstcTimeDate->u8Second;

7 @7 e# X+ J, Z5 a
   ASSERT(NULL != pstcTimeDate);
* \4 W! h; G+ @5 m# S! H) Y: T
   if(1 == M0P_RTC->CR0_f.START)
7 ?7 j9 d# [. }% D4 a
    {
+ p6 v8 r" i6 ]& f) {' z. ?1 y. Z
        M0P_RTC->CR1_f.WAIT = 1;

! f& d3 z" ~" f8 B
       while(--u32TimeOut)

! Q) h! P& i- Y
       {

8 b. l( p! g9 L9 A
           if(M0P_RTC->CR1_f.WAITF)

5 M5 |1 I2 P) R4 E' C) f
           {
1 |" H: o3 H) `" U. [9 b
                break;

( w9 Y* ~/ f* C6 R5 j1 b' _. x
           }
, z7 o7 ?) V4 [6 r2 n
       }

' J" K% Y% a0 H" R+ x. {
       if(u32TimeOut==0)
0 Z- d. t' D6 s/ _2 K1 t
       {

2 A% D& |1 S& M( }. M8 A
           return ErrorTimeout;

% J+ {) k2 L* }- A* }$ J/ k' s
       }

- g  M" U2 I  ^6 I0 ?
    }

6 H' M& Q# ?, r
    if(TRUE == bUpdateTime)

! ~! W+ W+ Q+ c4 M6 p/ v
    {
3 ?7 K; x) c7 X8 u7 u* {5 _
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);
) g) A: L8 G+ V
       if(enRet != Ok)

- q6 h2 H2 \: S$ Z% [6 w' a9 R
           return enRet;

6 z( i" r! q8 ^! `) t% I
       M0P_RTC->SEC = pstcTimeDate->u8Second;
" {' S  t8 [7 P, Z  A& \
       M0P_RTC->MIN = pstcTimeDate->u8Minute;

2 Q' K7 R- d. c, H" q8 Z
       M0P_RTC->HOUR = pstcTimeDate->u8Hour;
( Z2 U/ R) q7 \
    }
8 {+ r# N5 ]( k- S0 u4 d
   if(TRUE == bUpdateDate)
7 A, M  S; M, C
    {
# z3 |% R$ D' r6 M  k! b: J
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);

+ X* N2 B5 m4 |7 o4 _
       if(enRet != Ok)

: R* z$ c$ c' @, o2 N; ~! `3 `2 @
           return enRet;
+ F- z. `+ ~( C- u
       M0P_RTC->DAY = pstcTimeDate->u8Day;

  x$ g: k, V  r) \/ u
       M0P_RTC->MON = pstcTimeDate->u8Month;

, p0 Y% n/ m. ]! r7 i) \  a
       M0P_RTC->YEAR = pstcTimeDate->u8Year;

7 w3 q' R5 f: o* J
       M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;
" O* s2 j! B; A) A
    }

- z) ~8 U% T: m8 L7 t2 }) y
   M0P_RTC->CR1_f.WAIT = 0;

0 o9 a; T- Q+ o
   if(1 == M0P_RTC->CR0_f.START)

, O7 l1 y. f) z2 {) O( x9 |
       while(M0P_RTC->CR1_f.WAITF);

% X. l, ^2 V& q6 o7 L0 I3 J* g
   return enRet;
& U  ]7 o# L6 {- G5 K
}

6 T9 n4 I4 z; A  j2 R+ \
/**
  K" T$ x+ y" S" R8 M4 {
******************************************************************************

# ]6 N& A0 c4 Z; e: W
**\brief  RTC获取时间函数
" F$ K3 _4 D1 N6 }( T4 d* a' P
**
- d! r( Z$ A, J5 d8 Z+ e2 W# |; Y
**\param [in] pstcTimeDate日期时间数据

. a6 _2 O0 }" p+ T! ?8 U
**
$ F3 F# `* [5 v5 O3 T9 \9 N0 O
**\retval Ok  获取正常

4 Y$ A4 j7 F1 L! A* N6 p
**\retval ErrorTimeout 时间溢出错误

9 T6 g* v/ P) ~6 D+ X& \, G
******************************************************************************/

( `2 T  x7 G  t6 m, Y5 m8 `; A& Z
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)
2 g$ V( y- y6 g7 V" p* {
{

: [4 {% n2 B+ x( E
   uint32_t u32TimeOut;

- S0 v2 ~& \' y/ V' q5 x! f3 }  e
   uint8_t  u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;

2 `7 j% C; i7 W: t# X
/ C# F7 X/ N) {! G1 X
   ASSERT(NULL != pstcTimeDate);  
3 s2 D2 T) ]' l% h- L4 ~
   u32TimeOut = RTC_TIMEOUT;

& o, `% m9 I  g8 a2 R
   if(1 == M0P_RTC->CR0_f.START)

4 F& `, b% y* z+ X6 E9 _+ {
    {
7 u9 q7 J5 h. ], s0 Z6 w
       M0P_RTC->CR1_f.WAIT = 1;

4 t$ W. j4 g# i/ p9 U
       while(u32TimeOut--)

( g  G& p' P( x1 a/ b1 j1 _5 y
       {
- L- D! k  J+ y  G5 F
           if(M0P_RTC->CR1_f.WAITF)
. k+ {, L% s& @* _# m
           {
9 s/ r1 B3 J  D5 D( D
           break;
, \# a- \( Q0 _: d* \& I
           }
0 v5 v# X( D8 E& {
       }

& c3 z% }* [2 p# v  C4 \6 y) W6 ?9 G
       if(u32TimeOut==0)

! B- ?* q# [3 E" Q  T3 i
       {
- E2 u9 P* Y% I8 g% K
           return ErrorTimeout;
- \" o) O: [5 i; \. G: j/ a
       }
( M4 [* k9 h4 F% `$ H$ b
    }

& ~9 Z. ]  t  U7 C' J. ~" N
   u8BcdSec  = M0P_RTC->SEC;
3 C3 j* j9 D! k5 Z  R, N  X
   u8BcdMin  = M0P_RTC->MIN;
2 l# _" E' R! Q4 r
   u8BcdHour = M0P_RTC->HOUR;

/ q* N: ~- R! M& R5 o1 I2 k
   u8Day     = M0P_RTC->DAY;
" T) o$ f0 B# Z  Y
   u8Month   = M0P_RTC->MON;
9 b; J9 J( [$ C+ K
   u8Year    = M0P_RTC->YEAR;

. J+ y, f- V0 {, y# D6 Y7 {# k* ?
   u8DayOfWeek = M0P_RTC->WEEK;

! d6 J4 f  M! N; b: N
& ?% @; u% y5 [7 [& e$ Y
   pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);

) J8 u& a$ |6 S3 h" a; y
   pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);

9 i6 w4 S( y. K) m" r2 B  I- X6 c
   pstcTimeDate->u8Hour   =u8BcdHour;//BcdToDec(u8BcdHour);
$ ?4 J& l: j3 ~
   pstcTimeDate->u8Day    =u8Day;//BcdToDec(u8Day);
' n6 f/ c0 @1 ~8 Q9 M9 v' R
   pstcTimeDate->u8Month  =u8Month;//BcdToDec(u8Month);
3 G) J# w2 J- I: x$ c  F9 q* H
   pstcTimeDate->u8Year  =u8Year;//BcdToDec(u8Year);
% `4 Q7 D/ @/ R6 c% z, g/ {( S& ]
   pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);
% C% R) g: a* [# F) h
   M0P_RTC->CR1_f.WAIT = 0;
" a0 Q  Z# _; e
   if(1 == M0P_RTC->CR0_f.START)
% W  z% K* K# {8 y
       while(M0P_RTC->CR1_f.WAITF);
" g+ L  d; D) m7 o/ j2 v8 p5 ~( _
   return Ok;

1 d. A3 L: _: ]' F
}
1 B- g& n$ H% _+ l
/**

6 b, n& W9 ?! j2 Z
******************************************************************************

' J) S% I3 k' c# X& d* T
**\brief  RTC计数or读写状态获取
/ q, g! s# F% ]
**

9 L" X% w3 K- K/ m: |& F
**\param [in]

6 N7 q& h) w/ g' k  B- v' k
**

5 A# y: E# |- {& I
**\retval 计数or读写状态
2 n, D( W6 d" ?  A7 O
**
2 {( S1 \) z* L; ~* B
******************************************************************************/
$ U' H8 }1 X: T8 {: N: f
boolean_t Rtc_RDStatus(void)

" }6 T9 E: ?1 E
{
) H5 Q9 {/ o; c' v7 A' Z: p
   boolean_t bRet;
1 |' X( r4 |( A/ K* z3 I
   bRet = M0P_RTC->CR1_f.WAITF;

7 j, y% k4 ^$ s0 b  E" O. t
   return bRet;

, A+ }8 y$ {8 N1 [, }
}

5 q# @, V2 x/ j& K3 u& x
/**
) B& H, r$ |6 p$ s$ C( ?
******************************************************************************
- J7 A, Q2 P1 D- m
**\brief  RTC闹钟中断使能
6 k$ Z8 w6 R7 c4 H6 x) u- O
**
% v4 |# |) w! M
**\param [in] enordis中断使能or禁止

5 N! @+ O. h5 g% i- s) O$ L
**

7 V! R8 |+ i5 p/ K5 ?* R, H
**\retval Ok设置成功
+ O% j9 m" V: p" v7 `
**

% b) C& O1 ^- ~1 J
******************************************************************************/

; b6 `- f; q  `+ R, V1 ?: g' M
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)

+ g- s4 u1 O3 ]3 L
{
5 q/ N- }: ~0 C0 ~. s3 F' B" X4 L
   en_result_t enRet = Error;

2 \4 e5 r4 L$ l, x( Q
   M0P_RTC->CR1_f.ALMIE = enIrqEn;

: X, Y+ k+ `/ I7 k0 y/ k  k
   Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记

3 y9 E$ T9 b% W: M  \/ e
   enRet = Ok;
& i+ ^' Y6 l  `# S- j
   return enRet;

& A3 f+ ]+ l8 `: k3 d
}
- o. s+ p  W; e8 q0 d
/**

3 y, \1 B3 t" }
******************************************************************************

' f! }3 p3 [2 W$ q* f+ x  `
**\brief  RTC中断请求状态获取
( S. U0 Z+ O' `" q7 F  o
**
4 H7 M8 j4 y7 J. _8 D
**\param [in] enIrqSel获取哪种中断请求
, `$ a/ k5 V9 Q4 i; t+ p) O
**
+ C* O1 k8 D# ^$ `3 K) R, e) J
**\retval 中断请求状态

" l1 V/ I9 d5 ^7 `. J1 D/ C% {* r# [8 d
**

/ M5 A7 k/ O- p: D& L0 C; W
******************************************************************************/

( z2 J9 X) w& ~/ O" S% {9 ^
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)
" d! u) W1 J9 e. i, D
{
+ M" w; a2 N+ W% X  V
   boolean_t bRet = FALSE;
6 ]3 \  ?7 d7 @  X
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
1 x6 t+ f2 O. E; p; n0 \( ?- K
   switch(enIrqSel)

% B% ]+ M. q" h4 F- o8 s
    {

$ y. g3 }3 z$ `* f  D4 \( k9 K
       case RtcPrdf:

0 `; f1 {# @+ e+ r$ Q7 s
           (M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);

3 G4 C. o3 \8 S& ]8 f/ m' W# F: C
           break;
7 M& r7 [* {( v0 v: _3 }2 V# r
       case RtcAlmf :
( l. b, z+ g" t1 W
           (M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);
9 t& a  h% a2 M5 s8 b9 ~4 f
           break;
8 N4 r) B0 u2 ^1 Q% m
       default:
! `$ _) z. ^! F
           break;

! X3 K* H( B/ P' O6 B  L
    }

" A4 M: s7 X1 ^  Y/ H
   return bRet;

( P9 ^# O0 K+ Z( T1 R* f- z
}

6 S' B" u; B( d7 c1 |  z' g. G( [9 {
/**

; U! \% c+ X% P
******************************************************************************

+ b* R, T7 @! ?8 g' j4 C
**\brief  RTC中断请求清除

' ^2 r6 m6 d) t8 t* w! [
**

: }- l. G5 b6 ]8 x. C5 A( A) n
**\param [in] enIrqSel清除哪种中断请求
4 |5 J" K. r$ Z% ^/ S" o. q% H
**

4 C/ @" W7 z3 n0 \5 Z. J" k8 i$ X' B
**\retval Ok 清除成功

9 m0 F3 d5 F& ^" \- K& l
**\retval ErrorInvalidParameter 清除失败
2 g, b/ C. s  g6 P- x3 c8 z6 ?! `
******************************************************************************/

9 @( f9 [8 N# X9 I# M0 s
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)

' _- z2 d% b8 t8 o3 w( [+ q
{
5 N7 N2 s. O: P; U9 J7 N) _
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
* N1 t* Y  |, b- X" |
   switch(enIrqSel)
6 L* y6 {! s1 x/ e: N
    {
( \& s. _5 L8 {+ {; y
       case RtcPrdf:
# i% Y) |# G' |! Q
           M0P_RTC->CR1_f.PRDF = 0;

. Z1 L% I0 f% k2 I( G  l/ R- y. ?
           break;
) t5 h) `* Z3 m0 H
       case  RtcAlmf:

4 V; m3 R3 P' H; S1 e
           M0P_RTC->CR1_f.ALMF = 0;

+ ~& x( e, n5 V/ w/ x/ |  I0 i
           break;

8 s( n" ~, ^* y+ i, x9 @; [3 {
       default:

( L3 o8 H( I* O
           return ErrorInvalidParameter;
2 y/ S) j% s) p" X& F1 c
    }

* _3 M. a) T5 Z! d" w7 |
   return Ok;
' y) f2 o: Z- w9 v" N1 X
}

) Y  C& j& n  g5 m
- ?( b$ ^( l- m  m$ P/ S
/**
0 e- Y/ I/ t; q- p- }
******************************************************************************

7 [1 g& s8 x  E' P* ]' R/ V2 P
**\brief  RTC中断处理函数接口获取
) s# [/ V5 ], }% c) i* Y& R
**

6 C7 y" i# Z$ j; T& l" S. J- ~
**\param [in]

, U# u" A2 r* j
**

8 U, x1 g% D* }5 N1 m* I
**\retval 接口函数地址

1 i* }$ j7 k  e! g" D
**

: [, J7 O/ |. U8 J6 a, l
******************************************************************************/

# U7 F: B6 i5 T7 h9 Q* L1 R
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)
- \9 z% s) Q; H0 u
{

3 `% ?% b' L# S% I
   return &stcRtcIrqCb;
. B# p4 Q& [% I5 a1 Z% L
}

6 j9 R$ x! t$ L: F0 v
/**
& Y5 p3 K9 e0 S( u6 U
******************************************************************************

' Z) C7 \* e3 T9 ?, {& w
**\brief  RTC总体初始化函数
4 G  H! ^" J% W5 Q
**
# k5 T- p' |: P8 {: A  ^1 i/ |
**\param [in] pstcRtcConfig初始化结构

3 v9 x) l0 c% X4 o0 R0 i- t  k* G
**
6 B2 t% _- F, _8 q- `( M
**\retval Ok初始化成功
/ l* c1 i, r! j; n" R. d
**\retval ErrorInvalidParameter 初始化错误
5 I" w! C) }! z3 C! Y% [& l
******************************************************************************/
; l% h/ D# u0 J+ M! M
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)

$ y/ F- r3 F2 G3 V! H: U
{

( D; p' s. R6 }$ Y
   en_result_t enRet = Error;
0 Q1 B  @9 [7 w3 H- g: u* b
   stc_rtc_intern_cb_t* pstcRtcInternCb;
# L, X4 T, I% H* ?- Z
   if(NULL == pstcRtcConfig)

8 H1 S# ]! L% R, F* r5 B) O& R' t2 x6 P
     return Error;

1 l4 y- s7 J% h/ I
   pstcRtcInternCb = RtcGetInternDataCb();

0 u! Q# {/ h/ h
   enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);

. S8 l: q* ]; [; V7 ?& b
   enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);

. Q$ e) J7 B0 v, f4 n- a
   if(enRet != Ok)
9 k1 T* @* y& [- k) l9 e
    {
, Y9 J# H. v9 }# N4 U0 {
     return enRet;

6 ~8 g3 o. ~: B. v
    }

. H+ F0 G2 b9 I0 R; C
   if(NULL != pstcRtcConfig->pstcCycSel)
7 O- @9 N* @+ M2 G/ I
    {
7 V$ k8 G; b1 \4 o$ n) P6 B9 M
       if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))

% w- ^0 J& _* U' u
           return Error;        
( T) s$ [& q( x+ e# s
    }
/ e, B  M2 S" N: B
   if(NULL != pstcRtcConfig->pstcTimeDate)

  y5 Y. K5 A' Y0 s) S- ?
    {
/ x# b% |+ i% I
       if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))
, x5 z' b' U; B
           return Error;

/ a- Q1 M# ]+ q7 F- K' f
    }
( s6 F% e' U$ @
   if(NULL != pstcRtcConfig->pstcIrqCb)
0 G& v: ^% |% g$ `
    {
  Q* }: r9 h3 W# U2 p6 {
       pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;
3 \. v. `, D8 S& y
       pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;
$ j3 Y, L3 K$ r
    }
9 [& {( \; `0 O8 g* A
   if(TRUE == pstcRtcConfig->bTouchNvic)
8 i0 s7 f$ X, w+ F
    {

0 J* f  j% x- Q' v! M6 M& E
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);
" N/ p) r' X. I) i
    }

  f& b+ u) E# B9 ?5 Y9 T% H
   else
" k6 O! g7 I( l! L
    {
: y) F- q  `4 N* L4 X& G
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);

( C; k% i: f4 g* B: w6 U! }
    }
9 x9 [" ~( h6 s( |
   return enRet;
1 d! \- n2 N5 w1 R
}
. S- F  B* a( o: p# y
/**
6 B& y) W9 ?+ t1 b# ^* N
******************************************************************************
6 H6 T; ^3 i6 P) ?) q% v& d
**\brief  RTC计数禁止函数
2 f$ d/ N5 [# L% Y# P9 v  m
**

! D  X* N  r% m+ j7 e9 _
**\param [in]

9 y3 d0 }) k" E0 p7 U9 d4 f
**
. h; B9 v2 b1 R* ]3 j
**\retval Ok禁止设置成功
, _+ _9 n3 _  ^8 G
**

2 E. B; }$ S4 o
******************************************************************************/

, r4 v- f# ?' o/ B
en_result_t Rtc_DeInit(void)
0 ~& w! B5 f5 @3 s$ s8 ~0 |! Q
{
& d% o0 d7 f# k- b  d
   EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);

9 o- G% n1 T4 O, [% _
   Rtc_DisableFunc(RtcCount);
3 f$ }$ n  [2 m# y: X( o3 r$ ~
   Rtc_DisableFunc(RtcAlarmEn);
# o4 {+ E9 E. ~  |* [' w
   Rtc_DisableFunc(Rtc_ComenEn);

8 a% x+ u+ u8 r, r- ~; q
   Rtc_DisableFunc(Rtc1HzOutEn);
6 a9 O0 n- R+ b4 q+ N
   return Ok;

% w7 c0 n: U: o1 ^( V! Y/ Y
}

: W, \3 l" x# n4 R3 q/ D
/**
# ?1 B2 D  B6 ^" ~% ~/ b$ c
******************************************************************************

, L8 i4 U6 g, h4 G4 b0 J7 d* f( {
**\brief  RTC中断处理函数

9 _$ ~7 z; g) l% c
**
: c* a: e; a$ ]+ Y
**\param [in]
: {/ S1 M$ }; P
**

1 l1 p1 i# F5 X5 d# d
**\retval

- k' |- }! N( b2 U' M( z! h
**

& g' Y, K' a- S* q, U
******************************************************************************/
' o. C7 K. i$ n) h2 m
void Rtc_IRQHandler(void)

2 E4 I0 E5 o  i! n2 A
{

9 p/ P/ W& {! ?9 E
   stc_rtc_intern_cb_t* pstcRtcInternCb;
* ?& w1 v6 n: L; }& S
   pstcRtcInternCb = RtcGetInternDataCb() ;

$ b; g" X$ s3 C( j2 n
   if(TRUE == M0P_RTC->CR1_f.ALMF)
  o( |7 t, M" {" A1 a$ c
    {
9 H9 Z$ \( d2 @$ u/ Q, r
       M0P_RTC->CR1_f.ALMF = 0u;
. [4 F/ z8 ~" B% i* g: [4 F7 L) g
       if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)

: J2 ]& T* b7 n0 n9 h; `
       {
8 f# u% Y# @2 G, z: Q
           pstcRtcInternCb->pfnAlarmIrqCb();
% e/ U0 ]1 D( C9 P( Z, X
       }

" N: f* @! d& r4 t9 }9 ~# |
    }
3 f0 o0 Y! t1 q% I& j4 j! H! E
   if(TRUE == M0P_RTC->CR1_f.PRDF)
/ u5 L( Q9 H- p( ]/ F; o
    {

) W( e0 f7 c. o# d8 o
       M0P_RTC->CR1_f.PRDF = 0;

1 Q% o5 J, A7 z. ~
       if(NULL != pstcRtcInternCb->pfnTimerIrqCb)
# X! R# _) F0 F
       {
; ^9 Z. _6 K6 k% T. M* `1 i
           pstcRtcInternCb->pfnTimerIrqCb();

+ r$ G5 ^; P6 i: }
       }
8 p! U  S( }$ w( B# ^& ?0 w$ C
    }

4 E2 `) w: U6 d  J& g
}

8 N# x$ S5 b1 X
* c1 S9 r: o+ T0 N

, Q! |5 c# N* k& v; n/ W
static void RtcCycCb(void)

; q0 X* R1 j$ J2 u5 k$ F
{
( Z; j$ @4 c, i4 B
   cyccnt++;

0 m7 i7 l' }+ F" p
   flg = ~flg;

7 Y# P" N# n2 w% h: J: q
   Gpio_SetIO(3,3,flg);

& H; M7 v/ y; F& |# u
}

5 B. ~& X- {7 K& F) l7 b: K$ A+ W
static void RtcAlarmCb(void)
9 w8 s9 B  h& e/ X
{

; k" {& K4 g8 X1 @( M2 |
u8Alarmcnt++;
& b  G9 P7 D( \6 I
}
, M0 U6 V$ Q8 y' \3 h) ^
int32_t main(void)

, l* G' Z* _" C  z, A
{
9 J1 @& x6 ~0 B2 B% S! [! }
   stc_rtc_config_t stcRtcConfig;
0 v: Y& @3 {- q! Y" k
   stc_rtc_irq_cb_t stcIrqCb;

- B, ]0 J; F0 V% Y3 F& T
   stc_rtc_time_t  stcTime;

) f& w- J  W8 ?3 {8 \
   stc_rtc_alarmset_t stcAlarm;
1 {9 T% x; n( U
   stc_rtc_cyc_sel_t   stcCycSel;
" e9 q- I* w& s
   DDL_ZERO_STRUCT(stcRtcConfig);
5 K0 W  \2 @" ?: `0 p& F: Q
   DDL_ZERO_STRUCT(stcIrqCb);

/ I3 H/ T" K' G; s* N- m0 U, ^1 \
   DDL_ZERO_STRUCT(stcAlarm);
4 C( z  Y  x- V0 c0 _
   DDL_ZERO_STRUCT(stcTime);

3 ^! ~8 O5 g1 O7 o+ E
   DDL_ZERO_STRUCT(stcCycSel);

, i9 R6 W& h8 `) B6 e1 a! o* f) _0 _
   
: D/ Y& ~+ c4 y$ L6 P
   Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟

9 x" `2 @, L% c* U& j0 n. z
   

. ~& c, `9 b* ?/ w5 [$ i
   
! T3 I' h7 \, U- v+ K: x+ V
   Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口
3 O1 `6 |' ]" s4 x( Y5 V; M/ v
    Gpio_SetAnalog(1,5,1);
7 B1 [2 l0 X! g2 v# Y6 e) N
   Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768   
7 V* U' T9 N4 j9 o  [, Y
   //Clk_Enable(ClkRCL, TRUE);
# i) }- W7 G  I! p; P: C
   //Clk_Enable(ClkXTH, TRUE);

& D6 I/ _, b$ O" Q, f
   Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟

0 A" {9 `9 n6 ^1 a) I
   

$ h, Q% f! S: g; e  }
   stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//
- N6 x- v; g3 U4 K2 L  |& B
   stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//

/ w+ A: T( i) `6 j2 x
     
7 Y& }: y7 r0 I( o8 B  ]
   stcTime.u8Year = 0x17;
" Y  N; x  Q" W/ c* ~5 D" J  B
   stcTime.u8Month = 0x06;

6 e, {2 u/ t0 y5 x. M3 s  d
   stcTime.u8Day = 0x07;
/ J9 w+ [) x5 V: T: ?2 g% F! G4 D( F
   stcTime.u8Hour = 0x12;
, `9 \: e$ }4 [& M5 E( L3 ~
   stcTime.u8Minute = 0x59;

' F( m. }) U- @0 d5 l2 ^4 ]
   stcTime.u8Second = 0x59;
% l1 N, c  j! L  e
   stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
# X! m: f4 j' C2 y; z+ a
   stcRtcConfig.pstcTimeDate = &stcTime;

2 e- F( A$ {: d/ W. U4 X
   
9 ~7 c, t0 l5 |' ~6 Y
   stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;

: K# @+ n: X6 G, e' d1 D  b
   stcIrqCb.pfnTimerIrqCb = RtcCycCb;

) P3 \' p  N9 B. f: D
   stcRtcConfig.pstcIrqCb = &stcIrqCb;

3 a# {) v# c2 q+ Z! v4 ~, H* \
   stcRtcConfig.bTouchNvic = FALSE;
# |2 o  G; u" t8 R" w% H
   
* ~& {6 F0 l1 K& p- x( T$ L
   Rtc_DisableFunc(RtcCount);
( f& }: p7 W0 w' W1 z  n; u- B
   Rtc_Init(&stcRtcConfig);
4 F' p9 o- J  i# f9 B: P# _
7 y: ^+ t& |' j( L4 h4 K  d
   

: R8 ^" Y: R$ i3 U
   Rtc_EnableFunc(RtcCount);

. U2 R) G% p3 W3 ~# @: H5 v
   Rtc_ReadDateTime(&stcReadTime);
5 p! ^0 D: z- D8 p& U! _! A2 H
   while (1);

% ]5 M8 j* g. K0 m3 O
( r4 ?7 ~) F9 o/ _
}

* s( p( Y0 i$ G, y5 C, c
) n0 w8 Y$ `/ }' Z* D' L9 B: ~4 P" j
/******************************************************************************
6 |, f! Q" S# _$ k, s& u( H4 R
*EOF (not truncated)

" T& \: p. I8 I3 R( T& k9 H
******************************************************************************/

3 G; y! ~: ^" |3 _1 t

: z0 k; ~- G3 K" K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-17 04:11 , Processed in 0.072190 second(s), 33 queries , Gzip On.

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

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

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