找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

4

主题

4

帖子

60

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x
8 }6 I7 E1 b1 H8 J& X2 e
/************************************************************/
& c# f6 v8 d6 K) r1 d3 ~" X
/*******                 样例使用说明           *************/

0 i) ?8 c% M# c  Q
/*******                    版本历史            ************/

3 A# b& [4 q% u& v8 C% x$ r9 ~. _. b
/*******  日期       版本    负责人  IAR   MDK ***********/  

9 ^% I8 n5 X. O& o0 C- Y! f! t6 F
/*****    017-07-14     0.1     CJ    7.70    5.14 **********/

! _9 t$ L7 r2 N# Q: I
/*******  QQ:3386208645                       ************/
# ?) A2 ]3 `- }
; M/ `0 I6 R9 {; J' D/ ^
/*******               功能描述                  ***********/

/ l' Y! L( b6 |  E* x5 t% c
/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/

5 M/ {) e: g. ]3 D8 c
/*说明:                                       *************/

& k7 L* U1 Q; ?' G* b
/*计数初值写入计数寄存器                       *************/
% y" ]  Z6 [- ?# c% }/ x
/*启动计数                                    *************/
! `6 @/ T. p" h1 R8 M7 Q
/*读取计数寄存器数值                           *************/

. j9 |9 _9 d* B  Q5 l( U& }1 a
/******* 测试环境                              *************/
; ]. s; J  X! W# l9 _+ G
/*     测试用板:                              *************/

7 V3 w: W2 w7 C5 ^* \! k
/* SK-L110-TSSOP20 V10                        *************/
/ i: i/ v# b9 p
/*******辅助工具:                              ************/
4 K0 b1 A0 v, n5 G9 E9 v
/*  JLINK调试工具                           *************/

* @" d1 o5 P; R
/************************************************************/
# u: Z* K1 ]/ Z, [- j
#define IS_VALID_CLK(x)             (RtcClk32768 == (x)||\
+ }& K8 W) a) H0 @, g1 e0 L
                                    RtcClk32768_1== (x)||\

' q  F' S9 v9 E9 D- D7 Q, n
                                     RtcClk32== (x)||\
8 ]0 B' B" b& x& x: t7 z% Q
                                     RtcClk32_1== (x)||\
