找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

4

主题

4

帖子

60

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x

) i# x( `% J( H: i
/************************************************************/

- P0 c; ^6 V- j
/*******                 样例使用说明           *************/
/ Z- r1 w# V6 L7 V+ O$ D$ O
/*******                    版本历史            ************/

# P( E2 j4 e% @0 A% W: a/ ~
/*******  日期       版本    负责人  IAR   MDK ***********/  
* e* D/ x9 r, W' I/ H% e
/*****    017-07-14     0.1     CJ    7.70    5.14 **********/

2 H6 b% K: B+ l' e
/*******  QQ:3386208645                       ************/

# ?! p; B6 v0 t, ?9 r

; b; L0 s, u7 b# b4 i2 y
/*******               功能描述                  ***********/
% v# N! v; t  S- `$ D; _! r
/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/
, {" m, Y* O% d
/*说明:                                       *************/
$ Y* V4 \3 Q1 z  l# S0 ~
/*计数初值写入计数寄存器                       *************/
3 P- I6 g( I+ J
/*启动计数                                    *************/

( H8 X; F* d( l6 o* j
/*读取计数寄存器数值                           *************/

: R  N2 o# @; Q' B( \4 q9 H
/******* 测试环境                              *************/
, x7 a0 g* c# e1 w6 x) w. t& t
/*     测试用板:                              *************/

2 F' b* G" |. B
/* SK-L110-TSSOP20 V10                        *************/

$ N& Y8 H7 h2 N% m1 I
/*******辅助工具:                              ************/
# Q/ v/ B9 N4 _9 \) _
/*  JLINK调试工具                           *************/
, l4 p6 y( X4 K
/************************************************************/
! R0 r4 m2 |! }. }$ ~) [/ _
#define IS_VALID_CLK(x)             (RtcClk32768 == (x)||\
0 e4 U' Y3 S3 @
                                    RtcClk32768_1== (x)||\

* x& N2 i, @5 ?
                                     RtcClk32== (x)||\

) M9 L( b# u5 K, }  ^  a+ o9 g1 s
                                     RtcClk32_1== (x)||\
/ z; O# A2 k: G9 z5 \$ g. z1 p
                                    RtcClkHxt128 ==(x)||\

) a* t6 s' ]0 {( ]+ }! L( ]
                                    RtcClkHxt256 == (x)||\

! t8 u  l( e% ^  Z. X: ?* O
                                    RtcClkHxt512 == (x)||\

( `5 v2 d: r1 [9 L9 b# N# k% n2 g% q
                                    RtcClkHxt1024 == (x))

* b0 ~2 ^' h8 q1 }" C5 S/ J: ?/ v

" D, I. `4 H* b' @$ D( a5 s1 v
#define IS_VALID_CYCSEL(x)             (RtcPrads == (x)||\
( c0 i* i; [/ z
                                 RtcPradx==(x))

, Z, R9 n9 S" c7 }+ _; [  S

5 |' P1 D/ y+ D1 N5 l% l
#define IS_VALID_PRDS(x)        (Rtc_None == (x)||\

; ?% `( R( E6 \' U- P
                              Rtc_05S == (x)||\
% n5 Y! o# F7 S' y4 {
                              Rtc_1S == (x)||\

" ?* v3 \2 A6 m4 e9 g) J9 u
                              Rtc_1Min == (x)||\

9 n% p& @; H5 c/ ~* H& b* t
                              Rtc_1H == (x)||\

, O) d' w3 d6 t; X
                              Rtc_1Day ==(x)||\

: O4 Q  l) F- \2 O
                              Rtc_1Mon ==(x)||\

) k1 D- ]. W1 w$ e  D
                              Rtc_1Mon_1 ==(x))  

, e, t- e; d0 ?" a# `

' r) r, \. y' m; g! O/ q2 z7 X
#define    IS_VALID_IRQ_SEL(x)      (RtcPrdf== (x) ||\
) E2 A* ?. e" k
                                      RtcAlmf== (x))

8 u0 h( M  K. O0 P! ~% ]- Z

' {2 B/ j9 `  P1 }+ J' I7 y% C# c
#define    IS_VALID_FUNC(x) ((RtcCount<=(x))&&\
6 W" W9 w8 G( x& k/ V
                              (Rtc1HzOutEn>=(x)))
( p1 ^( N& B: z  i/ R$ ~, G; J
#define    CkDateTime    0x7F

* ]* u- s. G5 U: Y4 e
#define    CkDate        0x78
4 f9 T, j. |% W& A  A
#define    CkTime        0x07
' Q9 w! }2 ]$ o* h, D% g3 s% P+ v
#define RTC_TIMEOUT             1000//test 1s
* S* J2 r- @6 m
#define    T1_PORT                 (3)
+ `3 H* o& |- Q6 e8 K
#define    T1_PIN                  (3)
8 |1 f! v! C0 J+ [/ I: D
uint8_t cyccnt=0;
/ n6 G3 G5 M7 v1 M% c
uint8_t u8Alarmcnt=0;
" ]6 q4 i' y! P8 c( ?9 j8 r8 ?
uint8_t flg=0;

3 ]- o" I- `9 O! O4 y2 m* }
stc_rtc_time_t  stcReadTime;
( @/ y" |5 s, ^) J& w  ~
9 s3 r3 T, v; {. q
/********************************************************************************** \brief  RTC计数时钟选择

; q5 O. Y0 {  F
** ** \param [in] enClk时钟源

& B0 u3 R) {, P1 h
** ** \retval Ok

' `! @; a0 G' X
******************************************************************************/
* q6 O7 Q. Q! s7 x; i5 J
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)

: R4 w( H( M; i" b; A4 v
{

; p* }6 ~. B  b6 v2 ^
   en_result_t enRet = Error;
' ~9 u( R9 {* X) R7 l$ _
    ASSERT(IS_VALID_CLK(enClk));

  q4 M1 r  G5 v9 m
   M0P_RTC->CR1_f.CKSEL = enClk;
. j( N5 v/ n* H2 m4 l
   enRet = Ok;
! A+ K- U6 o7 C5 }5 P4 d
   return enRet;
+ k& }( s* t) Y* s9 r
}

( u4 t) A7 i* Z  |& j
/**

3 {- C1 B% S+ d3 \; h: a9 f
******************************************************************************

4 k9 Q" f+ v  W6 o5 `$ L
**\brief  RTC周期中断方式选择

1 T) O0 }( \% T8 X+ Z% ]
**
, T3 ?. j# M3 r6 B4 G" J
**\param [in] pstccCyc周期中断方式及周期间隔选择

2 P* w, c: Q; a  @
**
3 \1 o1 x1 q7 z$ `" j6 e% U: G8 C1 |
**\retval Ok

; _, w5 w$ w* i$ v8 T; u# s
**

# [) o0 t) [$ G, I* H, K" a% J
******************************************************************************/

2 l$ ]6 L2 Z- U2 B4 X$ t, Q
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)

  a. w* z/ y" I( N
{
/ d  K4 f/ H3 W' M" c5 r: O
   en_result_t enRet = Error;

2 _" Y* k+ \7 g* Q; z: U( m# g
         ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));

4 i8 Q( `1 _: n: c$ P0 o
         ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));
: W6 g: {9 ~* Q
         M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;

3 P5 {) Q- a" O2 _/ z
         if(pstcCyc->enCyc_sel)
9 h' a1 I. ~* {( T
    {
5 M) A& X0 ~4 b: A
       M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;

; `1 q* |8 c& U% Y+ M: n; d
    }
% f  {+ S. S4 s: ~8 l
         else

. g0 z3 c$ O  K9 s. e* A7 Y
    {
+ X7 ]/ C% f2 d
                   M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;

. [5 t6 @6 C+ q/ {
    }

( x  \( o3 q- o8 U0 u& _. ]
   enRet = Ok;
+ z' y- W* A, ^$ E5 m
         returnenRet;
2 W' g8 Q) @4 N3 E+ s
}
" ~7 s, X- [: {0 N0 b" }% m( b$ L
/**
; f9 J" y+ x5 C; ^& g% z7 P2 \
******************************************************************************
5 L3 |) }6 L& J4 N1 Q
**\brief  RTC时制选择
+ h8 l0 c) u9 U' N3 V
**
4 K0 g- A2 b: `# P1 `, d4 ^* B
**\param [in] bmode12时制or24时制

/ ?" c5 U! l4 m# K! n
**

5 R8 f+ g- C* D; r% t! K
**\retval Ok  设置正常

8 l, S; M3 t# V& X$ m
**\retval ErrorInvalidParameter 设置异常
' i, m0 _2 b5 v% e; ^& k
******************************************************************************/

& F7 A- O7 o' y+ Q5 D5 P8 S
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)
6 b4 d, k) N# Y# r
{
% P6 I$ ]1 z, G) n& `; D2 W( w2 z
   en_result_t enRet = Error;
+ z3 X3 K5 g) M
   switch(enMode)

3 ^) J4 q5 b2 @
    {
3 L% g+ H. g) G+ B
       case 0:
# k6 f8 P/ ?4 J+ Z
       case 1:

/ [: O4 ?: a. t7 Q+ D; Y# c5 \5 |+ K
           M0P_RTC->CR0_f.AMPM = enMode;

4 E) F2 h5 R1 J
           break;

; y4 h) }% l6 A, q: m8 C
       default:
0 `+ _9 O; A  @9 j$ o
           return ErrorInvalidParameter;
5 Y4 d* F% n1 W
    }

6 Y2 C% ~" D+ F9 @/ q
   enRet = Ok;
' u+ g! z; v) p. c$ B5 e7 H
   return enRet;
1 v" C" u8 a8 T
}

* ?4 F5 i; Q7 y  t. J, ~
/**
! o7 N, f; Z& T$ s5 L; p
******************************************************************************

: h4 M$ ?1 _$ C% S* i% w
**\brief  RTC闹钟中断设置
7 j$ f$ N$ \3 T
**
& Q9 R1 x: h: m
**\param [in] pstcAlarmTime闹钟时间时、分、周

  }7 ~; i& P  _/ f! P9 A
**
1 B/ }4 B* W8 r, J3 [7 i
**\retval Ok  设置正常
) P4 a: J  y$ ~. ^9 g( W' X7 v
**
) K# y6 u( a/ x$ I5 s4 I! ^9 {2 |
******************************************************************************/
5 k/ B, C) X7 [4 G" e
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
& p" p9 r( ~3 `/ ?, c+ x* ]
{
* {9 a" G( F6 t& R6 c6 d
   en_result_t enRet = Ok;
* d' H# E  v. F8 r) E% o& _
   ASSERT(NULL != pstcAlarmTime);

/ R# V+ _$ n2 \& C
   if(Rtc12h == M0P_RTC->CR0_f.AMPM)

/ P0 u, g& |5 e3 d  t$ @, x( B
    {
3 C9 C' ~' e- e; l7 D
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);
: B8 G, n7 \5 p
    }
- B* K$ y) W9 P) B, N; f4 H
   else

! N) U8 |$ m% Q" w6 ^
    {
2 L/ ~- Y7 R  B: e5 i, e
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);
2 t) m) D: o$ J- Z' t2 M* I: h( m
    }

5 @8 z0 }- f: V+ d/ {
    if(enRet != Ok)

* ^5 o1 Y9 Z( |) a, o4 Q) ^& v3 Z
       return enRet;

& K7 h8 F* I$ T: u
   enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);
* k( K& y7 @1 D  t5 N+ ~+ ~
   if(enRet != Ok)
. v, w$ d# u9 }
       return enRet;

0 `( X  ^; y9 c+ o* p" c& Q
   //enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);

8 {" x( t5 C: X! ]% n8 U8 b
   if(enRet != Ok)

7 f; W  N( o- U+ D0 N: W. C
       return enRet;   
$ \$ G4 c9 X* I
   M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;

9 c3 U! H/ M$ p; O7 j
   M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;

" n% P3 Y9 E, O7 M! I
   M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;
% J" v% j. T: z: H( e( j
   enRet = Ok;
- P0 C+ G& l6 V# i7 _
   return enRet;

8 c  l( N/ n, v) h- s4 w3 L, F
}
" ^, ?6 ^  U' J- f2 ?2 _  f
/**

6 w7 g+ l' }3 ~
******************************************************************************
# p2 B. L8 m! k+ h
**\brief  RTC闹钟中断时间获取
7 ]' X$ [& J: F. u
**
# N4 A: ]# [6 _0 _9 G9 D. ~
**\param [in] pstcAlarmTime闹钟时间时、分、周
0 D2 E& Q6 m7 C5 H* q8 l
**

4 N! [; w8 n' {0 M/ W9 v2 j
**\retval Ok  设置正常
$ O  e6 X' b# @, o
**

! D% X& A1 E9 K  i9 ~  f
******************************************************************************/

2 y$ K7 k3 i, R  B  E
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
7 |3 a9 i5 a5 S; |
{
5 ^' ?1 y- v; Z' N& Q
   en_result_t enRet = Error;
! }$ `/ }  A4 v. x. @. G4 m
   ASSERT(NULL != pstcAlarmTime);
, ?/ m( z5 P# {) |* Q5 v' T3 |
   pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;

" c% Y) x7 ?9 e
   pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;

+ ~1 L5 x8 k" \* X0 v  `- v
   pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;
* U# k: ?2 B  \# ?
   enRet = Ok;
2 @$ `( `9 T# ^% I: O
   return enRet;

: ], R$ v, u2 g' E
}
) u- a& x# p! }* k
/**

) {4 W9 w6 v) d' e
******************************************************************************
- \3 P5 Y9 B0 S; y5 ]
**\brief  RTC 1hz模式选择
% R8 ]/ N" t0 o9 K
**

! @( t! O& K0 c! O- M/ t2 m9 {
**\param [in] bmode 高精度和普通精度
4 F" q) G7 R5 _/ [2 @" j" m
**
$ d6 f# `. G8 F: Y* V- n
**\retval Ok  设置正常

) b8 L/ _6 z7 }" H' }) y
**
. ]9 x& t  v  D$ `
******************************************************************************/