! K( r' v4 \  ^  h; W# ?- d* M) Z
                                    RtcClkHxt128 ==(x)||\
, I8 a& j7 I8 b; B( e
                                    RtcClkHxt256 == (x)||\

9 ~3 G" ?( t+ K$ ], X( W( L% d
                                    RtcClkHxt512 == (x)||\

, c; Q: O1 @& Y% u( K9 ]7 `
                                    RtcClkHxt1024 == (x))

* O: e5 ?5 _9 j: ?* z

9 u) G2 z3 [# y
#define IS_VALID_CYCSEL(x)             (RtcPrads == (x)||\

3 e, U* O/ g5 |1 q
                                 RtcPradx==(x))

$ K6 N$ K% H: Z6 t9 g' X+ X6 @$ K
# U- B5 N9 f5 |9 k
#define IS_VALID_PRDS(x)        (Rtc_None == (x)||\

7 W; u: Z- s/ X1 e+ @
                              Rtc_05S == (x)||\

" H$ J: \/ s7 L+ F& L  b
                              Rtc_1S == (x)||\
) |% M. z$ ~9 {5 U
                              Rtc_1Min == (x)||\
9 H+ O2 v- B2 r  H9 M
                              Rtc_1H == (x)||\
: P/ G6 H) ~6 F6 p" B) P+ K5 K
                              Rtc_1Day ==(x)||\
6 v2 \9 t- V+ g+ _
                              Rtc_1Mon ==(x)||\

' W0 q0 x# ]) X) H6 i. u
                              Rtc_1Mon_1 ==(x))  
% J5 `: }& a7 S, W

/ E+ E1 Z4 `$ w8 Q5 p- {
#define    IS_VALID_IRQ_SEL(x)      (RtcPrdf== (x) ||\

  r) A1 i& P, v+ b4 b; L4 c% Q8 \, @
                                      RtcAlmf== (x))

6 r! Y# l9 ]" r& k+ O9 p5 k# M

3 w; a! L' T: n, t. U/ _
#define    IS_VALID_FUNC(x) ((RtcCount<=(x))&&\

  g" T' C* D+ A( ^% J
                              (Rtc1HzOutEn>=(x)))

. X5 s+ s3 k0 a
#define    CkDateTime    0x7F

% O# T4 f; N! o( h
#define    CkDate        0x78

$ Z, V& X  r: @% H, Q  Z
#define    CkTime        0x07

# I* `3 T" E. r* ~' X. A4 _4 e
#define RTC_TIMEOUT             1000//test 1s

1 Y5 b2 i: s: P
#define    T1_PORT                 (3)

: Q9 d. R- F  ?1 H/ {
#define    T1_PIN                  (3)
+ y/ r. X; _$ L$ \9 ?
uint8_t cyccnt=0;

7 k* d- ~# v! L* u8 V* p; B( \8 ?
uint8_t u8Alarmcnt=0;
; y% T0 L( v* V% g3 L# E
uint8_t flg=0;

' P" o0 A, h" c3 z0 ~
stc_rtc_time_t  stcReadTime;
8 D5 w5 V$ U- q

, q( m8 d9 Y7 O, v1 ?. m
/********************************************************************************** \brief  RTC计数时钟选择

1 z" a7 y/ I! `( k4 k- u8 _
** ** \param [in] enClk时钟源
7 {6 a& L' j+ [. ~" {" Z+ `
** ** \retval Ok

# n5 E  Q5 T4 ^3 g5 @' N% B
******************************************************************************/

8 Y1 w+ i) R5 L: C: p( o
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)

( M9 c- H* D. j+ N" u1 O
{

: M! g% o7 Q; ]4 O7 {! F
   en_result_t enRet = Error;
; [+ E  j9 T( y5 _2 M
    ASSERT(IS_VALID_CLK(enClk));
0 p! H' o; w, a' c  Y& a* X
   M0P_RTC->CR1_f.CKSEL = enClk;
9 {% E0 S" ~/ x* R1 F
   enRet = Ok;
$ \! e: i& a& D$ n$ b
   return enRet;

4 D% G! N& [1 c
}

5 U; E! }& P% [! L& p9 F8 u
/**
5 q* _8 {& s9 \+ s& V4 z  }' Z
******************************************************************************

% l, M# ^- x2 q' L! G
**\brief  RTC周期中断方式选择

1 I% [1 X3 k0 e3 j' g8 d
**
; C3 e( U$ Q- _  l" B1 D; n
**\param [in] pstccCyc周期中断方式及周期间隔选择

0 f* M% `# I9 v1 p6 v
**
7 z# z  b4 o' Q+ A* [9 Z% Q
**\retval Ok
+ e" b- o& W( a- A# j1 H0 I( ~8 u) ~
**
0 f% R  I& s; k4 Y/ N9 y) B, X
******************************************************************************/

# |6 {  v5 Z* R4 _# t3 J6 W) v
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)
! A. C3 H' I" L5 a3 r
{

2 k% ?9 ?/ |# {! e5 j. T
   en_result_t enRet = Error;

8 Q" C* H# Q3 H: K) R
         ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));

- O5 M$ y3 n2 `" Z. \+ v
         ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));
1 w$ J' F/ c3 W) v
         M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;

5 @  P& ^* L) h9 z
         if(pstcCyc->enCyc_sel)

' j$ r4 l: X' q- M1 Q- D) p
    {

7 R, w" h) [7 U2 o6 X- Q
       M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;

9 V* y7 i& |& t# r' z# Y3 K  m
    }

, w7 }! ]! r4 I1 E9 t
         else
' P9 _2 g; D2 @; M5 r$ {9 L0 \2 g
    {

) K8 e, i/ H  R& W# R. M- {
                   M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;

( I0 o6 X1 ^0 I" f' r0 E
    }

; B5 _; P8 M  W& Y- ~! \& A, k" O7 R
   enRet = Ok;

% H7 D9 L: |- U: j
         returnenRet;
4 M8 ]7 K2 f- _4 p) }
}
- k7 e( T; N, N
/**

8 i2 }5 [$ p+ s4 W5 I
******************************************************************************

& ~  C$ I# h: b
**\brief  RTC时制选择
# g$ S8 A) Q  b" a1 e
**

7 F0 g% `) b% R1 t7 M! L1 f
**\param [in] bmode12时制or24时制
. g- M8 |% d: L, f
**
# w; ^( Q6 ]4 ]% _% j
**\retval Ok  设置正常
( q5 g$ @6 ]( X! l: e
**\retval ErrorInvalidParameter 设置异常
  O+ T: ~9 }: }' Z2 U% c9 f" x
******************************************************************************/

4 Y( o$ s' A& L7 W7 n  a2 E" ^$ j6 n
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)
. H( U/ W4 N  V: w! ]$ T5 `/ D
{
3 Q# c& U) ?. p# j7 a1 @; h
   en_result_t enRet = Error;

! {! B; c7 s1 q) k, o1 L
   switch(enMode)
& E8 |" L6 P" ?4 \. C' h' f
    {

# L% T* D. e+ f7 v% b! U: t; [
       case 0:
4 ~% V: n. w' y1 t. m5 `5 o
       case 1:

  A& s; O$ S( c. H- z5 U; h- z
           M0P_RTC->CR0_f.AMPM = enMode;
9 H8 q1 w( b+ p9 `% E0 [
           break;
$ D# m$ H4 W( g2 b3 N5 g- X' L
       default:
* X% z9 P$ [- B
           return ErrorInvalidParameter;

0 u, G7 A, d8 z% _$ t
    }
' Q2 q3 e! a' N( H' z# M# x
   enRet = Ok;
/ n) [  [. m. w( q0 G/ j$ }. X
   return enRet;

9 @" ~/ x/ Y: D6 }' G* p# `& Y
}

. v3 Y; K/ o# ~! x
/**

/ F: z- e# \$ u+ [: {* V3 ?
******************************************************************************

- ]% f) L9 p6 @* T& S
**\brief  RTC闹钟中断设置

8 R) p1 x  P" K! j
**
' a2 `9 L5 N4 g8 {# ~
**\param [in] pstcAlarmTime闹钟时间时、分、周

  c' n* Y/ u4 t
**

3 e; H$ @9 Q) S( a$ k  W
**\retval Ok  设置正常
. I: i% Y# j6 }: Q
**
8 D$ m: d7 F! f8 G
******************************************************************************/

# P8 ?9 I; |* m& j& d; h0 o; {
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

9 [( T; r6 y1 }$ F( S
{
4 @4 Z( s' i' |- J4 m* ?
   en_result_t enRet = Ok;
0 C% ~. X9 f! w% S) W% |
   ASSERT(NULL != pstcAlarmTime);

. w) z: v1 C' R- X3 X! j3 j: ^, v
   if(Rtc12h == M0P_RTC->CR0_f.AMPM)
6 K; s8 U! w5 H' n4 R/ S0 a
    {

9 i& \# ^4 |9 m3 M: E2 {
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);

/ A% a& T/ C6 G9 z4 {5 M
    }
* _' }; ~% l  d8 K) U; v
   else

' d. l% ~2 ]( z, ?4 h% Q) Z
    {

$ O  G6 V' Y# n, G3 D* N* J* {" S
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);

9 s6 e' z$ |* k4 [# x% }7 {( G
    }
3 h5 _2 ?8 }7 o0 N+ }7 p1 k
    if(enRet != Ok)
! S) Y& \0 m  [6 i$ Q6 s
       return enRet;

$ P$ q* y  y! |; T' V
   enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);

1 V" b& Z9 l9 B6 e2 E  C
   if(enRet != Ok)
1 W) w: {: E5 l) k
       return enRet;
2 t$ Z, _! {: S7 t
   //enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);
  j$ e8 k% x2 A' h" Y
   if(enRet != Ok)
# B/ s5 Z6 w2 f3 O/ |
       return enRet;   

2 U" l4 ^0 k3 k# h' X: G
   M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;
4 a, d( x9 k5 f* s3 L
   M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;

$ n  _3 W- ^# q+ w! K& t
   M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;

; u) h( C, \1 u5 y0 r
   enRet = Ok;

* F# @; E7 e' G+ }2 M
   return enRet;
8 e0 ]7 B" k3 K$ r
}
& Z' t* @" o/ B% r! h' Q
/**
" A# y- q, p( ~) ^4 d1 ~. s3 o
******************************************************************************
$ B: B! r8 H# e! B: m+ S
**\brief  RTC闹钟中断时间获取

% Q( z3 m1 y7 F
**

& Z3 g8 c" T$ }# x+ Q! P9 K
**\param [in] pstcAlarmTime闹钟时间时、分、周

2 e; e3 a! l! T% ^* _5 D5 M
**
6 B5 r  t/ c' x; U
**\retval Ok  设置正常

/ ?; s* X* T; ~6 [( x% n- b7 P3 e% H
**

( \9 ^3 W$ f6 r5 @, o* }
******************************************************************************/
8 _. d6 |' o& Q, |" q
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
  L" t4 {5 J% y, O
{

" M9 X* u' Z( i
   en_result_t enRet = Error;

) E9 R; Y' ?0 K! R- E, k) ]# z
   ASSERT(NULL != pstcAlarmTime);
+ W9 }+ t7 _5 ]+ K/ S' H# a
   pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;

0 J# n4 a/ h" u; k0 X3 i0 H
   pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;
( Q5 {! t' ~/ e9 Q7 m; n
   pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;

" u3 `2 f3 ^* R. o0 u  Y+ a, L5 ~
   enRet = Ok;

" l9 N+ f/ `# y% ]! S  |
   return enRet;
, ~+ S2 {) Z4 Q) m) b
}

  V+ A5 s1 z: k4 H0 \; B, C% U4 R
/**
4 G8 c% J# F; G
******************************************************************************
" k4 x* N- ?+ ~* I
**\brief  RTC 1hz模式选择

8 {! T( Y  a, c( z6 e8 A" y+ _
**
$ M+ Y3 F7 c  I
**\param [in] bmode 高精度和普通精度

/ ^2 p) S  S. O8 _. J; I) @
**
, Y3 y! B( g8 t* k4 Y( N1 f( D9 Z
**\retval Ok  设置正常
. W: J' T+ \9 L. N$ C. [8 M
**
2 [( D5 O  i# _3 y
******************************************************************************/
: t7 {; S! b+ X6 K  b3 R1 o
en_result_t Rtc_Set1HzMode(boolean_t bMode)

- E3 x, y- J1 l! `
{
6 c; D. S3 L% ^) s7 b, s3 A7 a
   en_result_t enRet = Error;

4 E4 t0 W, d5 v8 S# n
   M0P_RTC->CR0_f.HZ1SEL = bMode;
, v+ q! B3 Z% c0 D0 n) A
   enRet = Ok;
, W& t+ e! \. U
   return enRet;
* U7 T- T; ^/ _9 [% V* ?5 X: `
}