0 p6 K8 v) [* k$ F  ^2 [
en_result_t Rtc_Set1HzMode(boolean_t bMode)

& F7 d4 a3 i7 I+ h
{
# m+ r. j0 v% @) n# z5 o$ k
   en_result_t enRet = Error;
$ ~9 i# R: e+ o0 x! u: m
   M0P_RTC->CR0_f.HZ1SEL = bMode;

2 U" Z! }, w( g4 V
   enRet = Ok;

) E5 G0 z4 k- s9 Y0 Q) `) B
   return enRet;
' v# D# h( P6 X  {
}
: j* S/ f1 |) t0 m5 w5 K
/**
) L* N. ^, q4 K/ K$ A* G: Y# [
******************************************************************************
- w! q- t9 t; K5 ]) g6 z; `7 I
**\brief  RTC 1hz补偿值设置

3 w, l( W8 U5 S0 U1 V
**

- f- ]# }5 @6 j0 V
**\param [in] u16Cr 补偿值

% B2 P( y$ n7 d. r% {' F
**
) ]( r* [4 g# [. K
**\retval Ok  设置正常
# g; D7 u3 [4 ]- l, _0 w, d
**
; I& D) f3 b7 l5 s! v; }9 @
******************************************************************************/
1 Q; t$ x! Z/ O% G
en_result_t Rtc_SetCompCr(uint16_t u16Cr)

* U* x" U1 r& U9 ]
{

. B+ i+ S9 e# R+ L2 }
   en_result_t enRet = Error;

, L! B! P4 H6 b4 @
   M0P_RTC->COMPEN_f.CR = u16Cr;
4 n' R4 S* O7 y0 S$ f
   enRet = Ok;
& k! _+ }9 \! b& J3 d' t
   return enRet;
7 E" q) O: R7 {- C6 I
}
6 n5 Z, K/ f* K4 e# P1 E. r. q
/**

8 @- Z6 L4 W% p. W# B2 o; Q
******************************************************************************

2 a4 ?( U3 k0 ^7 U: A* r  H, }( I
**\brief  RTC 功能使能设置
  q7 i& k) @/ N3 u# W
**
) a# Y1 ^7 _5 J! C
**\param [in] enFunc 功能选择

  }& c& E, N; |1 T! N# M9 a+ d1 H
**
, n( ?/ K1 J. p+ S% t
**\retval Ok  设置正常

$ D. M) T& m" b4 ?3 O
**\retval ErrorInvalidParameter 设置异常

/ I- ]" u9 H/ N- S7 ^
******************************************************************************/
" M% H  \& E$ e& ~& C) v
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)
. y& W9 s6 C7 ]. y
{

6 X7 F- z* T0 C+ N2 o
    ASSERT(IS_VALID_FUNC(enFunc));
. l; w9 c% r0 S" n+ W. }
   switch(enFunc)
& Z% l3 l% [. d3 j5 A- G+ _
    {

. z( y: f/ H0 \& L! n
       case RtcCount:

9 b- y. w9 x. w3 e
           M0P_RTC->CR0_f.START = 1u;
5 }4 D5 g8 \, s$ e& F
           break;

# R5 c: D$ h0 T. ]8 c. Q. I
       case RtcAlarmEn:
+ p6 s% b- K3 J% i4 h1 Q% `
           M0P_RTC->CR1_f.ALMEN = 1u;
! F6 @+ m, O' w7 F; V# X1 X( c
           break;
) [  Q7 b7 J* y
       case Rtc_ComenEn:
9 F0 @0 z( {% \( Q' l
           M0P_RTC->COMPEN_f.EN = 1u;
5 q: z/ i0 }$ l8 u( k6 i
           break;

- g! r) w# M1 ^) l# Z
       case Rtc1HzOutEn:

6 k8 [+ Y6 l3 ?
           M0P_RTC->CR0_f.HZ1OE = 1u;
$ _6 r: }. A0 h4 j+ N. y1 k
           break;
; ]! K, ^+ w" o  [% |( b+ n
       default:
1 e: K4 p: w1 y7 Q; c
           return ErrorInvalidParameter;
9 `+ x( q- y  @, _6 d
    }
$ z" l, Z% q2 Y; ]
   return Ok;

& l- E6 ^/ v" y5 ]# V& a5 u
}

" `9 M& W  b& ~7 l2 d7 S  G
/**

& E1 l, h+ ~- }: ]" W( G
******************************************************************************

* J5 w! T  H. x
**\brief  RTC 功能禁止设置

1 }) v$ T# @+ c( X& z& X
**
( w& S2 F" P4 E* u. p& u: N
**\param [in] enFunc 功能选择
% \9 C7 N+ _- D' V1 Z5 e8 [
**
. u) g* h/ W4 N5 l+ k
**\retval Ok  设置正常
% }0 l* t5 V+ f5 s2 {
**\retval ErrorInvalidParameter 设置异常

2 [' X7 p9 q# Z: X
******************************************************************************/

( e0 n6 B; Z8 f
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
; _8 W0 F7 U2 D1 {
{

' n2 l( v" A5 _( t* X
   ASSERT(IS_VALID_FUNC(enFunc));

0 h1 y1 R, ]0 C, Z# P! F6 n/ c
   switch(enFunc)

. p2 z& C" o+ k4 m$ @$ _' J
    {
( G2 c; E$ n3 f  r2 i- M! s2 s) W
       case RtcCount:
, `7 a- I7 p% Q5 y( V1 Q
           M0P_RTC->CR0_f.START = 0u;

8 e7 M3 P# G- M8 x
           break;
0 ?; ~' h* H/ V/ J! [
       case RtcAlarmEn:

. @8 T1 }% R" x/ K
           M0P_RTC->CR1_f.ALMEN = 0u;

, R# f2 i+ u. Q5 A% U0 J
           break;
! z- s& [7 E; L' E, }
       case Rtc_ComenEn:
5 X. f7 i. t, u$ U+ ?% L' H7 z
           M0P_RTC->COMPEN_f.EN = 0u;

5 Q' g) o  q, p4 j8 \" [6 o3 j
           break;

: e& Y/ \- o; w  z8 k8 M! s3 j
       case Rtc1HzOutEn:
9 M& [. D0 C& A3 q
           M0P_RTC->CR0_f.HZ1OE = 0u;
5 w- w' D  a( I$ T5 s
           break;

* ~5 A1 U6 T9 O& _6 @
       default:
9 p8 X! e2 L8 S; F! s
           return ErrorInvalidParameter;

) G9 Z( A) W- A9 f/ j* t
    }
6 W, t, Y+ x% h. ?5 w% y; R
   return Ok;

0 g7 X( j  A- y9 c2 r
}
3 v6 Q, r' F3 ]& r6 y! n
uint8_t Change_DateTimeFormat(uint8_t u8sr)
5 o0 \7 H. l" H2 K' z5 I
{

4 F( o) o' Y5 @, L" I. j/ t# [
         uint8_tu8de=0;
% V  ]1 c! A2 X/ j* X
         while(u8sr>=0x10)
: |! {! Z$ {1 n, o5 e' ^% Z
         {

% J0 K& I6 \: c0 V
                   u8de+=10;
0 O1 U+ V  `8 h8 `" }3 m; y& a
                   u8sr-=0x10;
: \$ R" m8 j4 K, C. N
         }

  {1 ]# q/ X6 z, n  D6 F. ~
         u8de+= u8sr;

& C  O- H" m7 v" O& b! N/ ]
         return(u8de);

* b/ P7 C+ z) f, T& y4 H
}
+ E# ?* J2 Z9 U0 {, ?1 [- a
/**
. ?6 `/ r( B5 w6 O
******************************************************************************

: z$ C5 ?7 ?. l; T
**\brief  RTC 平、闰年检测

% y1 _4 w1 c* t: k( `
**
6 }, l. P6 M2 p- c8 a5 k0 P: ^
**\param [in] u8year 年十进制低两位

2 |' j! ]7 z- y9 M  e1 A
**
; r" T. l" {7 o0 y  R- ~* o
**\retval 1  闰年
! ]* Z$ _! T+ b9 c: N. T
**\retval 0 平年

; d1 c0 s5 _; n- m
******************************************************************************/

4 E! v+ R% h* T3 ^2 @
uint8_t Rtc_CheckLeapYear(uint8_t u8year)

, S0 z: t( w: U& ~1 v
{

) Y7 R: c8 Q0 a0 g5 J& t
   uint8_t u8year_shl,u8year_shr;

9 \0 U' b2 f- Y) w
   u8year_shl = u8year>>2;

/ r4 D9 X3 s) l. b# k; x4 Y
   u8year_shr = u8year_shl<<2;

! @" X/ C& ~- h2 q
   if(u8year== u8year_shr)
- u2 j2 D9 e' @: H1 i4 K5 e
    {
3 c5 m! Q0 b, i2 ?) B
       return 1;

& t' |: H' g6 H' l# |! a( ?- Y) X
    }
+ J, a" [  N, F0 z# s' _" G
   else

8 J7 Y  f1 v8 C2 p
    {
# e3 L5 ?$ L3 y; p, B9 i
       return 0;

( S' f: H5 L& {+ b
    }

1 y( _$ T; C  s4 C
}

8 D8 \2 B, S" |" C2 s# T
/**
) M2 g( ^( g! L6 A; R, ?, T6 w1 A
******************************************************************************
, q  R* C6 c6 ?+ c' m5 u9 K$ {
**\brief  RTC根据日期计算周数
/ B1 S7 T, {9 L* p9 h8 |, Y/ `
**
( z4 ?5 `  W3 l2 U
**\param [in] pu8Date日期
2 }  J' N% u: X  j  E4 E
**

' H4 J6 C( F" c! |3 V/ H+ O3 |
**\retval week  周数
2 h3 D1 E- v) r4 S& k; U7 p
**
9 V/ z7 N/ W0 r( R/ L2 D" S* ^) q
******************************************************************************/

( h# h2 j$ l# o* l* }
uint8_t Rtc_CalWeek(uint8_t* pu8Date)

7 D4 y0 S- O, T* ?: F
{
: \; A* C* M8 G. e" w2 h8 E9 F: g( m
   uint8_t u8week;

; F: i1 J/ \* }! p3 l2 S( b
   if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))
7 r( p# F, v- U2 _  V9 Y
    {
* P! ^- O8 v- Q2 E5 v
                   u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;

  j/ F+ U" q; ^: f. `
         }
( {( v0 _4 U, \4 I$ d! l/ ?
         else
  r4 ]- r# s5 J# E) h
    {

; u4 ?: ?2 Z+ _! L, p; m0 N0 B
                   u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
0 ~. o5 C$ q1 V. ~. L  `
    }

8 z+ i- W1 V# U
   return u8week;
# z* w7 g+ _" q& y) s
}
" p* z5 ?- _* ~$ \
/**

5 Z* E* E; D4 n
******************************************************************************

% l  t+ k. }# `6 f$ I  b  X& |1 k
**\brief  RTC根据年月获取天数
9 ?* e/ L! ?/ s- g* [  l& @
**

3 }  s5 v0 X% X3 g7 Z* l3 U
**\param [in] u8month月份,u8year年份
* l8 R) f' |* {$ P  k7 a
**
. ^: f* g7 ~- w! T" a* d
**\retval u8day天数

8 T6 f$ @: S1 u3 r4 G8 U/ _+ E
**
. A; l  y0 \' a' Y/ m) X& T
******************************************************************************/
8 d$ k) H- B$ H- @) y
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)
' V1 L2 q+ d/ U) `. G9 I: L
{
2 s) n9 z+ a, s" Z" w
         uint8_tu8day = 0;

; w  w" L7 h% S+ Q, }, z
         

3 u1 h' O8 f  P2 N5 ]5 E/ P  ~
         u8day= Cnst_Month_Tbl[u8month - 1];

1 g0 }' ~, Z  D6 r
         if((u8month== 2) && ((u8year % 4) == 0))

- x1 f5 U3 e7 z6 U& X
         {

0 w1 ~, y3 T5 E* B
                   u8day++;

' j, V" E1 e/ N1 ?
         }

# k$ Q! B8 I! o0 `# M5 f
         return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31

9 l; U! E$ }6 l. J: r8 I
}

: Q+ j3 x" `4 e; F5 b
/**

3 M+ U& y5 N) k* y0 X% b
******************************************************************************

4 C0 l# k5 S  A0 r0 y2 x. l
**\brief  RTC根据日期计算周数

4 p+ p/ K. ]* D0 i" O+ G
**

; }* K7 _8 k2 x. b* J
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值
1 b) s6 j) A# S& r0 k
**

# A( o0 e4 |/ `; Q
**\retval Error 错误,Ok校验正确
- i# H' y" `+ _3 n
**
* F+ |* ?% Q: @7 A0 ~
******************************************************************************/
" T$ `7 ^3 ]7 D7 e+ I; |) f
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)

0 ~% k4 f  Y* V9 G- r& w0 w
{
( n, o) ?' Z- K' |3 E6 m& G

$ A5 a$ Q( ^" |; U3 t* h1 F
   if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)

) w; s5 a3 p% O6 N7 X
   ||(u8data > u8limit_max) || (u8data < u8limit_min))
  c' }9 _: Y9 r# t. L
    {

& P' N: f& u/ g
       return Error;

; W+ f  Z- Z( h% ^4 n4 P
    }
. |/ ]' ?6 T% z& D
   return Ok;