- d# O( S  n! F
/**
# b, z) ~4 H$ q+ m2 {# d
******************************************************************************

8 Z# l  ?) C( J/ l7 Q
**\brief  RTC 1hz补偿值设置

. Y9 E% S# \, j1 W
**
, r9 S* w! |. O9 @2 H3 b
**\param [in] u16Cr 补偿值
' h' k' p: J0 ?7 z
**

: F- N4 X. \, {! J3 _. c% ]' y. a! |! x
**\retval Ok  设置正常

. H5 k, N( O( v" f
**

( t) m7 z7 k; g" V( M5 l
******************************************************************************/
6 x$ R! i4 J4 r
en_result_t Rtc_SetCompCr(uint16_t u16Cr)
/ L0 i$ i2 ^9 q: T8 N" @
{

3 h4 p2 d2 a7 {  o
   en_result_t enRet = Error;
1 @) t1 E2 b0 \* s4 L  h
   M0P_RTC->COMPEN_f.CR = u16Cr;
2 _4 f* U' Z  L: Y. r
   enRet = Ok;

) X; c% o, n1 i. t  ?
   return enRet;

9 d3 N# ~1 h% ]' s
}
! d" P# L8 w2 c, x
/**

. S7 ^, `3 Q! d8 N) s% E
******************************************************************************
1 V* W: q" q  k, U8 o- ?
**\brief  RTC 功能使能设置

0 n3 ?8 N) k! X1 L! N; |: e8 p! P& Q$ N
**

. l, q3 Q% ~5 M- x+ a
**\param [in] enFunc 功能选择

! _$ v/ {( c5 A# u; U$ \
**
6 t# y( ^- F3 y$ h1 b. V9 t
**\retval Ok  设置正常
% E. ]7 M7 ]* n$ i+ E
**\retval ErrorInvalidParameter 设置异常

$ V4 g! b- F$ `, p5 F0 y$ H
******************************************************************************/

) r* `0 e5 U! v/ G' U4 a; d: `
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)

9 K+ P2 w6 G2 a# s; ?4 H5 w% {) \" n
{
- }) t! s; L- g6 q
    ASSERT(IS_VALID_FUNC(enFunc));

6 Q( g# t9 d) N0 F& P* h3 ^
   switch(enFunc)

3 Y2 \; O+ _) V5 p0 m% V5 r. \
    {

" P# n( I2 m- G( H8 j: s
       case RtcCount:
2 a3 b" E% q0 j8 Z
           M0P_RTC->CR0_f.START = 1u;
$ G8 P6 k' ?# x+ L" X
           break;
$ {; }2 f& R" g
       case RtcAlarmEn:
" b5 o* w* w. ^4 f  r
           M0P_RTC->CR1_f.ALMEN = 1u;
* \* W, P- T5 m7 \$ g' T4 Q2 f
           break;
. _! F+ V/ k5 F2 ]
       case Rtc_ComenEn:

  t5 b* g! ]% d" w) {& e& r
           M0P_RTC->COMPEN_f.EN = 1u;
" |+ t! d3 P* X- ]: K6 u: y
           break;

! ]0 h- d( T* a; V  S/ T) I* h
       case Rtc1HzOutEn:
& H% a& A/ y6 U# _% O* }2 C8 `
           M0P_RTC->CR0_f.HZ1OE = 1u;
- r" b9 S3 D/ U2 ^! l0 r0 m) A  G
           break;

" x7 O1 \' @- ~( M" h
       default:
$ G: V9 e' ~8 d$ f+ i
           return ErrorInvalidParameter;
5 S9 N8 ~* e. E) ^4 Q7 f1 {
    }

. j  X/ {3 a% Y1 ~; F( H5 O1 z
   return Ok;
* L5 s6 h. q( v3 Y
}
+ x* q. n4 f7 }! K* e0 p
/**
, W4 _" j2 R7 O5 N7 c  {
******************************************************************************

. W, i1 o% r2 e
**\brief  RTC 功能禁止设置

' K2 [% p) P4 {, k! Q5 a- X: Y
**
. Y1 s5 C5 F/ C% v. ^0 v, P
**\param [in] enFunc 功能选择

8 j% y# @: l& H3 R" s
**

5 [4 s; F6 E8 A4 ?
**\retval Ok  设置正常
6 {- H8 i) P# c! J
**\retval ErrorInvalidParameter 设置异常

4 O/ S( b; C& }! a
******************************************************************************/
2 f( Q' m9 r+ H  u. v. [2 {
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)

' M9 m+ r1 Z- z3 A0 I7 v# W
{
- y9 U. V8 C6 W  k$ k
   ASSERT(IS_VALID_FUNC(enFunc));

2 G& v3 r, r- c7 D' F2 O5 ~' R
   switch(enFunc)

( P% M- ?! t7 w2 f1 B
    {

, K+ J6 p% a+ Y
       case RtcCount:

( L  @) \6 F/ ?& N/ G. ]1 n/ D) S
           M0P_RTC->CR0_f.START = 0u;

* b& P* n- k( \  ^
           break;

% c9 ?* j& X- B' k6 N
       case RtcAlarmEn:
6 u  r4 p& y; V
           M0P_RTC->CR1_f.ALMEN = 0u;
- E# _# a- j3 y  n7 f3 X7 R& l) E
           break;
  b( p) q. M& @$ n* Z2 W
       case Rtc_ComenEn:
, `2 d9 w9 w$ O
           M0P_RTC->COMPEN_f.EN = 0u;

# \  O( M4 N+ T
           break;

2 r/ e6 g6 Q3 g& }! u0 d3 g/ O! v
       case Rtc1HzOutEn:

7 n) W( T( `: H: e6 j
           M0P_RTC->CR0_f.HZ1OE = 0u;

" `* L0 q# g; S* y: Z
           break;
; K0 G7 w; t6 v
       default:
, p* \2 ]% |3 V
           return ErrorInvalidParameter;
' k  @, f$ z/ ~, V% c
    }
8 g- l8 K  g/ I4 w& N" V5 I
   return Ok;
( O$ o4 T" b$ l
}

) w3 y" f# ?$ ^& l- f
uint8_t Change_DateTimeFormat(uint8_t u8sr)
. R" Q% c2 f  x$ `
{

- x  N( w" ~& T( U6 [& \
         uint8_tu8de=0;

9 U0 E2 x" v' `7 N, R: O
         while(u8sr>=0x10)

% n5 ?8 A. Q. a) p
         {

5 J- @/ E  h# a- [% _; ]
                   u8de+=10;

2 J) _- |0 D% ]! ], ^+ k
                   u8sr-=0x10;
& _6 M' ?3 z" W
         }

& Q& j9 s! O2 k4 Q0 _8 {. a
         u8de+= u8sr;

2 p1 y  ^2 @$ A: \0 g
         return(u8de);

3 Z7 N) q) l7 z* e$ v, q
}
8 b( B: g: ?8 f1 B$ G' R6 g# n& I
/**
  t# s5 s1 e" D5 D( F2 C
******************************************************************************

! [8 A" s* i% t( `7 e
**\brief  RTC 平、闰年检测
/ X4 S5 Z/ i$ ]
**
6 O# B1 i+ O% I8 D6 m9 C
**\param [in] u8year 年十进制低两位

% Z. u$ |& O1 U1 |! v, z% z
**

: L0 D7 Z- b$ }
**\retval 1  闰年
. [7 u4 T: n2 R0 u0 q+ N7 @) j* y
**\retval 0 平年

' h! F! c3 z4 G3 _5 Y* E' H) j! Z
******************************************************************************/

% }4 V, ]) s- E3 i2 O
uint8_t Rtc_CheckLeapYear(uint8_t u8year)

: s! o4 X2 A$ g" d, u2 @
{

6 K/ I$ B) ]6 P
   uint8_t u8year_shl,u8year_shr;

0 T/ w( O% f. m3 m+ h& v
   u8year_shl = u8year>>2;

0 \$ j3 w- h0 v$ G# {; M
   u8year_shr = u8year_shl<<2;

* ?# N; L7 {- o* q
   if(u8year== u8year_shr)

% A) G9 N: t- e/ W1 X  o" \+ {9 I) g
    {
$ q" W; E7 [+ z- N' t- ]) [
       return 1;

' d( T2 E4 }1 D1 q  v+ o
    }
2 I# K, n" ]7 x4 J: G0 Y, B$ W
   else

, ~# ]: V1 G( _5 k/ S
    {
: {! b4 R1 ]1 s3 S. ]% e
       return 0;
& }% h9 h. R7 [: f" g; d; {
    }

2 T8 [' q  _( Y: |. b' y% f3 M3 J
}

  U) c4 M; o& {3 n2 D. S
/**

/ \. ]1 C& e- B
******************************************************************************
" {- G0 U. F7 u% o" c7 ]
**\brief  RTC根据日期计算周数

0 p: s7 M. B8 {
**

, _" g6 w& H- v2 Z
**\param [in] pu8Date日期
3 _; \' J5 H7 ^+ m) t
**

9 {% F  ~4 `, v! ~- Q( R5 x5 h
**\retval week  周数
$ h  |/ D4 q" {
**
% R$ v% w7 Q) J; F* N
******************************************************************************/
0 j8 a! A# l* v7 Y: o; N
uint8_t Rtc_CalWeek(uint8_t* pu8Date)
% f& B! q. H1 }- {; B7 N* Q
{
) L9 `) i4 U1 ?2 |+ F
   uint8_t u8week;
, D% s+ N4 D5 V- x* P+ z
   if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))
! ?- p2 b) L! ?0 y/ o
    {

. ^. z. K% ]" K( Q
                   u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
( D/ M% P6 |$ C2 B
         }
- P4 z9 A' I8 q5 D  B% E; Z
         else

4 A' A2 d4 s) h7 |
    {
5 S9 C: w3 `; `5 B* s# y
                   u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;

8 |& b- e) Z7 n, G2 d* J& W, T
    }

" y, m4 ^: N) G; P0 U
   return u8week;

+ ?( C. f; ]- H8 b5 p+ `
}

) e. A! v% m9 C4 D( l6 a4 F% v
/**

( B1 ^2 D( l/ ~/ u& q- O
******************************************************************************

) n" W1 N( f  H- p
**\brief  RTC根据年月获取天数
0 l/ g% c4 p4 P
**

. O' W! ?; }, O, V/ @, w2 ^1 C
**\param [in] u8month月份,u8year年份
3 L( O3 z: W7 A. G$ K/ Q& D
**

% P& K9 l1 j7 C' X# _7 A
**\retval u8day天数

2 r) {/ [0 A% L4 u
**
( K1 m$ v4 \! r# @' a0 b
******************************************************************************/

7 X  d3 X. v9 N/ Y8 j
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)
6 z$ ^) r7 l- T  U- O
{

6 x* g& x/ s$ L
         uint8_tu8day = 0;
1 x: |7 T# s3 v$ V' l" y
         

. b8 |$ d1 c' v' k, N5 Z
         u8day= Cnst_Month_Tbl[u8month - 1];
& _8 V- R) r' m% H
         if((u8month== 2) && ((u8year % 4) == 0))
4 a0 C4 n2 u" u8 n1 ?* y: W
         {
. J  d2 ~$ m9 S" h
                   u8day++;

2 X* K: I9 c! f' p( K# _; G
         }
7 u/ T4 X" ]0 Q; C1 T
         return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31

: _" B" s8 s' T3 ~3 V$ y
}
) J9 @8 o' b& V. L% W
/**
' ]. d4 I  y6 o/ z2 s
******************************************************************************
0 s0 {3 g0 J, ?0 ]8 [4 D7 p
**\brief  RTC根据日期计算周数

3 ~5 m! n1 r" o1 N
**
2 o# V- I& O# t. Z( T
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值
" Y% {: S' a9 ?* a) O/ i
**

0 Q8 K6 q/ e# f& L; P$ M% g
**\retval Error 错误,Ok校验正确

4 x7 o9 H# d) ?5 K  }! ~
**
) A1 ~+ v  q( z& @, p
******************************************************************************/
/ P/ _& g  h2 X- ~6 y8 I6 s# @/ \  a
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)

# G- C4 }) n, s1 ]+ M
{

% X& X6 B0 L* N% ^
" Y, n3 s) r5 Z0 Z# S" h( T  u
   if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)
+ ~% ~9 X! a. h8 L' O) s1 R
   ||(u8data > u8limit_max) || (u8data < u8limit_min))

) \5 N: [* T# [: ?. N
    {
5 Q7 D, [7 @  m1 U0 }
       return Error;
9 i/ d; q, g, ~6 N" q5 _6 o) H2 I
    }
( x* A9 d" G; a
   return Ok;

8 _0 v2 ~4 E* N1 Q8 s4 S
}
7 r1 r+ _1 c5 n% h6 i! U  ~+ p
/**

; n; b6 j* O0 U1 \) X
******************************************************************************
' `9 J  T/ N9 h6 ]  \; C
**\brief  RTC时间格式检测

/ `+ ^" @' t8 J0 F
**
# \8 m+ s( a! Q/ w2 L+ Q" k7 j& O
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式
" \% \& ~7 Z3 A" r. y
**

3 T- q8 b# {/ O! O; `" z
**\retval enRet校验结果
" e4 y/ q4 W- f) j
**
* G8 W# p8 _  o3 o& r4 E
******************************************************************************/
8 A, \  L9 {+ z3 ^( j
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)
4 N4 ~6 {! a$ a8 f. A' T
{

/ Q3 k3 K# O/ Q" i: L' H! R
   uint8_t u8i=0;
+ s& ?1 \7 [9 C8 C% U) t! B5 ?
   uint8_t u8mon_max_day = 0x28;

& T4 ]& d4 Q$ V
   uint8_t u8date[3];

: T/ v1 X3 r& w, q1 z6 U
   en_result_t enRet;

: F4 _1 K+ r/ @7 D! y3 ~4 E
   while(u8i<7)

0 U5 |/ H: |) b# P" g* l3 l
    {

- M: [( T& B5 d+ {1 u, @- Z
       if(u8Mode&&(1<<u8i))

1 ]. ]2 N1 \% A" b* w
       {

* e7 ?( r+ s- s/ S  [3 p
           switch(u8i)

" E! |* l/ U# E7 M( {  }! O
           {
1 n" z. _6 c8 o6 A; o+ }1 n
                case 0:

) L; g8 q/ X: X* I  f% A
                    enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
7 U0 D! M4 t( N
                    break;
" z2 [/ G5 T/ ]( P; C
                case 1:

( b  a6 c, p$ @. n! g) T  d
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
. q6 F4 Y; y9 C1 b
                    break;

) v9 p4 {) }" c$ }/ m
                case 2:

0 X/ {7 y& M. s
                    if(Rtc12h == M0P_RTC->CR0_f.AMPM)

2 W/ ^( F* v% _. F% _! U7 Y& x
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//

& ?% [' l8 s& z# \
                    else
) t6 j+ d, {* O2 ]* ]
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);

2 }$ r) ?/ G- ]1 x" W7 j/ M
                    break;
! p* ^; i# \/ U/ W5 L
                case 3:

, g" f# h+ q' l( T5 ~* ^. [
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);
5 w" j7 M: |6 m
                    break;
& O' Y! W* S0 M) x
                case 4:
  z' G  m( U5 e( S7 Q/ f
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);
7 h9 m/ x* _8 y& U
                    u8date[0] = *pu8TimeDate;
8 w7 e' b$ f6 o$ G1 N6 }
                    break;

, G5 F, P" C; i" c# f, M2 m
               case 5:
8 C5 A( i( n. U
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);
' O9 E$ P: s% _' ]3 _: ?
                    u8date[1] = *pu8TimeDate;
0 @* U+ ~- f! n
                    break;

. }$ w' O7 }* M$ e
                case 6:
2 u& d% L) t; ]* G
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);
% o  o1 `$ f! Y. p3 g! u
                    u8date[2] = *pu8TimeDate;
4 Q- _) L5 A; G9 s2 p
                    break;
" A* K! a. Q5 J3 g
           }
) P# g1 w2 e4 r7 h% A! D
           pu8TimeDate++;

7 M0 `! [; @0 `4 V$ N/ I
       }
9 N! r8 L6 P& C( P3 d8 w
       if(enRet!=Ok)
6 P4 q) a( K! [/ o! E1 L' l8 l
       return enRet;

; L& H: U; J; J$ q
       u8i++;

: p0 ~! s. L" j+ g8 S
    }

/ z& g8 [5 h, ?" U/ _5 l- p* ]
     if((u8Mode&0x10)&&(u8Mode&0x20))
2 {2 o6 s1 I0 h. N- v1 B  x
         {
( T8 C. L. X- G
                   if(u8Mode&0x40)
7 h: }* P8 q7 B
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));
; d1 {* g& p- X/ o4 N5 }0 Q
                   else

+ q3 ~' A( b% ^3 U; }- f
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);
: ]3 G' n7 w! P, Q8 m
                   if(u8date[0]>u8mon_max_day)

1 \$ f+ x7 x6 i# I, o$ j) q$ z
                            returnError;
( Y! Y4 }1 b/ I/ ^* e- s' W2 b+ L' [
         }

6 I2 e8 \* r8 ?7 ?- u
         if((u8Mode&0x10)&&(!(u8Mode&0x20)))

, E4 k  m/ Z1 [4 t& `. @
         {

: h9 k/ V, b( c+ V# Z% k
                   if(u8date[0]>0x28)

1 k) i$ b/ I& x9 A# U) ?* W# M" S$ Q
                            returnError;
5 L' Y- T; ~& R, D& j1 |/ F
         }

. ]% K+ m) v' S7 n* d
   enRet = Ok;

9 T$ I& k6 `- P; y
         return(enRet);

. v) L* x  g6 y, g$ K
}

7 ?# D9 w' W" V  u9 G7 `8 o
/**
" i( U( ]& h) @0 K% K
******************************************************************************

2 }( z9 w9 i: l
**\brief  RTC设置时间函数
5 l4 r% M+ K6 ?; G6 e
**
3 D+ O) k4 f0 |' v* B
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期
8 Q1 t# ~. Z9 i
**

$ y9 H& P; s& k
**\retval Ok  设置正常

, P4 K) O3 x1 h% R' X. z# v; K
**\retval ErrorTimeout 时间溢出错误

+ D" {3 q; w# [: U, C  W
******************************************************************************/
: {" U- v* o4 s3 U6 s1 L# t% C2 n$ g4 S0 Q
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,

7 j% p8 V4 b5 j$ d
                            boolean_t bUpdateDate)
# _% X9 p* o% ~
{

6 r3 J8 x  O, k  U6 ~1 L5 e2 f
   int32_t u32TimeOut;
% g$ Z0 W6 c4 c1 d5 D
   u32TimeOut = RTC_TIMEOUT;
$ w0 x* t3 a; E( Z# k& W' u! V) G
   uint8_t* pu8TimeDate;
2 g$ m3 d$ d& k* c: S' g0 K4 Q
   en_result_t enRet = Ok;

  m! G2 |0 u' J4 P7 t
   pu8TimeDate = &pstcTimeDate->u8Second;
$ t4 a, C: F3 e' S8 I
   ASSERT(NULL != pstcTimeDate);
' g% d. Z8 A+ B, g2 f) I2 K
   if(1 == M0P_RTC->CR0_f.START)

) U  t) ]( C/ a, d$ M
    {

$ i2 s1 _+ w/ i/ r1 h$ e  A' B, S
        M0P_RTC->CR1_f.WAIT = 1;

3 b( S; n, g7 t
       while(--u32TimeOut)

3 \  I/ v  Q  ^' {
       {

& m! w9 U& C6 ^: p; {8 I- Y
           if(M0P_RTC->CR1_f.WAITF)

& F' K6 E5 E, c3 i; ?7 U- V# v
           {

. w% \& T9 a. D, P, e  k+ v! @
                break;
! D# \, s- ~# B9 w$ K' A3 }, ?) x
           }
* Y* j1 F4 n" h
       }

: @) j* y2 G7 C* Z
       if(u32TimeOut==0)
# o/ ~; H3 V9 O# T
       {

8 K% n9 G% u  c, o, y$ [
           return ErrorTimeout;
  K. t5 J5 ~. |/ ~/ B: \
       }
# q3 |* o) d8 ~5 C, t3 O- @3 D# K1 e) c
    }

0 T7 J( C7 a) a7 }5 F7 q2 C- y
    if(TRUE == bUpdateTime)
( m  a( s8 n" o; A: k9 c
    {
9 P3 i: k, T4 A! y# e
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);

. T6 a1 I* P! a! v
       if(enRet != Ok)

9 t! P3 v# w4 ?5 M" D' m  N
           return enRet;

# j3 t" c, O9 ]! R$ \
       M0P_RTC->SEC = pstcTimeDate->u8Second;
5 @  F% |: Q7 m
       M0P_RTC->MIN = pstcTimeDate->u8Minute;

/ K9 p; C' {/ t$ o! l
       M0P_RTC->HOUR = pstcTimeDate->u8Hour;

. g5 B3 f3 g. D: D# u) Y% E
    }
+ S) u  G+ f) R+ J
   if(TRUE == bUpdateDate)
0 H3 J( H2 d& U$ m* |% I
    {
5 _& I% O' I4 b7 v
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);
) X3 l9 I! {; u% W9 u% d. }
       if(enRet != Ok)

! c' G$ w6 v9 w" b: d
           return enRet;

9 s: x* s6 q: k0 @
       M0P_RTC->DAY = pstcTimeDate->u8Day;
6 ^  k! ~5 b( a
       M0P_RTC->MON = pstcTimeDate->u8Month;

# ^+ `4 e# p* `) n
       M0P_RTC->YEAR = pstcTimeDate->u8Year;
9 X) z. X* H# L$ d' k, h! g3 R
       M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;

; E0 K4 s" @3 X' y/ ~" \
    }

: K* ?9 d& R7 N* b. R8 J8 u
   M0P_RTC->CR1_f.WAIT = 0;

4 \& a$ n7 H/ ^: M7 R+ @+ {& w
   if(1 == M0P_RTC->CR0_f.START)

2 z# Y& c6 E" |6 k! s- p' J
       while(M0P_RTC->CR1_f.WAITF);
3 }$ M# ~7 m( t9 q+ {- b
   return enRet;

, z8 ]) v  q6 Z( x  P+ I
}

9 k, B0 n* |6 G7 h1 i. K
/**

- X8 v: Z$ J' D' c
******************************************************************************

' J, x, ^8 \# H3 ]; O
**\brief  RTC获取时间函数
: X! s/ ^( T2 i  N
**

* b. Y+ @9 ~1 l$ s7 p
**\param [in] pstcTimeDate日期时间数据

& z8 R) `- `0 e5 l$ d; m7 e; ~4 f
**
/ u/ O# O$ q) G2 c# w1 U
**\retval Ok  获取正常
' h2 S$ }6 }& F4 J. q# y5 f
**\retval ErrorTimeout 时间溢出错误
; M: m$ O& |& B( A& E
******************************************************************************/
2 O: r7 p* `9 V/ R
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)
% E+ @7 ]8 K7 H
{
& D0 k. ]1 d* `- D$ D
   uint32_t u32TimeOut;