1 t0 {6 _7 z9 ~0 A3 E7 ^; S' ^1 H3 S
}
# F- X! u" r) e% L( K% ?
/**

) h9 y( ~- @3 U
******************************************************************************
: z( q/ Z/ M( R- [
**\brief  RTC时间格式检测
* D& f1 ?" l: U9 F2 I* ]
**
; {* M& S/ I/ O& P  A, s
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式

& \) @: X5 X4 [) `5 i
**
- G( x7 j1 d- G: ], w4 U
**\retval enRet校验结果

1 ^: L# |7 {' }  m% ?. i2 y
**
  `/ }6 g: Z" T) @& e
******************************************************************************/
4 r* r9 I3 \8 q8 O6 k2 W% N) [; S
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)

7 J' H, a( _( Y; R  L& ^' E+ C
{

& I+ Z+ Z: T: V4 y8 ~+ n" |
   uint8_t u8i=0;

. Z$ C( J7 x+ e2 `, D) d$ A" M
   uint8_t u8mon_max_day = 0x28;

) L  C; u& _% V
   uint8_t u8date[3];

: [  y$ v; ^: u, G) g
   en_result_t enRet;
6 b; `! k5 i2 o" u% U$ B) Z7 p
   while(u8i<7)

5 R% ?  ^$ `: a
    {
5 P9 O9 K# Y6 K' _- V
       if(u8Mode&&(1<<u8i))
; ]/ ~5 v  p0 ]. S; c
       {
9 T8 z  U5 W  ]* t: ]  T, Y+ L" Q
           switch(u8i)

6 r4 C. r9 z, i+ i' X
           {

6 r7 Z% i" J# M; C! v1 m+ _+ q
                case 0:

0 b# G3 w, I$ M9 }- l" ^" l
                    enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//

1 j0 Q" A1 v$ D' E% H! }
                    break;
7 F+ z/ y5 A4 I, |8 x# t
                case 1:
2 @0 b% _7 k2 Z- x: B  m" t4 O8 L2 W
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
2 s9 \9 `; e5 \: S! n* j
                    break;
4 h$ a* s+ s: c3 d  h3 J# h$ \
                case 2:
; c. [) ]$ P0 ]. }
                    if(Rtc12h == M0P_RTC->CR0_f.AMPM)
# W) M" P3 r0 A5 m- A
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//
, a; |$ w3 T$ P! ?3 B
                    else

' M% T' r: O" d* O+ N3 R
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);
  p& t' k6 x. k! L! l- _, L
                    break;
6 V% h  d# R& I2 }- s; Y& c+ p, G
                case 3:

+ H4 ^4 |4 m5 R: u* Q, A6 @6 o& L- h: A
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);

6 x* U* O0 u, p2 N1 l' k( T
                    break;
' }0 s+ S* G1 i% ?1 q: _
                case 4:

6 L* T2 |+ B/ y( g: _7 }  A
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);

0 I' ~- \' N) |
                    u8date[0] = *pu8TimeDate;

! t( _* C0 a; ]% y: v) S
                    break;
1 P7 Y5 t' u& R6 y
               case 5:

' l: Y/ G8 J1 W, j& q4 S
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);

1 g; B6 E4 t' Y& Q& |
                    u8date[1] = *pu8TimeDate;

* R# ]- g3 B# Z6 z/ D- S$ w5 T' X
                    break;