' L) q1 n* L) `4 S* X
   uint8_t  u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;
) M. A( D+ e- `- T
4 G8 M% u8 i. ]/ R2 y
   ASSERT(NULL != pstcTimeDate);  

- e) k6 @4 i: K+ R5 @3 F  M$ z- T" y
   u32TimeOut = RTC_TIMEOUT;
7 H# u- Y+ o. f' n. q& @4 i4 R- l
   if(1 == M0P_RTC->CR0_f.START)

5 U* [" B7 m/ _+ ^9 N# t
    {

6 d2 _* S. y9 P, q, {
       M0P_RTC->CR1_f.WAIT = 1;
- \' o5 S2 U1 p# L' i: [" g
       while(u32TimeOut--)
7 b+ z; G) L# U! q
       {

+ _( g/ }5 ^% ^! d! a: h+ n# E
           if(M0P_RTC->CR1_f.WAITF)
/ c* |6 W+ N& @( U0 z- |. d, [
           {

0 M4 C7 a$ X' e7 g& a
           break;

* j0 Y' Y& h" d- j- r0 K7 ~+ j
           }

5 _( H  E' @3 M0 z
       }

# ^1 |5 N7 N- V/ U8 a3 |
       if(u32TimeOut==0)
7 G% }) B3 z" w9 u
       {

/ L1 K$ W4 e( E  A8 X/ B
           return ErrorTimeout;

" t# s) z! M8 }/ }6 k4 i* c. |
       }

7 p, i' e" k% ]
    }
# r6 u# B3 X+ ^
   u8BcdSec  = M0P_RTC->SEC;

& G- k( G! J" f9 F3 |3 X0 \- v/ y2 _
   u8BcdMin  = M0P_RTC->MIN;

' C/ L4 t* s. @4 X0 A0 |( H
   u8BcdHour = M0P_RTC->HOUR;
2 w* j9 A, s1 R
   u8Day     = M0P_RTC->DAY;
; G. o' U6 t/ ?- S5 f. V( M1 w
   u8Month   = M0P_RTC->MON;

1 i3 ^; \7 v# j1 Z  x
   u8Year    = M0P_RTC->YEAR;

8 a& L. x3 H9 N6 [! ], a$ u0 v( V4 C
   u8DayOfWeek = M0P_RTC->WEEK;

- o$ ?. G* o( {% [# V
! p. w; c2 A4 ~% L6 k
   pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);
6 x& O4 v, F% y  I5 e) H, d  ^
   pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);

# B1 y0 V; \* s  E: Y$ S
   pstcTimeDate->u8Hour   =u8BcdHour;//BcdToDec(u8BcdHour);
. g  C" W5 v- J+ V$ P
   pstcTimeDate->u8Day    =u8Day;//BcdToDec(u8Day);

, _4 v) A8 R% r9 k, V2 z
   pstcTimeDate->u8Month  =u8Month;//BcdToDec(u8Month);
/ E, a1 t' n" [1 A
   pstcTimeDate->u8Year  =u8Year;//BcdToDec(u8Year);
# B0 X( m5 i# p
   pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);
3 y2 U6 _2 A- G7 W2 u0 _
   M0P_RTC->CR1_f.WAIT = 0;

2 m5 k) g+ O0 C& _2 ^' z
   if(1 == M0P_RTC->CR0_f.START)
, A$ `8 Y; @& E6 G+ U* q
       while(M0P_RTC->CR1_f.WAITF);

, l5 l0 A# F0 j6 [6 l" U* W
   return Ok;

/ m% a& Y* {. q8 A2 E
}
8 j2 R% u7 g4 Y5 _9 y  B5 K8 w
/**

% }3 ?6 U/ p: t  o( E* ^3 T
******************************************************************************

, V; q' ~  S# H* S
**\brief  RTC计数or读写状态获取
, k* }: p8 L- L7 {! n
**

1 s* u; G4 F0 c. ]! ^5 G
**\param [in]
. {) r: d: s& u' P/ m
**
9 b) K; @5 ]# j/ Y  Z
**\retval 计数or读写状态
0 ?  I% m- ?/ w7 S1 z
**

, ~9 K9 t. Y; |7 t1 N4 l) d: X
******************************************************************************/
1 j) Y3 i5 o; z. R% G+ Y& F
boolean_t Rtc_RDStatus(void)

$ i7 F/ e) e7 V+ a5 h
{
' A& C" u' ~% K, s
   boolean_t bRet;
/ G% p$ b7 r7 T0 y4 ~1 O1 A* }
   bRet = M0P_RTC->CR1_f.WAITF;

* \$ E6 D8 c' l6 A
   return bRet;

* r6 D6 _" K3 |( L* t
}

; w/ ~/ P# L& e# O: m
/**

$ V- v' A( W- \
******************************************************************************
) V$ X' {; L$ O) q2 X; K
**\brief  RTC闹钟中断使能

- ^) M: |7 y) h/ |' q  q' N
**
5 t0 L7 V8 o/ h6 M. {
**\param [in] enordis中断使能or禁止
- W  U) v) e; H7 F) K& g0 B! M' E
**
3 f* G( Q/ X0 A1 B, I4 n, N& S
**\retval Ok设置成功

( A7 b4 I' \3 r* ?4 e( j2 ^! ?5 `
**
0 {7 I9 l0 p% i) S. s
******************************************************************************/
& S1 r6 {5 V% o* O: P7 m% \
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)

, [3 w0 M( Q* ~& H
{

4 J5 I/ c% J" X
   en_result_t enRet = Error;
5 q, s3 A5 M0 T: d4 q
   M0P_RTC->CR1_f.ALMIE = enIrqEn;

: D/ K) s" `9 j% n, n4 O
   Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记

* b  o! x! a& C9 \- R9 v
   enRet = Ok;
) M9 V& }) ~) M+ m
   return enRet;
# j5 q' h: `" A" I1 U# O$ r" v
}

: b1 }0 L' ~. J, a- n  n$ U
/**

: s. b0 C3 ~. R1 v' `
******************************************************************************
# w& Z+ U- g: T! h
**\brief  RTC中断请求状态获取

) M5 Y: x; m) S% O
**

( Q, R6 O- y# r* A; j5 o
**\param [in] enIrqSel获取哪种中断请求

* Z) h1 k+ v; a& S
**

: T7 @4 f2 u( G0 l; j! W
**\retval 中断请求状态
6 U; z: s! G2 j: j  }9 t
**

+ Q( N( q- p2 w4 l1 ]
******************************************************************************/

( U' l( N9 V9 O$ _. ]% O( {+ V4 `/ L
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)
. s, v* z/ O' t, T
{

* o% U6 N! s+ n3 s
   boolean_t bRet = FALSE;

1 H1 y2 ^! j$ L  H
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));

( A7 Y4 i( D. _1 v/ S
   switch(enIrqSel)
, y2 ]6 S$ |2 ~
    {

5 i* R* z, ]3 H; z
       case RtcPrdf:
, K- b" r- B6 c! |* }4 n4 S
           (M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);
5 H# J  x/ h7 w- M# O( T
           break;

  x/ D- @# a- r7 ]
       case RtcAlmf :
$ K, X  T. U5 W# |" s
           (M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);
  d1 G5 Y$ o6 {, w6 K  ]- J
           break;

2 }! I! _* l5 w* s! a, L
       default:
, J0 i( S- A/ |, V" }
           break;
: o1 X" _$ V9 m% s1 V
    }