1 x( B2 M; x5 u5 s
                case 6:

. H( x) C) l% S: G2 C
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);

% h6 g8 d# n- R% A0 X& F9 o2 t" H
                    u8date[2] = *pu8TimeDate;
% d7 X0 y2 q; {) Z6 ^' X1 G
                    break;
' @2 t9 y8 p) W3 p. C  i
           }
  `1 s: Q( H6 ]; m" c5 {
           pu8TimeDate++;

5 ~) c3 k* u, c1 |" O- c/ u- r
       }

! S* {! b1 j) s, h1 _1 c- d. B
       if(enRet!=Ok)

$ O! R+ L4 _) }% d2 E+ v
       return enRet;

. s4 a  h; A$ U" L5 a5 {* j
       u8i++;

$ u& }/ N5 c0 M" O% t( L2 {
    }

7 k9 j4 e, @: Y
     if((u8Mode&0x10)&&(u8Mode&0x20))
7 H6 T2 m+ b, N' U& {$ u8 r
         {
* g7 k+ |( {$ r: N8 |6 M4 P
                   if(u8Mode&0x40)
2 b" u5 J! W0 \3 k5 c, j
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));

/ s; |0 N. k3 {$ Q8 H
                   else

; d; o1 N. B" P3 o7 [/ R
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);

& _: ^/ H* k" I0 A$ E2 u
                   if(u8date[0]>u8mon_max_day)

* P, F. h* @, P, b$ j$ X" Q9 c- ~
                            returnError;
7 Y; j, I; Z% @& e) H
         }

7 g% p2 M9 \$ d7 U/ Q
         if((u8Mode&0x10)&&(!(u8Mode&0x20)))

: ]3 @5 Y% K- j$ T+ ?) u' t3 K! A8 g
         {

3 N9 V4 s$ c: w; d# x) v( p
                   if(u8date[0]>0x28)
( n2 f" |; d/ X% N' W& ]; H
                            returnError;

+ h; o9 |  q" J7 z- G1 p% L* a
         }

8 i# C3 A' ]) F& i1 y
   enRet = Ok;
/ i" I+ p$ T$ Y9 p  j1 V9 ^7 ]# O
         return(enRet);

5 U0 E1 D; h6 S/ O$ y5 l" f
}

, B1 S0 i- g+ T! n5 H8 }3 F
/**

# U" f" N4 `: Y4 {
******************************************************************************
# L& L9 D* C3 g5 \
**\brief  RTC设置时间函数
2 O7 D3 ]# }$ y, ~" \) r
**
; y3 v3 J+ B7 y5 a/ r& r
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期
# }3 H9 B$ O, D* D* }/ b; H
**
0 p, K, t: l7 V: I: F
**\retval Ok  设置正常
; G$ m& n& l8 |
**\retval ErrorTimeout 时间溢出错误
; M- s: U/ H6 m3 }& T; T) h
******************************************************************************/

9 O8 M) c! P' g, C
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,
. V  E1 l5 l$ m
                            boolean_t bUpdateDate)
- O" ^$ W5 Z, W2 P- L
{

* }5 X8 G# z" Q
   int32_t u32TimeOut;
/ X7 {8 @8 d4 O3 x. k0 y
   u32TimeOut = RTC_TIMEOUT;

4 Z, D8 \0 m1 i; r3 v* r# ?
   uint8_t* pu8TimeDate;
' R- _* C6 i" K5 J9 c1 K7 N6 y' ~
   en_result_t enRet = Ok;

& [: I6 b6 N% W+ M7 a* J( b6 L
   pu8TimeDate = &pstcTimeDate->u8Second;
, _0 G5 f" X5 A
   ASSERT(NULL != pstcTimeDate);

6 H9 E5 N3 r5 X1 X
   if(1 == M0P_RTC->CR0_f.START)
' O0 A0 C6 H0 F" e6 G# x% m4 `! I
    {
2 h* b( r* l3 V+ ^8 k
        M0P_RTC->CR1_f.WAIT = 1;
6 S. w, d! f9 I* r6 K
       while(--u32TimeOut)
" n7 I# w* y! v7 o
       {
3 l! p+ d% S, ]0 `( i' I
           if(M0P_RTC->CR1_f.WAITF)
& X; ?* [+ L7 A
           {

; A* m  G, B$ X! Y$ X2 o) O4 v
                break;
) k3 Y; L; ~" m+ W0 a1 ^+ C+ b0 h
           }

3 b$ d0 G! k, S7 Q$ V2 o- O* W" z
       }

' y7 X& z5 H" d
       if(u32TimeOut==0)
: q7 d) L6 w% j4 @9 k* n
       {

! I7 [5 g; D3 Y! H2 e
           return ErrorTimeout;
' t5 G' k, Y; N, A) A! U
       }

4 {, B! R( J9 J& u& u* Q  U
    }
6 j3 d- |% I$ S: V2 V/ q0 v
    if(TRUE == bUpdateTime)

6 l/ }: p4 E1 r/ j- x7 s% P1 m6 u/ z7 K* n
    {
. J7 S+ D5 ]& a3 O
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);

& A* ~1 r9 _2 \. j2 j/ a
       if(enRet != Ok)
; r: d  H; a2 h$ v0 ?& H. u4 q4 E
           return enRet;

: a) z, r* C  ~4 G! n
       M0P_RTC->SEC = pstcTimeDate->u8Second;
2 i* U) a4 W) d/ \
       M0P_RTC->MIN = pstcTimeDate->u8Minute;
1 E2 D& s: T) v$ S6 E
       M0P_RTC->HOUR = pstcTimeDate->u8Hour;

7 g8 i- \9 v& D% ]9 o
    }

5 Q6 K# D/ @6 p' f
   if(TRUE == bUpdateDate)
5 Y# |( g% h! E/ p1 V& S
    {
! [7 \  P: P4 {3 i, W6 f
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);
! D3 M- d+ X0 p9 M* U* P" m
       if(enRet != Ok)
" i: J  c" z4 \& O5 U' K1 c
           return enRet;
" z' K7 e- P7 q; Z
       M0P_RTC->DAY = pstcTimeDate->u8Day;

9 s" O. _% I) W( ]
       M0P_RTC->MON = pstcTimeDate->u8Month;
# h* R1 Y$ f1 P' ~% j
       M0P_RTC->YEAR = pstcTimeDate->u8Year;
3 S7 A+ a7 y- J/ s$ D
       M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;

, Z+ U0 C- u3 G# s
    }

: E1 n2 D8 M' C
   M0P_RTC->CR1_f.WAIT = 0;

! K7 B) g+ m' Z7 `) [1 i/ n$ M
   if(1 == M0P_RTC->CR0_f.START)

* c) c* b, K/ M$ z2 b( z: m) a/ v
       while(M0P_RTC->CR1_f.WAITF);

* i' F" b; x7 l  \) q" i
   return enRet;

# E' T" A" ^! H! M
}

# g* z+ r. W; l  J9 g) U0 x
/**
' S2 ~) n) @% I1 a3 @5 U' [
******************************************************************************
5 s! W* F' B3 Y* k
**\brief  RTC获取时间函数
  y8 g% w) y$ V& U
**
9 ]& g% b4 ?9 R: Y- A- L
**\param [in] pstcTimeDate日期时间数据

; e* @6 D& P4 n* ?0 j  h/ D% H. l6 Z
**

9 i) A  h& B! N3 g$ r
**\retval Ok  获取正常

# x/ B' e, U1 C% o0 X1 m
**\retval ErrorTimeout 时间溢出错误

% F% o  l2 q' q
******************************************************************************/
4 R8 }8 w' E9 }% ~
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)
: _- H$ K: g/ N# x( N) ]
{
/ W5 E! n  `& V, Z% x
   uint32_t u32TimeOut;
' q0 v6 Z0 f4 j( @1 W
   uint8_t  u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;

/ c% g+ d2 y  S3 W- k

3 E. L3 _+ p, ?4 `! \' M
   ASSERT(NULL != pstcTimeDate);  
5 ?* t* Z0 s: J( j9 N& F  d( J
   u32TimeOut = RTC_TIMEOUT;

$ L7 h- l0 h. \
   if(1 == M0P_RTC->CR0_f.START)
! S& x: Q0 c; Y9 ~5 }1 d* Z
    {
2 a/ k0 M9 ?/ u3 P
       M0P_RTC->CR1_f.WAIT = 1;

  J( r; w8 Z+ _5 e
       while(u32TimeOut--)
  N& J2 U' r2 {3 \6 m) R
       {
; c: }4 }/ o) }- f# w' {0 o7 w2 A
           if(M0P_RTC->CR1_f.WAITF)

) ~( Y' x; Z3 M6 ~
           {
( o' }+ [  \& q8 n; c8 h0 I& j, ~
           break;
3 [0 z) W" \' L& i8 F
           }

9 m! q% g% u* \" L: p1 i0 h$ E
       }

5 U& b7 i& w. U1 \" C8 P# m
       if(u32TimeOut==0)
; V  J/ R: F* P9 Q# _0 T
       {
/ r, U/ T9 \8 r( j+ L  C+ x3 m
           return ErrorTimeout;
5 D$ N" b$ a6 `' l, ?, }
       }
* ~, K: ]$ {2 j# B& X$ g, k
    }

4 o6 P+ F' c' f( R% n7 P
   u8BcdSec  = M0P_RTC->SEC;
- j" o1 W- Q9 R" \" L1 ~0 c
   u8BcdMin  = M0P_RTC->MIN;

2 x; R* C; d- p$ \
   u8BcdHour = M0P_RTC->HOUR;

/ U0 u; w+ @$ H' ~8 c% S4 _& }
   u8Day     = M0P_RTC->DAY;
9 W9 p0 F8 ]) w  H$ e6 t" H
   u8Month   = M0P_RTC->MON;
) y, D2 [' X8 x+ d
   u8Year    = M0P_RTC->YEAR;
6 T" c% |: U' U5 ]% }: y4 i
   u8DayOfWeek = M0P_RTC->WEEK;
  X5 Z  t# q6 a7 ~" b6 U) Z
' P8 N; f2 m/ j6 b  I# X+ M
   pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);

0 X' J/ {+ V2 A3 G
   pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);

. e' i, ?* L4 _1 E- X) a
   pstcTimeDate->u8Hour   =u8BcdHour;//BcdToDec(u8BcdHour);
- g) \5 Q! Z- R5 T3 F
   pstcTimeDate->u8Day    =u8Day;//BcdToDec(u8Day);

- z/ z" C, V) u, \/ m4 Z0 J
   pstcTimeDate->u8Month  =u8Month;//BcdToDec(u8Month);

0 M0 I% A% f4 L% `$ Y  k) S; m
   pstcTimeDate->u8Year  =u8Year;//BcdToDec(u8Year);

" P4 ]6 }- c. y; f9 \7 ~! d
   pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);
; w9 `  A4 O4 `, @# G0 [
   M0P_RTC->CR1_f.WAIT = 0;
7 X; S: H- ]( L% e. R
   if(1 == M0P_RTC->CR0_f.START)

2 [1 D2 `  l: |
       while(M0P_RTC->CR1_f.WAITF);

: ~0 U7 J6 W! G8 O. o* z8 J$ y
   return Ok;

- l, _  `& W1 N4 I
}
$ q; Z% k* ~7 `4 K; A& C$ q. p/ t
/**
, l# }/ ]9 _3 a
******************************************************************************
$ H2 {& o: e' g7 y$ h
**\brief  RTC计数or读写状态获取

" Q' C) V5 w: c
**

; w; Y1 P8 y1 o) U; g) P9 F
**\param [in]

+ \1 m1 x: p) }
**
* u) E, w; g4 [
**\retval 计数or读写状态
$ X$ g# d( |3 x
**
, N6 b, t( `5 l/ a, f- k+ y
******************************************************************************/
4 T  P# C. [  E! }6 ^
boolean_t Rtc_RDStatus(void)

; b! S: d; E, i* _: o
{
. M0 e; t, P3 l) {! E
   boolean_t bRet;

5 Y6 Z. o! n+ C6 t) |0 K( A0 Q  d  M
   bRet = M0P_RTC->CR1_f.WAITF;

& O* T5 b+ `) S, A5 v
   return bRet;

1 X( p& }% f  f% N/ }9 N( \
}
/ d) u; f5 M$ o. g# _0 }
/**

' J7 }4 i- ]& T2 f& V* D6 M8 W
******************************************************************************
4 M2 O4 ^. e  ]5 P
**\brief  RTC闹钟中断使能

  l) S  W) N5 F: H9 D* R1 c
**

2 A; V3 U: h7 Y# }, R
**\param [in] enordis中断使能or禁止

  v3 C: p- `2 d
**

: K: k6 _4 ?: p: V: w2 \
**\retval Ok设置成功

9 w4 |  R6 U& }+ |+ M$ Y
**

. z! g) Z- ~6 H" g% ^: I4 ?
******************************************************************************/
- s- K  m% [# N2 O
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)

/ w, X; B+ J" n+ e6 [* E. a3 C
{

" S  c3 g9 J7 C4 G) K0 F  X
   en_result_t enRet = Error;

- j1 K& e+ a3 K2 u0 T
   M0P_RTC->CR1_f.ALMIE = enIrqEn;

" B$ g; E: h) ~8 H, {
   Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记

4 f! X& t* x' {. e, U/ _* b0 J! |
   enRet = Ok;

, s; i2 @/ @8 B5 m
   return enRet;

/ z. `& e0 W! s2 _5 {4 \9 l
}

" f& s! Z/ A- y& s( b2 b; t
/**

# o9 [4 B1 O/ U7 x
******************************************************************************

. ~" G% X- s# g
**\brief  RTC中断请求状态获取
8 I; G3 ]; d& o$ s1 S$ Z" n
**
- @1 {- H7 U1 }. X
**\param [in] enIrqSel获取哪种中断请求

( {/ E$ A" R, P8 j0 R& i8 m
**

" S3 k1 c: ~. z, u# J
**\retval 中断请求状态
4 J3 b& |( q6 f; \  ?: E& o1 Y. ^
**
: p' J) G& F2 [
******************************************************************************/
9 B6 f$ o9 V% u3 a+ J6 h4 a6 w
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)
( R% t8 Z0 q2 `  u2 j- L' T
{

6 _+ v, v# k9 Z; |
   boolean_t bRet = FALSE;

% O  V/ P5 |/ e) N7 d, B
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));

* Z8 e8 I: L$ y/ Y
   switch(enIrqSel)

8 U/ A% X( |0 }' P6 l& j
    {
1 T" G# Q; H  M, [: F# W$ A
       case RtcPrdf:
# c2 T4 T/ ^7 a
           (M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);
+ i3 x8 l4 j" g/ v4 S  @% ~
           break;

5 k6 c! W4 ~5 \2 [0 n# `6 `- @' Z
       case RtcAlmf :
# y7 ~! x0 j0 z) y5 l* `2 `+ O: T
           (M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);

; N" ~7 {! {0 A% _/ K$ }
           break;
$ s6 f9 z! a& M  J. j
       default:
4 y5 _. u6 S4 ?7 D' V
           break;

, R, S8 G; |; ?" H8 @3 s
    }

5 R2 p- a' o  ~1 @. }1 Z
   return bRet;

! o1 Y0 t9 Q6 a( |; y. Z" Y. n8 \
}

. n) z/ g2 F9 N+ C/ J# _( r+ p: @
/**
5 a' E! p' e+ q5 i2 \
******************************************************************************

' T4 s$ |( U  t( X( S" D, i
**\brief  RTC中断请求清除

! K" c- c+ O4 F% k  m7 ?
**

4 t0 g" p' e' o- m" h4 v, x
**\param [in] enIrqSel清除哪种中断请求
4 o. z$ Z! m6 R! i
**

6 J, n+ j% y7 n3 K$ ]" x( v* g
**\retval Ok 清除成功
8 C! `+ v, j, f
**\retval ErrorInvalidParameter 清除失败
: W3 N* A* A9 N) a- b/ m1 e# l
******************************************************************************/

9 u6 s) R9 _. |5 r* @4 M
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)