1 w& A& H7 [" r% r2 S5 ]0 s
   return bRet;

8 s' b# K  g" H. V8 O
}
* ^+ @5 X: a, `2 F7 r
/**
# P% F6 A; m0 ~& ?
******************************************************************************
& F) P% I2 z) a" J, R
**\brief  RTC中断请求清除

1 g, V+ n/ o! ~
**

' E" \9 {! t4 _% c8 V) n
**\param [in] enIrqSel清除哪种中断请求

6 C' c& z- {/ y$ H+ Q8 d7 ~& a6 [
**

! f6 B' j  g% M/ \. c# }& h+ w
**\retval Ok 清除成功

. V8 M0 h; a9 m* C( [
**\retval ErrorInvalidParameter 清除失败

& D3 J* q# v( B5 R
******************************************************************************/
- ?% ?9 h& I  A6 O4 c9 e  e
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)
7 A# P4 o! S, N* n: M- {$ e; U
{

% C2 |0 S5 ]! C5 p; b+ a/ m2 H
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
  j) g( L8 u5 p
   switch(enIrqSel)

) L: s. \2 P4 r
    {
7 \* {* T2 T& L
       case RtcPrdf:

2 a+ |6 R7 w2 C7 [3 j, w% i" N+ O
           M0P_RTC->CR1_f.PRDF = 0;

0 v, e: y1 _' m2 F+ ^* t3 W
           break;
+ f6 ^; f0 F9 x  u6 W3 i. z( ?
       case  RtcAlmf:

4 X$ @0 k  d( l5 g4 y
           M0P_RTC->CR1_f.ALMF = 0;
# E2 G. L) K5 |2 p
           break;
$ I9 I3 b% ^8 {- F* p1 O, a& F" L
       default:
; K& U" h+ A) _5 Q
           return ErrorInvalidParameter;

8 o. R0 H* {. {! @2 G# E
    }
) p, F* J7 M# u/ ]' x
   return Ok;

# z5 K: ?" A: M1 D
}

3 n! q& Q5 N8 M( C2 ~% z
/ Y+ k# U* o' I! v; w
/**
1 z+ X0 c# m& w. [- o
******************************************************************************
/ d5 {7 h# t; M* A3 R% u* ]
**\brief  RTC中断处理函数接口获取
0 l! a2 L# u( n5 E
**

2 P* d3 L+ N0 g$ K- |# {# a; H
**\param [in]

. _7 ^3 Q+ T+ F8 |9 x  u2 S2 t
**

2 N6 {; g. p, u0 v) g
**\retval 接口函数地址

- b! u2 E9 O, `6 U
**
+ V, ~  ~3 r3 K9 [% ~
******************************************************************************/
. @/ ~8 A* \( O% O# H' E3 M6 I5 m5 G
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)

4 P" \, M0 A: S. E; E5 |, ^
{
- |: a9 h2 |. o. ^9 m
   return &stcRtcIrqCb;
$ z: L$ M! Q% Z: u4 W; k  y
}

$ U* U5 }2 \1 M, M6 O0 p8 H, j
/**

/ p/ o' C5 x, o0 l! \3 ?
******************************************************************************
$ t0 l# J" B1 E' e# x
**\brief  RTC总体初始化函数

% W/ R* Z& g  ^' |4 a3 q
**
5 {& D/ x1 M! w8 G( u
**\param [in] pstcRtcConfig初始化结构
# B+ u9 n: P$ z& \6 p' c/ b
**
$ K$ f$ J  g  K0 x
**\retval Ok初始化成功
- C: a1 @$ L! Z
**\retval ErrorInvalidParameter 初始化错误

; i, u, W" n0 ^" l& j0 b5 j- @6 C
******************************************************************************/

! S" l8 ~6 q; H5 w0 `
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)

- y7 ]+ \3 p& T5 W! K
{

% }: t. E- v, Y  z+ B; E. x/ R' v+ `
   en_result_t enRet = Error;

/ m5 `  k) r9 v+ E. l* k
   stc_rtc_intern_cb_t* pstcRtcInternCb;
% l1 X" Q4 v& U% A' a
   if(NULL == pstcRtcConfig)

" R) ]3 z: }7 Y8 l
     return Error;

. j7 @+ ?6 ?4 b2 _6 g
   pstcRtcInternCb = RtcGetInternDataCb();

# ^/ e7 g# f4 o, ?
   enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);

8 {$ [: ~# y# v$ w
   enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);

4 X9 ~1 b. M( C) b4 o1 B5 W
   if(enRet != Ok)
5 t; G$ S- \, \" _2 O% t% A. j
    {
- F+ ^0 x! W% b- K2 v3 j; |! c1 t
     return enRet;

0 b+ F$ W6 {; r0 U8 a
    }

1 J% s1 z6 r+ ^7 x: j- G, s/ U6 ~
   if(NULL != pstcRtcConfig->pstcCycSel)
2 w) z. G7 S2 }8 L% U" H1 o2 u
    {

6 c2 R# R+ }1 W( R8 F. m
       if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))

! E* p9 h- U/ h5 O0 N/ J
           return Error;        
' G, Q5 I* `5 k; k/ ~
    }
6 B2 G! e3 |; ]1 d( x4 N' F6 [; P
   if(NULL != pstcRtcConfig->pstcTimeDate)
: n: r1 g0 J1 T$ H6 p
    {
. U, ]3 H: J) w" V! B1 S
       if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))
- k! t  s% ?4 p* C5 @
           return Error;

0 n0 a5 I* I! b$ B, Z! S1 R# w; ]
    }

2 @+ U: o8 e" [! ^7 ^) z
   if(NULL != pstcRtcConfig->pstcIrqCb)

, [1 |& ^* `) ^1 a$ A7 |" U
    {

5 W6 I& |5 V$ y
       pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;

! b5 |* a% z; B1 C+ {/ D+ a' K
       pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;

, T* o, i' u& W. w2 V- e* C3 z
    }
- A& f$ N3 k& A2 z. `- U
   if(TRUE == pstcRtcConfig->bTouchNvic)

4 B$ Z. @" p8 E2 R4 [! g0 o; Z* R
    {
6 A* s# O- i. h
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);

/ @3 ?2 z& W- `0 h2 p
    }

* E3 y% ^0 J% I, I5 X
   else

: k: N$ m2 u# n% O* l6 v
    {
7 R+ O) R2 n) ]! ^, r8 a
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
9 }& _0 L/ @3 ?
    }

$ R) z) i+ w# @8 `+ p6 O
   return enRet;

6 q, X! f; S0 j9 o
}

7 x, W7 S4 {1 l' p" N1 s
/**
  R3 G* X5 x( P' J) I' N3 M* c
******************************************************************************

: g3 d. X( \. ?8 M
**\brief  RTC计数禁止函数
; `( z6 Z4 T1 c4 R& b) t" ~  D
**
, k" R/ ~! w5 y4 c* M! w; h  e
**\param [in]
& _0 Y8 V8 d& G4 w1 o  t8 _$ Z
**
, Y# i$ L, `4 t& J5 e
**\retval Ok禁止设置成功
$ @& V. j6 K, e% Q8 k% i% W- s
**

6 S- D4 ~- |& v
******************************************************************************/
9 h  u$ ]- z; a9 `/ r/ \9 ^
en_result_t Rtc_DeInit(void)

3 F: }2 v/ s- p. l4 g0 a0 `! T
{
& G9 w; s+ L! G( |- j, j
   EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
2 j" I8 v" w; U1 w0 s
   Rtc_DisableFunc(RtcCount);

% h3 W5 N  Q  S! [5 P/ q- ^5 r; ~
   Rtc_DisableFunc(RtcAlarmEn);

" q$ V# H; z7 I2 E% u3 @
   Rtc_DisableFunc(Rtc_ComenEn);

9 N! _9 b: L$ x; Y/ s3 s
   Rtc_DisableFunc(Rtc1HzOutEn);
6 Z, a3 v8 T. ?. r( a; ~& W& v* S2 |# K
   return Ok;

  k0 f/ _8 ?3 r1 ~5 L; K
}
5 Q4 m7 _" H( l& F+ `0 a
/**

/ N( B$ M$ y- h) m5 R- \
******************************************************************************

7 Z3 K* N- N% O: w4 ^- L0 I
**\brief  RTC中断处理函数
8 t1 N; F# r; L+ w- W
**

* w; r5 A& w; P+ R; u; ~' g
**\param [in]

+ n6 ~, O3 X$ \4 W6 z& Z6 [8 g; Q8 R
**
8 Z  h2 [; r$ R
**\retval
$ w* j) n8 o9 t( Q( E0 b
**
/ {7 e" s0 Z/ p! \* n9 c9 g+ l
******************************************************************************/
2 k) f# v0 m) e0 p5 t' c
void Rtc_IRQHandler(void)

( Y; [, ?5 Q3 c% {
{
. b; f/ g- U" ^5 g5 {
   stc_rtc_intern_cb_t* pstcRtcInternCb;
; g( E4 |8 A  |- ]* |# d
   pstcRtcInternCb = RtcGetInternDataCb() ;
" c" W& ?+ W# M1 O& w- @3 P
   if(TRUE == M0P_RTC->CR1_f.ALMF)

) x5 C6 b8 H: w! ^
    {
- q- p; z1 q! d0 y3 z) _
       M0P_RTC->CR1_f.ALMF = 0u;

2 M# o6 _* i: p/ y" [
       if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)
# L% `3 o' ?. U9 O: g2 f% Y
       {
% i  f; M7 c7 R1 w
           pstcRtcInternCb->pfnAlarmIrqCb();
2 z" e/ P( i/ |  v, O
       }
5 F: F+ {) }9 L. k: H
    }

9 D5 H8 \3 u$ x/ L) c- S$ o
   if(TRUE == M0P_RTC->CR1_f.PRDF)

: x  M5 F) k8 H* q8 ]: v0 ?
    {
: H; ~  a$ |! S( ]. ~9 }
       M0P_RTC->CR1_f.PRDF = 0;