5 g  e" c% d/ P$ V* {1 [
{
/ A7 Q/ q( L- q6 H+ s* b( {8 m% }
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));

, G, A# O7 N/ @# N* M
   switch(enIrqSel)
9 O" L- Q" T& S
    {

: J, G- d, l0 \: J: x0 Y- ]  ?
       case RtcPrdf:

( y6 E- g% ?2 L
           M0P_RTC->CR1_f.PRDF = 0;

0 e: `( R5 c: {2 n( {# Z, P
           break;
6 [) ~; l7 G+ a6 ?
       case  RtcAlmf:

" Q  U$ A3 s5 Q; A3 a) m; f% b3 Y
           M0P_RTC->CR1_f.ALMF = 0;

! o: A- X: d" {: ~
           break;
: I$ P; o; W( X
       default:
) V9 c6 Y0 E! N- {: f/ ]' \
           return ErrorInvalidParameter;

, @  [- D" k% O
    }

5 a  W( p! P# q- l) l! a* C' S
   return Ok;
$ d1 w5 [+ c4 k0 P
}

9 Z; k7 w% g! ^
+ G# A* m, O4 K) ~  Z
/**

% I5 K) m9 e' W. _# S) ?. V% c
******************************************************************************
+ A! y& z& A% l
**\brief  RTC中断处理函数接口获取
6 l- p; S  a1 g( U
**
; _# H* T* b0 |% M
**\param [in]
; a- H# l2 N3 n
**

0 b4 J# A. R0 a  x3 j2 o
**\retval 接口函数地址

) }7 M7 ?6 f2 L" M
**

  j) o( y' W& u! [& l9 j( B+ y8 F
******************************************************************************/
' O4 G% S- W" s  Q
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)
5 L; T: ]( d4 _% Q8 P& h; f
{

& t2 H  W' z9 |
   return &stcRtcIrqCb;
3 _/ R, c- r) p7 S) J4 s8 |
}
& Z! e) [% g& j/ L
/**

# H" B" D. S. Q6 R" Y) G. w' l
******************************************************************************
5 R8 h; |% I: l
**\brief  RTC总体初始化函数

/ ]- S) c, J0 z  L
**

! B/ d4 S+ w' _! g8 B( ]$ ^. }
**\param [in] pstcRtcConfig初始化结构
3 a% @* w$ s# b3 G4 }3 U
**
+ ~0 _" j( u% [: A
**\retval Ok初始化成功

7 Y: ^: k; ^) i
**\retval ErrorInvalidParameter 初始化错误

( ^; v: `9 R% q8 \+ n
******************************************************************************/
( B% E  g9 f& N4 [: m: w$ O* v
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)
: f: ^  I1 N$ [  i: E) n3 ~# @) i
{

; y% y0 b0 W. G/ l
   en_result_t enRet = Error;
  ~$ N0 x" a! z$ `+ _
   stc_rtc_intern_cb_t* pstcRtcInternCb;

  f! z, Z. B7 G
   if(NULL == pstcRtcConfig)
3 p3 Q" F3 ~6 b. u# m2 G0 v
     return Error;
9 H* u. s1 W) g, b2 J
   pstcRtcInternCb = RtcGetInternDataCb();
0 p( p+ x1 d- C8 A2 `
   enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);
; W5 `1 Q! C2 @- u- t
   enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);
& ~- L8 b) V: B" j3 [! I/ Z8 o3 u
   if(enRet != Ok)
/ @. f$ C' v0 d5 r( l
    {

- I" o, u9 ?  _0 R2 W# L2 V. j- P
     return enRet;

$ a- R. P7 r6 K4 `
    }
& }0 x, X1 k* |# y) D/ ]) R# R" [
   if(NULL != pstcRtcConfig->pstcCycSel)
. f5 v, T2 M* P! R: F
    {

, w; m, P0 S! F0 }- s
       if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))

7 j: S$ v7 h; E8 m
           return Error;        

4 u6 i& t, R  M  ~8 T1 {
    }
7 ~6 z; m+ i1 N1 o$ R+ R9 Q- n
   if(NULL != pstcRtcConfig->pstcTimeDate)

. E2 U$ a- A( R, ]" w8 U& X
    {
+ t) d3 V0 ]! H
       if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))

# }1 m1 {# T$ S% [8 @! W. ^+ W
           return Error;
# p% L3 ^* U! ?! b
    }

; e( O/ n0 K6 G) r. |' m: n$ `
   if(NULL != pstcRtcConfig->pstcIrqCb)

  E' f: r7 Q, I2 n9 O: U
    {
" `/ A$ p2 f( `# j9 ~6 j0 d
       pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;

4 Q- L9 k. c, J6 G4 R
       pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;
* o# O  N1 M5 f/ |6 _
    }
9 g$ P, j7 R* J0 t/ ^6 G
   if(TRUE == pstcRtcConfig->bTouchNvic)

- y( W% |4 k! n$ V% Y
    {

5 F  |) Z" y5 z/ D* {
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);
, _% h- ?6 a/ ?
    }
6 S3 l' a1 ~8 p
   else
0 k# w8 D8 c) ^& C0 N( `
    {

* |! n% A) \5 z) T$ Y2 ^
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
5 F1 D/ e/ P- c8 k1 U
    }
7 u% K3 B1 l, f% [) S
   return enRet;
7 Y( g( K- W9 T( p) i9 K7 A
}
/ }+ q& ~& _. ?  E; q
/**
4 `- f) Q0 i& F/ u3 t; Q. q5 p
******************************************************************************
$ f$ b8 m, \. ?% i
**\brief  RTC计数禁止函数
% Q% L) a' k" \. L$ k" u. F4 i
**

1 L/ ]- g* K) f7 p/ I/ Q1 i
**\param [in]
- @4 A" J7 P! d$ n, r8 F: U/ z
**

1 q( o# W! x% I1 @3 {& k
**\retval Ok禁止设置成功
; r5 U: k& A& k% y. i# Q$ O
**
* E; f% U9 ~8 g: K8 ?
******************************************************************************/

, o% I  v9 V, x5 e$ e  i/ H8 X
en_result_t Rtc_DeInit(void)

' T3 S6 L) \3 I- V# i) b# Z  A/ e
{

5 k% F, v5 U  l
   EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);

3 j9 K" b) A, I& [" r
   Rtc_DisableFunc(RtcCount);

' l0 I( Z: Y; t' {- X: O  F
   Rtc_DisableFunc(RtcAlarmEn);
. ^( F6 u( s" _& @: C2 ]" o- D# j
   Rtc_DisableFunc(Rtc_ComenEn);
" \3 ^7 f8 _  L# J* B& I
   Rtc_DisableFunc(Rtc1HzOutEn);
4 ]& u( U& u1 L3 Y/ I  r4 E* @
   return Ok;

: T3 [, I3 c8 b1 l/ P
}

. f/ T; q/ G1 O! x
/**
# u  B4 ?1 k% R+ ~/ w3 s
******************************************************************************
: {4 g, @2 [7 ]8 @4 T& A1 e! _
**\brief  RTC中断处理函数
& T8 q4 S, ?4 a% p5 e) A& d
**
& o, ~7 x' E9 m, Y  R4 B$ Z) g+ ]
**\param [in]

$ C4 O* X6 b" u" z6 |$ v% k
**

, d6 c+ }, k; [) p0 ?
**\retval

. U+ w( }( P4 f" A4 p5 a( [/ G2 X
**
# n" w2 e, k1 v( Q
******************************************************************************/
% M" }8 N) Q  o7 b: H# b/ e
void Rtc_IRQHandler(void)
6 i$ Z; D' n; y
{
. N! \* u4 h# v7 n3 k
   stc_rtc_intern_cb_t* pstcRtcInternCb;
) l5 R6 o+ \- l: p9 g% E
   pstcRtcInternCb = RtcGetInternDataCb() ;
9 h7 s0 w/ M9 U( {4 C: \; f3 t
   if(TRUE == M0P_RTC->CR1_f.ALMF)
3 X1 `8 a1 [9 ~  C
    {

+ d: Z# y9 t- M
       M0P_RTC->CR1_f.ALMF = 0u;
- S% w+ `, \7 `6 C- D, ]2 \
       if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)
& {) f4 @  T5 c" A' u
       {
0 q& n  P! ]9 g1 C+ z% H
           pstcRtcInternCb->pfnAlarmIrqCb();
0 Q. m8 b& I- [
       }
( G( w/ p6 K) [0 B. p
    }

: _; f' d/ X+ ?) {( v
   if(TRUE == M0P_RTC->CR1_f.PRDF)
$ C+ C' u* x. o+ K1 S
    {

9 n; H; E. {$ r  M3 N, i8 [
       M0P_RTC->CR1_f.PRDF = 0;
: O2 |3 V' P' r; L
       if(NULL != pstcRtcInternCb->pfnTimerIrqCb)
8 h! v- y( b# b6 T% ?
       {
3 X/ _4 Q- C+ t: L
           pstcRtcInternCb->pfnTimerIrqCb();

7 y) k! u1 Q2 ?/ ?  i) o" y
       }

0 h/ |) t6 t0 ~. @
    }
% K+ @" Y% K1 b4 A" a
}

* z2 Q: r! u" J$ z6 K( S0 H6 B2 I

+ r$ v' ^* P5 F' _7 d

' t+ t5 v( l5 H; s+ w/ [! l
static void RtcCycCb(void)
0 R) e, d7 [0 s% N# [# _& M! Y
{

: G9 k5 H6 J$ F  [& F% w+ s
   cyccnt++;

/ Z4 n" Z& l" m3 o% l0 w$ C5 L
   flg = ~flg;
0 Y. W! k/ e) \- L7 E% t' x; W
   Gpio_SetIO(3,3,flg);
* o6 g  ^; r% b* F6 ?
}

. J4 U% Q! m2 j( j
static void RtcAlarmCb(void)
' J+ p. S! C" t8 H8 H  e
{
$ E/ [2 N3 ]6 y) e" L5 G5 M
u8Alarmcnt++;

+ O% N) Z* d" P
}

, T0 x: i& ?& I& k8 G
int32_t main(void)
7 x  ~4 g8 w$ E7 N1 t
{
) E' O$ p+ `: E8 `8 r
   stc_rtc_config_t stcRtcConfig;
4 P" O( g* v/ }) [* C
   stc_rtc_irq_cb_t stcIrqCb;
: `! }, z6 A" w- J
   stc_rtc_time_t  stcTime;
3 D& ]) V7 S/ B  ?* h
   stc_rtc_alarmset_t stcAlarm;

0 w6 s: U9 d9 ?" L
   stc_rtc_cyc_sel_t   stcCycSel;
$ y! A9 i7 G$ A! U( d9 m
   DDL_ZERO_STRUCT(stcRtcConfig);
' e& O. ^3 |2 p5 W# s! W
   DDL_ZERO_STRUCT(stcIrqCb);
) m5 r; g6 c2 I5 T. M
   DDL_ZERO_STRUCT(stcAlarm);

" d$ H+ q+ c1 V+ ~2 k5 P1 g. ^
   DDL_ZERO_STRUCT(stcTime);

# m* M8 D0 E$ v. ^5 W$ U
   DDL_ZERO_STRUCT(stcCycSel);
1 W/ s$ J$ j& a2 C$ a
   
# G0 K& ]; Y: _5 z! Y+ [
   Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟

' \7 m% i3 @8 b/ m' k5 r7 Y
   

0 c" X7 ]% J3 ?7 x) L* R
   
8 ~: h' `! I5 v8 |. U
   Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口

! m1 s5 {% n6 s& V
    Gpio_SetAnalog(1,5,1);

+ K& [/ @: ~6 U8 f6 i6 v! s; E
   Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768   

. }, ~( z1 a: C- s! q
   //Clk_Enable(ClkRCL, TRUE);

* \  {7 ~1 c9 [- v) z. X# Q. O3 e
   //Clk_Enable(ClkXTH, TRUE);

9 s% l% V7 Y5 m
   Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟
- f, F/ R3 V9 J, ~
   
; R/ z$ e! R8 k( X3 V% u( d+ K
   stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//

. x% L0 `* j% L" M. G
   stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//

: ?! n) Z0 p9 u+ t
     
& _- ~' s6 p3 D& x3 A
   stcTime.u8Year = 0x17;

: j- D+ F1 k3 c: Z
   stcTime.u8Month = 0x06;
) h; V) M3 h# _  b
   stcTime.u8Day = 0x07;

& R% `8 g' v( o; s+ M4 e
   stcTime.u8Hour = 0x12;

0 y) e2 Y& q7 X0 C5 r! n2 h; K
   stcTime.u8Minute = 0x59;

# T) o5 s  _2 k' l9 V2 S
   stcTime.u8Second = 0x59;

6 \  f; o' G: p8 H
   stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);

+ u! B& g8 k. m8 l2 Q7 ]8 g
   stcRtcConfig.pstcTimeDate = &stcTime;

2 A4 l& x0 q" h% b- F4 P
   
7 I9 h. N: i: |) j7 `- Z
   stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;
+ e. \+ d6 P# }# A+ _: `, e
   stcIrqCb.pfnTimerIrqCb = RtcCycCb;
- l$ O' y8 S/ a7 M
   stcRtcConfig.pstcIrqCb = &stcIrqCb;
! q: \: A& E& |$ p/ \) D
   stcRtcConfig.bTouchNvic = FALSE;

& g+ X  v$ G. U% L- M8 ~$ m% I' A
   
' S0 y; |$ Z, [) q8 u: v/ ?
   Rtc_DisableFunc(RtcCount);
+ [# p+ B8 Q! t
   Rtc_Init(&stcRtcConfig);

- [- z, N  C+ Q1 ~/ N, }

+ x: g" \" w) W; x5 r- Y
   
' G1 V6 X- l8 X, P$ W/ I9 u
   Rtc_EnableFunc(RtcCount);
( `; u" _  J5 x7 {* G9 L0 a7 H& b: x# U
   Rtc_ReadDateTime(&stcReadTime);
( ^% t& a: ?+ s' L2 k- F
   while (1);

, D4 ]8 G9 }  |
7 K" i. f% Y5 W) d9 X0 }
}
9 O+ Z$ b! [0 T3 j. `! l7 D

6 m: M# W$ v/ k- C1 ?. {
/******************************************************************************
/ {& \9 ^: S' @+ J6 j& l9 V4 ^
*EOF (not truncated)
" o& v) L3 Z$ C
******************************************************************************/
+ y2 R) |5 i; p1 s4 R) K6 H
/ ]8 A! g0 b  K# r+ D( R2 A  e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-4-28 00:19 , Processed in 0.075055 second(s), 32 queries , Gzip On.

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

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

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