% D& E$ h3 x/ ?1 A2 a4 U* x
       if(NULL != pstcRtcInternCb->pfnTimerIrqCb)
/ ]2 g& i" [1 r
       {
5 r' Z. C# n8 U- A: R
           pstcRtcInternCb->pfnTimerIrqCb();

: `% }5 q( C. j1 b0 ]7 O
       }
$ W- ]! ^. D: V; n! ~
    }
% G6 O6 t5 b! p0 h8 E) w3 l; m' C
}
' g! Y1 r( Z4 A% J) W+ K! n8 A8 p
* h  u7 V8 Z8 H/ S
0 g- D3 U; D- E7 J. s5 H, @
static void RtcCycCb(void)
  V5 X. s3 G. e6 x) A' v) m  @' b
{
' ]+ l7 C% m( ~- S( g
   cyccnt++;
' f( I5 f' R1 ]1 p1 T6 u, n  t
   flg = ~flg;

1 m8 `5 l3 U, ~& B) Y9 r+ h( e
   Gpio_SetIO(3,3,flg);

4 I; A5 W: _$ L4 v
}
, f: r8 G5 \) v8 S
static void RtcAlarmCb(void)

+ k8 l  {. Z) u% y
{

! G- [3 p* z. u2 e8 v' B
u8Alarmcnt++;
& m  V& \5 }" |
}

6 P& x. j" i. z- g
int32_t main(void)
; b5 ]2 o. ?8 y2 N
{

  \! Y% F: G$ ~; q
   stc_rtc_config_t stcRtcConfig;
. c" B. D/ y0 ~  M# Z: }) C5 v
   stc_rtc_irq_cb_t stcIrqCb;
- _5 F8 a% e5 n3 i$ G7 H4 ]
   stc_rtc_time_t  stcTime;

5 ^( p* p& ]: }! @1 F
   stc_rtc_alarmset_t stcAlarm;

" r& a% @; k' _7 \$ \, j. h
   stc_rtc_cyc_sel_t   stcCycSel;
1 S! r- b# j  y  R( ~. S. n# U
   DDL_ZERO_STRUCT(stcRtcConfig);
+ r6 L) T  E$ L* ~
   DDL_ZERO_STRUCT(stcIrqCb);
3 J& C) P4 R$ Y3 ~3 r' h
   DDL_ZERO_STRUCT(stcAlarm);
9 a% \- H  M; k% T) ~# Q6 j
   DDL_ZERO_STRUCT(stcTime);

4 n& }5 {, C$ L* Q0 D1 q
   DDL_ZERO_STRUCT(stcCycSel);

2 f  E+ ?% X# a2 o7 x  d
   
; s# r' J" P4 g
   Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟

9 e8 X, d& c: P. L  h' i
   
) w9 X# S% h$ |$ Z/ }; b4 ]
   
2 |/ _! k% _* @8 _6 E. q+ t- c' u
   Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口

7 w0 o8 h: u" X
    Gpio_SetAnalog(1,5,1);

+ r7 D0 S' W) n3 \* j; N" P# H% m
   Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768   
* ?' K4 x% V, U! Z, ?4 L3 I8 u
   //Clk_Enable(ClkRCL, TRUE);

* L2 s$ e% M. z2 I" `6 W* r. [
   //Clk_Enable(ClkXTH, TRUE);
5 b6 r/ J" |( K- J
   Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟
- K$ C: r7 }2 p% m
   

3 b) L0 _, j, I7 p6 A
   stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//
1 s6 p. q0 `; r) `- e; U* H/ T
   stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//
# l* q! c# p* S5 u# [$ q3 S1 D; m5 x
     
) V0 B) o0 U8 Q& |5 d
   stcTime.u8Year = 0x17;
( m) |3 Z4 X+ b( |5 U0 p6 r% ~
   stcTime.u8Month = 0x06;

! o: y) l! A& R' Z
   stcTime.u8Day = 0x07;
5 e; N0 x% R( x/ k  \
   stcTime.u8Hour = 0x12;

$ a& J. O2 ~% S9 N( w, U" Q; D; h
   stcTime.u8Minute = 0x59;
' _  b) h! d$ m' f+ a' ~# i
   stcTime.u8Second = 0x59;
2 m" N% r: M, s" Y* R
   stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);

4 K1 b1 X" X. S5 Q
   stcRtcConfig.pstcTimeDate = &stcTime;
6 i0 I, t9 B( r! c9 Y
   
, e9 r9 i- H$ J! n
   stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;

( A* m- \  I# p' K: r5 {/ T( z5 ^
   stcIrqCb.pfnTimerIrqCb = RtcCycCb;

0 r& ?4 a  ?6 b+ C
   stcRtcConfig.pstcIrqCb = &stcIrqCb;
4 |6 b( e, v' C9 _
   stcRtcConfig.bTouchNvic = FALSE;

: p4 T+ k2 Q2 u! O" j7 w" Y
   

4 n- _3 [& E* l5 S
   Rtc_DisableFunc(RtcCount);

$ B. C+ P" `5 T5 @
   Rtc_Init(&stcRtcConfig);
+ {) S- }' Z8 q( j! d5 c& @7 b& M

5 K* V: G* U+ |, D
   
5 \+ W- u( a( \. ^+ s$ A- H
   Rtc_EnableFunc(RtcCount);

2 W0 t7 ~: K* y) a+ R! O# E
   Rtc_ReadDateTime(&stcReadTime);
5 t4 r2 i, o  w: F* _3 W- L: _, i
   while (1);

# H6 q" b9 }- y) t4 q* ^# q5 v

1 q+ D$ Q6 B1 U
}
' \3 }5 u6 ]  J: q6 s
" r2 O  e' R1 e8 f9 i3 g% ?" k! D
/******************************************************************************
# w; c+ D' z, r6 @$ ^2 f
*EOF (not truncated)
6 g( ~1 k( d+ b2 K/ k1 k
******************************************************************************/

! |# C7 a0 Y) U; y# q

: s9 `  \% f# Z, t; D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-4-28 16:42 , Processed in 0.070352 second(s), 32 queries , Gzip On.

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

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

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