找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

4

主题

4

帖子

60

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x
9 Q$ r/ x, v: w# Y% H& K
/************************************************************/
" Q; Y7 f$ h9 R) S% h
/*******                 样例使用说明           *************/

0 L( O0 Z/ v9 ^, b9 J# ?. y* G
/*******                    版本历史            ************/
/ {5 R5 }  F$ j
/*******  日期       版本    负责人  IAR   MDK ***********/  
4 a9 D  H" c$ g
/*****    017-07-14     0.1     CJ    7.70    5.14 **********/

8 H( C0 K" `, F
/*******  QQ:3386208645                       ************/

. ]5 b' Z3 d' Y4 Q+ |
8 {$ Z' v* ~2 h2 O# l6 |
/*******               功能描述                  ***********/

5 [! n+ Q4 S" M( E
/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/

* ^& W- v7 G, m2 H& V( [# I
/*说明:                                       *************/

3 r+ F; t3 j5 d% S
/*计数初值写入计数寄存器                       *************/
! C& h; o- Z; M
/*启动计数                                    *************/

5 o$ X8 \8 j+ c  l, q( w2 j
/*读取计数寄存器数值                           *************/

1 ^% @, q9 R6 |, F/ _( K
/******* 测试环境                              *************/

2 }5 ]$ L+ N, r. }5 s4 W
/*     测试用板:                              *************/

) s8 }1 _4 f9 x6 W8 D' X
/* SK-L110-TSSOP20 V10                        *************/

  ^# L  \4 m/ |1 L- o0 w7 H
/*******辅助工具:                              ************/
- O9 A8 b) M7 S5 q& x: v+ C8 ~- I2 B
/*  JLINK调试工具                           *************/
# A9 K) A3 f' p+ |: ~3 m; Y( M
/************************************************************/

- l* m! K) Y# j; M! a. I
#define IS_VALID_CLK(x)             (RtcClk32768 == (x)||\
. E: A5 h! B5 p8 C- G( c
                                    RtcClk32768_1== (x)||\

* k) p1 k* ]' _% i( ?3 h2 l
                                     RtcClk32== (x)||\
9 N  \& f, H8 i$ }
                                     RtcClk32_1== (x)||\

8 r( V; v% u: j8 c" ^* u
                                    RtcClkHxt128 ==(x)||\

* v) R6 R4 F4 s& h  x
                                    RtcClkHxt256 == (x)||\
, m, o0 r: K; q6 N, R- h
                                    RtcClkHxt512 == (x)||\
4 R2 @9 j7 `3 X0 e
                                    RtcClkHxt1024 == (x))
4 E& F2 m/ v5 b# K6 \0 U

* b" r3 k6 P' v- G! k
#define IS_VALID_CYCSEL(x)             (RtcPrads == (x)||\
5 P& z" z- A5 j' X8 f5 y  b8 U4 P
                                 RtcPradx==(x))

( d; H4 E- A! D1 `

  V& b- n& x' ~. ]
#define IS_VALID_PRDS(x)        (Rtc_None == (x)||\

' r3 `5 H* M$ Q
                              Rtc_05S == (x)||\
/ P0 m; i8 B5 ^! r, _, D9 d8 T6 A
                              Rtc_1S == (x)||\

, e. s2 P6 {9 z( i
                              Rtc_1Min == (x)||\
  k6 n; y& t" l( Z
                              Rtc_1H == (x)||\

- J/ r: M1 a- o9 I$ f3 z
                              Rtc_1Day ==(x)||\
& |% Q' ~- N) I% C* }! |
                              Rtc_1Mon ==(x)||\
  Q5 ~# _) ^* T$ u6 J
                              Rtc_1Mon_1 ==(x))  

/ ?) c; Q" S$ u& G- _
" D* S0 M& z1 c3 [8 T4 O
#define    IS_VALID_IRQ_SEL(x)      (RtcPrdf== (x) ||\
* }8 F6 k) D9 Z% Q. ?4 B8 d4 v& Z
                                      RtcAlmf== (x))

  @4 B$ X  l: J  y, w$ R* I
7 l; b$ |# N$ f0 L8 F
#define    IS_VALID_FUNC(x) ((RtcCount<=(x))&&\

5 |4 _# S" r* q, K5 A
                              (Rtc1HzOutEn>=(x)))
1 F, ]) c: B- G" f: u$ N0 l9 G
#define    CkDateTime    0x7F

4 s3 c, T/ l; J# Y, b2 \) @
#define    CkDate        0x78

- g5 {5 d3 ]; X* y+ c
#define    CkTime        0x07

+ Y/ p9 j6 }# n/ z& w# Y7 P2 R
#define RTC_TIMEOUT             1000//test 1s

( y/ e$ |9 |) i' E
#define    T1_PORT                 (3)
& w2 B1 a. \- a* W3 ^
#define    T1_PIN                  (3)
$ h: G: O% b5 N1 E
uint8_t cyccnt=0;
, ^) `: V1 ^# S4 L( \
uint8_t u8Alarmcnt=0;

5 U  d" w8 ~  w
uint8_t flg=0;

1 T- Z7 _" h% e* K! k
stc_rtc_time_t  stcReadTime;

  i  N. G' u) m9 F/ \3 z' }

5 r0 |& K: }7 I* {) f
/********************************************************************************** \brief  RTC计数时钟选择
. T% U- S1 D4 u0 H; G0 V
** ** \param [in] enClk时钟源
/ ^, z2 w& Z2 P* q+ S( A
** ** \retval Ok
* r$ G# B& ]3 M* V: T! E5 g5 k+ P
******************************************************************************/

. v7 z7 ^" R/ R8 J! z& _6 Z
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)
- o' t7 ]3 W2 |8 G
{
7 @/ y$ k# }3 P: f2 f! J* c
   en_result_t enRet = Error;
2 I4 U4 B6 L- B
    ASSERT(IS_VALID_CLK(enClk));

+ z. u4 |$ v+ S& a  m
   M0P_RTC->CR1_f.CKSEL = enClk;

1 \/ w3 F2 y% o/ B8 e
   enRet = Ok;
$ }* t( ?6 S& T  l; q+ W
   return enRet;

  h/ S" _* V5 P- r
}
$ P% G" I, x3 @6 `7 [. |
/**
4 P2 u; J( y8 T
******************************************************************************

3 _0 y4 `, X# j- u) i8 H
**\brief  RTC周期中断方式选择
. Q/ f. T: r* u5 h
**
( F4 \- h5 N$ n/ `/ R1 z9 E& L
**\param [in] pstccCyc周期中断方式及周期间隔选择

, K: M% f. D, m
**

6 O: W' ~; X. q: A, [, P' [% `
**\retval Ok
2 E( q: g# m% [1 \1 I5 w; k
**

& o0 `! \* \1 c' W, O
******************************************************************************/
9 V3 a1 \7 }8 b" i8 e8 y! ~+ |
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)
4 [0 L+ I4 p) p. S/ \% U
{

0 o4 a. j2 A# N; j/ [& z. F
   en_result_t enRet = Error;
- ?( A) ^# ^: k) Q
         ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));

* b/ m' B) |0 p- x- {- z
         ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));

& h9 f( m7 U0 e* g: p2 w
         M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;

- c$ ^) R4 s4 j: V
         if(pstcCyc->enCyc_sel)
/ C. n  T* l6 @' R
    {
/ a! f8 E( V8 E6 W) m  n9 Q
       M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;

/ r, y' [) v& t/ Y) K9 E0 f7 d
    }
! G/ J6 |3 N1 C( y
         else
- q2 y( H# M4 N% J
    {
/ B& W5 _* s: Y
                   M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;

8 q) F$ F; R- p- n7 f  \; Z
    }
7 |$ v, M1 _$ |
   enRet = Ok;

7 j# E5 `, N% f4 M, B2 d
         returnenRet;
6 D1 M. e! m7 ^# ]1 u
}

$ q+ L" [. I, P" p  v
/**

1 ~; u! X5 ]( S9 P/ k
******************************************************************************
1 z" M6 j. B$ T. {  U! j9 L/ `
**\brief  RTC时制选择
8 l3 T$ J: M4 W+ q
**

  |: a, q( X# L8 h
**\param [in] bmode12时制or24时制
9 b7 E8 T6 I  q. R. I
**
0 d. V) N9 {* r2 N4 T7 s
**\retval Ok  设置正常
) r/ C# S" A9 y' S5 p9 \+ a  F' U6 |
**\retval ErrorInvalidParameter 设置异常
' x' d3 t5 M' K* C. i7 E
******************************************************************************/

3 Z4 M8 S4 P8 {( t0 ~9 _
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)

  v( y* A4 }! n
{

' |; s. N/ o* O3 o! U! Q6 I
   en_result_t enRet = Error;
3 u; p% a) F% G  y
   switch(enMode)

$ r6 T9 M  l% U4 D/ x2 g- }6 ]
    {
8 r" {0 M. V) b
       case 0:

, D8 j+ f8 M0 K& B3 x8 I
       case 1:

# g- {1 \# b9 V9 |1 g* m
           M0P_RTC->CR0_f.AMPM = enMode;
% W6 v" g& B( n- @
           break;
$ j* S7 G* a" ]) q- v* r  y
       default:

" x. I: p, [9 \0 f; k2 h( N
           return ErrorInvalidParameter;

. Z. L0 H; H+ ?( S# @
    }
  e* z3 Q! n# |) p
   enRet = Ok;
4 d- `' O0 E# @+ ?
   return enRet;
$ s& `! p8 T0 C' a  V  T
}

: R5 h9 X. C6 F9 b. B- P
/**

0 L5 H7 N# _$ x+ Z5 @8 g/ t
******************************************************************************
; }3 p1 z# Y/ y1 B: G1 h: G  y
**\brief  RTC闹钟中断设置

/ D! s" y  V  d6 Z+ ]
**
: }# k: d3 Y& }3 a& T8 p8 S
**\param [in] pstcAlarmTime闹钟时间时、分、周

9 w, P4 ~, R1 f: X: t% Y
**
' [6 J: I# F& J( p0 ^6 Z
**\retval Ok  设置正常
2 I8 ]- r& b! q7 S, B. u5 M
**
9 ^  z1 I" d- [1 j& X6 T
******************************************************************************/

+ g! C; C! s3 H# o
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
$ l" W8 {1 u) s1 {
{
. c% p8 q% m1 I7 o2 r
   en_result_t enRet = Ok;

0 \  S0 V# ~+ F6 j! i
   ASSERT(NULL != pstcAlarmTime);
5 I6 r/ t' Q# _* x/ D
   if(Rtc12h == M0P_RTC->CR0_f.AMPM)
: t# _4 Y+ q) d" h6 q9 F" f
    {
3 z% }7 w8 Q0 U( Q
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);

2 i* H$ R0 y) v8 ?" E
    }

" z5 u) r( e& q) o+ _( U* F5 C$ _0 ~$ M
   else

$ f- K% p. w  _+ \
    {

( ]3 c, E, Z$ V4 |+ d( `& r
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);
  J: W9 F* e1 h; _
    }
  P) z# o" Z; _9 _, _% l' `* u
    if(enRet != Ok)

) h% y- p) k4 w+ w5 B- h0 H
       return enRet;

( @- n- I6 U3 G% h; V
   enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);

) `! D) ?$ P7 J% n0 }
   if(enRet != Ok)
. k! m# X" R$ l2 f0 d6 f7 T
       return enRet;
+ y+ F- U& L6 A# z7 s7 u
   //enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);

. i; K" V) l; K/ Q  i! a1 `+ X
   if(enRet != Ok)

1 s3 P3 b' c' v
       return enRet;   

6 N  \8 ^3 w3 U- k1 I6 x
   M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;
$ U* r" f  `6 ]. a4 P
   M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;

5 R5 M! |6 Y, `! R. \7 {
   M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;
/ |. D3 b' d) q9 N, }9 e( e
   enRet = Ok;

0 v( b7 L' v6 U$ J8 p, d% t
   return enRet;

, z4 Z+ h8 a* r. i3 k  ?' |7 F  i
}
- V, n& Z1 T4 f7 _- _" e8 ~. p$ d$ k
/**
7 c( T4 _, R, P# \+ X6 J
******************************************************************************

7 w8 X9 m) }7 @6 x# X
**\brief  RTC闹钟中断时间获取

- b. w0 f- }' U
**

: H+ g8 z9 |  l& n: K) O" j
**\param [in] pstcAlarmTime闹钟时间时、分、周

, Z: F' e  P8 Z) B; ]0 }
**

: z9 h7 O0 e) Z8 O  q2 n
**\retval Ok  设置正常

  N% N8 |4 _3 a6 O
**

; S$ N9 k5 {1 D2 t/ z
******************************************************************************/

. F2 S. s; x( r- T7 J1 j7 p5 o
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

* o' L5 N  K5 S( ?# x- @, v% M8 [
{

) ~: s4 x! r9 M9 z0 w+ G
   en_result_t enRet = Error;

" \. s; e; ~  V! v" E4 O6 E5 U# X, Z
   ASSERT(NULL != pstcAlarmTime);

/ h. {. s( W+ i6 O* C' W
   pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;
, U7 h0 V/ Q7 i
   pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;
& F; G; W/ _8 y0 L4 p) \+ \( A
   pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;
) g& M! n2 [; G: O
   enRet = Ok;
, i2 c; p7 I3 O! {
   return enRet;
; O# `+ \, O7 Y6 g4 o9 p: f, A
}

% A* Z' b# H7 f" D% d" v$ n
/**

3 s8 e$ \: k) V! s! P8 R$ ], s
******************************************************************************
8 B* h" [$ m8 v) M4 G  {
**\brief  RTC 1hz模式选择

3 x) {5 Q3 `9 |
**

$ Q0 b% V; q: o3 n
**\param [in] bmode 高精度和普通精度

. c& h0 D0 M8 s1 N0 I: h
**

9 U5 v2 m. K1 {5 m! B8 Q
**\retval Ok  设置正常

( I- T  R- I7 ^3 v
**
* W* n5 z' Q: S7 L
******************************************************************************/
( |; Q: J6 Q; ~/ o+ ~0 l/ L) K
en_result_t Rtc_Set1HzMode(boolean_t bMode)

: z9 D- T8 I% ]( M0 ?
{
0 v  P$ Y) e) l3 l  `, G" G
   en_result_t enRet = Error;

) L9 @1 f0 [: h0 u! o) B/ Q0 X/ s
   M0P_RTC->CR0_f.HZ1SEL = bMode;

& X% U5 ~0 b: v# L6 k% N7 B8 L2 a
   enRet = Ok;
& i4 @- E: _' j
   return enRet;

% g7 C8 T: E0 y- z/ C, c
}
/ J9 ?- }, ?1 Z5 Z
/**

( ^% X3 m+ z. D0 t
******************************************************************************

* m! v0 A3 r) Q- q4 U5 @4 g, c. g
**\brief  RTC 1hz补偿值设置

; a4 C7 P; w1 u1 |* \/ F
**
) ?, O! F6 ^, ?* u5 O0 d5 U
**\param [in] u16Cr 补偿值

9 B7 M, H' B0 G! Q( l
**
4 z, W4 d7 ]! v5 G
**\retval Ok  设置正常

" k6 q8 i+ o6 k7 y3 j' V+ n7 g
**
3 w# }- w/ V6 Y7 H" e% T7 ^
******************************************************************************/

5 m; s7 O3 |  C; f4 j/ R5 u
en_result_t Rtc_SetCompCr(uint16_t u16Cr)

& I! g- u+ ~0 K3 W( y3 {# u- q
{
! y; @& i+ K, f3 x
   en_result_t enRet = Error;
; a" @$ E* x( a/ l: M# [
   M0P_RTC->COMPEN_f.CR = u16Cr;

+ I: r5 S2 [0 a- c% S
   enRet = Ok;
' |6 {  X& _0 A/ t4 o% D# X7 J1 H
   return enRet;
6 y3 V  w( d. B3 v2 A  Y- W8 ?4 b
}
3 _9 X/ b) i8 Z3 `" x: L, z
/**
# I" n8 P! K8 d$ {- n5 F( ~
******************************************************************************
7 Z9 t) h" X. a' i0 L5 _# i% f
**\brief  RTC 功能使能设置
6 P  c' s; S# Q8 t) h
**

5 b7 W/ X& O4 I* Y/ Z' S
**\param [in] enFunc 功能选择

6 z5 O5 r; l5 |$ h* T' g
**
8 p* ~* i. g7 x1 \, L5 c3 i
**\retval Ok  设置正常
6 E; w: s& H2 F( F" `/ ^& u1 q& C  G
**\retval ErrorInvalidParameter 设置异常
" Y+ f2 Z5 i# H" K
******************************************************************************/
- j& o% _6 \. I
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)

$ N, J0 c" D4 ~: C. w" `7 e
{
. @+ g  |1 x* g
    ASSERT(IS_VALID_FUNC(enFunc));
4 l7 _* |* U+ }7 U5 _( o
   switch(enFunc)
8 a+ j1 l7 W" j! _4 ]9 n
    {
& r# }: e& l: D! H) }
       case RtcCount:

/ e0 u8 `8 T0 s) [, Q' s+ ^
           M0P_RTC->CR0_f.START = 1u;
  S/ }( q) }# w' T8 n
           break;

6 _( M8 K: P* F
       case RtcAlarmEn:
8 r: f$ M8 P5 L; b6 ^) E* z
           M0P_RTC->CR1_f.ALMEN = 1u;
  g2 {5 d  E$ w# {. ?: j  i
           break;
9 P! N# K) i, O7 \# I! ]
       case Rtc_ComenEn:
, d2 |  c$ k0 o
           M0P_RTC->COMPEN_f.EN = 1u;
8 o. \# W$ g9 a$ p+ x
           break;

0 i9 c; {" P2 E! P- f" r
       case Rtc1HzOutEn:
0 O0 T) {( [: P8 b
           M0P_RTC->CR0_f.HZ1OE = 1u;
( K5 `: \, C& R: J+ {3 }4 b; M0 H
           break;

& z# w; i- @' k' x3 {; p
       default:
! _7 @9 k# W. O& p( e1 @
           return ErrorInvalidParameter;
& _: ]- i6 M* p/ p7 w
    }

' k+ @& i" |, B; `6 e- F4 Y
   return Ok;

# O. o2 l5 @9 ^, P7 D8 I
}

( M" t5 Z% B, `" X1 Z, A, \2 H
/**

" P! o2 Y1 d7 k; v, V
******************************************************************************

; o# z% |0 Z/ B6 R: g3 c
**\brief  RTC 功能禁止设置
$ X. h4 I1 t* S1 `8 M$ w* X: Z6 O
**

9 G6 Y' j3 A$ ]; e3 C1 B
**\param [in] enFunc 功能选择
$ |2 `! L) g1 u" [
**
9 E7 o  \# G, X$ q' v, U# t
**\retval Ok  设置正常

3 m% Q& Y& @  D1 m
**\retval ErrorInvalidParameter 设置异常

( }; i; d! c) C) _6 W
******************************************************************************/

# \1 `, S  m# ^& U# k4 R$ w! i
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
! \" w- i1 w) B0 P+ c5 P
{
; Y; s+ ~- R, `3 s7 u
   ASSERT(IS_VALID_FUNC(enFunc));

5 N5 _( w( f4 j. y! ]  L4 R
   switch(enFunc)

+ J  e. y9 g# \7 \
    {
8 ]) A9 u9 o2 h5 |: u
       case RtcCount:
3 m* L. A. M0 K" s
           M0P_RTC->CR0_f.START = 0u;
- w2 I) q& X6 ~( j
           break;

  g0 s6 d+ ]6 p& a. Q
       case RtcAlarmEn:
- r9 j7 H1 D6 v
           M0P_RTC->CR1_f.ALMEN = 0u;

! m: |- P" k2 h
           break;

6 q7 y6 q' e4 c) n9 c
       case Rtc_ComenEn:

3 D5 e+ R9 b/ J" k2 Y, F
           M0P_RTC->COMPEN_f.EN = 0u;

3 r2 |0 I( P" c0 V
           break;
4 w3 X( ?) e# T; B) ~
       case Rtc1HzOutEn:

" L) W: i; T( Y
           M0P_RTC->CR0_f.HZ1OE = 0u;
( \2 v: D2 T) a) H' ^9 O" d/ m& N
           break;
; k, d2 ^/ @: G% K5 h
       default:

" l' a! I* s0 a& `, T$ N  r+ B
           return ErrorInvalidParameter;
- \+ F- m4 f6 b
    }
0 C& F" o& P' Z: |
   return Ok;

9 B/ b" F$ H7 T
}
( C6 @  N( L, `% Z5 Q3 x
uint8_t Change_DateTimeFormat(uint8_t u8sr)
, C2 ^5 r; S  z2 `9 {& @
{

- w* q8 @$ h7 p8 J) P. E: O/ K  _
         uint8_tu8de=0;

! x2 L$ Z) b* @, h0 r; A
         while(u8sr>=0x10)

4 K* K+ y3 B. A
         {

2 [0 u0 w$ @8 d8 j) D1 c
                   u8de+=10;

7 F% e4 m+ @1 a% @1 q9 J
                   u8sr-=0x10;
( L6 t0 ?, u* B9 {% ^# ^, x
         }
6 i2 h4 A" J6 T
         u8de+= u8sr;

, q/ M/ _2 V0 t3 d
         return(u8de);

, D. h0 O1 {- H" g
}
$ W- X0 @' V: r" T/ p0 _
/**

# s0 W4 X5 j/ U# {- _' @7 L3 z
******************************************************************************
: \7 u1 S! n" i) K7 J
**\brief  RTC 平、闰年检测

2 M3 L* I0 I7 P  V/ |7 d! V1 ^8 x
**
9 ^" ^4 E6 L6 N9 u( F6 n
**\param [in] u8year 年十进制低两位

; a" P7 C3 N( J# ?
**

" V  [" B  A7 ]1 L' `+ u# }
**\retval 1  闰年
! l! Y7 L% v2 r3 H
**\retval 0 平年
! F& x" n  e: Q; @8 b8 P
******************************************************************************/

6 D% T' [1 d$ Q3 y* I8 z9 F. j
uint8_t Rtc_CheckLeapYear(uint8_t u8year)
1 ^& {: P  c5 N
{
; @: E  w( O7 r4 P, q
   uint8_t u8year_shl,u8year_shr;

) S- z4 B+ E6 ~; a9 g7 I/ s7 `
   u8year_shl = u8year>>2;
- a! u3 B0 g2 d. d! r- R) R6 C
   u8year_shr = u8year_shl<<2;

% O2 q% z# P$ ?0 [9 w2 {
   if(u8year== u8year_shr)

; b, [2 `. `, T
    {
4 p2 V, J4 l4 D
       return 1;
) k* A6 v6 t/ R$ b* B' R/ X
    }
2 x' w- \2 n. R
   else

6 Z; ^3 f* b: I5 K: s7 ^# T
    {

# `: ^. Z' n9 u) @, A' f7 e! C
       return 0;

6 g2 m9 b4 C/ z/ r
    }
2 b' r3 r2 v$ s0 J+ K* v% ?6 P
}
) S; Q9 w0 n6 r( s
/**
3 Y. A/ V6 H! R- j1 V0 s1 @
******************************************************************************

; m# f, _) u2 ^7 H. G- O
**\brief  RTC根据日期计算周数

4 K8 @% _7 M( s' j. A7 h% S
**

3 }4 F, A! D- [7 @# ]
**\param [in] pu8Date日期
/ @$ Y  |) W* L
**
, o4 i/ ^) g% [. E$ {
**\retval week  周数

/ Q1 u0 S  U4 R& ^
**

7 M5 p' Z) J% y4 P, P% x
******************************************************************************/
. f; O2 {6 y8 w1 f) J5 L# |6 [! X2 Y* W
uint8_t Rtc_CalWeek(uint8_t* pu8Date)
+ p% b- E& b" x: L' d5 O9 s, i
{

4 U! t/ G# G' X
   uint8_t u8week;
" T4 C) \4 C3 {: j, x
   if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))
" M+ I6 q8 y5 D4 p! E
    {
# C2 t. k7 C7 V' `) n4 a) w
                   u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
- a- Q* B2 u1 y" S$ F5 m# {
         }

& D/ z, O" U+ K/ x8 a! W9 {) L; m# {
         else

6 A2 m: [6 \3 ]. d) k1 g$ {1 m
    {
  M. C/ {/ d- ]* ~* S& v$ s
                   u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;

2 m; v& j4 n% M' i
    }
* f! _# n& I: I
   return u8week;
: E  _  f& R3 X% j0 K  k1 J
}

# n  A& R* n, x* y8 s
/**
' w2 E+ k) a" i" U) s4 a) M
******************************************************************************
6 U4 ]5 K0 z9 ~5 w6 o* |$ N
**\brief  RTC根据年月获取天数
1 }4 N1 n7 g8 U9 N
**

7 y7 w8 l9 @" i6 U7 q; F! x
**\param [in] u8month月份,u8year年份

, |3 x7 S4 m3 l9 g" @6 J
**

& q9 O7 l7 I' i6 x. @
**\retval u8day天数

: ]3 `: x1 O' ]
**
  C" K  _  Q. |. @' G' n
******************************************************************************/

8 p! S  ], b3 n9 L& q1 ?5 T1 R& _: k2 A' B
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)

7 ?! m6 n+ A: f
{
5 ^" x' i  ~- Q6 ]8 q  W
         uint8_tu8day = 0;

, y6 c2 u2 z1 |; _
         

9 A6 X; ?( P- t9 l$ `7 }6 t) d
         u8day= Cnst_Month_Tbl[u8month - 1];
0 m( U/ ~% M4 R# X* J
         if((u8month== 2) && ((u8year % 4) == 0))
0 j" E9 y+ a8 p$ o
         {
) v0 s: a3 a# g& S% Z& V& u+ M
                   u8day++;

' T, r! P3 e% B
         }
+ W) b) F; b; v3 p. L+ ]3 a. Y
         return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31
) J% F8 H2 m, Z9 c7 ^$ o% ]4 V
}
6 }% ]* c: ]/ ]( c6 g. D& v  U
/**
* T+ |7 y5 j3 K5 @
******************************************************************************
9 D$ F3 }( T4 P: }$ K7 _& D
**\brief  RTC根据日期计算周数

* q. z5 a# q3 C0 b- O( ~
**

* C8 f% N- _6 L9 |* c
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值
! E! H4 G9 T' ?" r
**

) Q2 l& X  r9 I& H" k+ q- M
**\retval Error 错误,Ok校验正确

( S, k/ q/ v3 W. P, [, e
**

. k' v$ o/ r6 i& ^" v
******************************************************************************/

! m) Z  i  Q1 x: A  u  E/ z" v, h# T
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)

' s; U& x# i3 h0 V# Q: i* C
{
& z7 F! {0 t" u+ c: h  g' g! W8 F

2 d; y9 E$ X/ R+ Y' B; C3 d& D5 f
   if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)
% h. m( Z& n5 b0 W: C
   ||(u8data > u8limit_max) || (u8data < u8limit_min))
) N  P7 ~2 t/ B* k* h; ^3 D7 i1 R) d5 J
    {
' x6 V  Q4 N# V7 Z+ t. b! K
       return Error;

4 O3 D* y' _' Z" m8 \
    }

2 u; f1 ^2 U6 P9 J
   return Ok;

  i, R- b" e2 y4 k% r
}
1 O; N  ~1 k0 F9 C; i8 a1 p9 e! J
/**

& t& W+ W1 W) U" E( J- j
******************************************************************************

4 l3 p, W3 F0 q3 m( U% w7 z
**\brief  RTC时间格式检测
8 `" E0 _4 d. x6 z8 C! O8 X
**
% C; O# ~! s& A% q$ c4 P) Z
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式
9 a, h* U" A8 o& F+ N* c
**
% E8 J( m1 l* \
**\retval enRet校验结果
+ G3 q  e1 {1 s( R2 o3 @' d! v
**

- T$ X( H' t9 K, ~! T, r2 h+ U
******************************************************************************/
  A& K4 I* x  Q1 ?
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)
! ^% z1 L" P# O( \
{

) y) D' P- \- ]
   uint8_t u8i=0;

1 ~7 ?3 }& W  E9 j, u. u* w
   uint8_t u8mon_max_day = 0x28;

/ |3 q/ V' \5 u+ g9 l
   uint8_t u8date[3];
9 U2 j( W- M4 S6 p
   en_result_t enRet;

3 @' w: g) h7 y8 Y
   while(u8i<7)
8 e/ g4 D& C; y1 U
    {
: b, s) Z9 H% L; L0 d
       if(u8Mode&&(1<<u8i))

, ~/ _: h3 ^- I$ \6 A+ a! I/ d- I
       {

8 i, o5 Y5 j4 s$ a  J: U
           switch(u8i)
( T) n& f9 k, p2 E$ S0 R
           {
  ^: L7 Z' ^1 |, s
                case 0:

% U( A0 m' R0 M& n) D# a
                    enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
" n# E0 D( Y! A: w
                    break;
4 T! _7 g5 L5 |- Q+ a6 a; ~" {) [
                case 1:
; |2 T, V* _# \: g+ {+ T9 m
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
2 N; X; V* l1 @+ Z
                    break;
) [3 U4 J4 R% x+ k& J
                case 2:
, H3 p$ H) I4 Z
                    if(Rtc12h == M0P_RTC->CR0_f.AMPM)
9 w5 e* R( Y% n- M( @* F% z  D
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//
. a9 ~- ~( v1 p& l$ h/ @
                    else
% K* B/ K2 P; m1 i4 C
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);
" v: N3 [2 A8 Z* ~. D' V9 [; {
                    break;
. M. [8 b& R7 w# ~
                case 3:

4 t7 @1 I! j. R* ?3 l
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);
7 |/ Z4 t+ T( j( m% E& H1 T' P* V
                    break;

. |+ \8 B! N; A  _+ U! L3 m8 j% i
                case 4:

! G9 |0 I/ c. z( Q
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);

/ I; S( `0 A& h8 U8 }/ t
                    u8date[0] = *pu8TimeDate;
( j5 c0 h3 U  j, T4 S- V$ s8 x  J
                    break;

8 K0 U" Z# p# n7 v/ [
               case 5:

- F: B: P0 I2 Z! A
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);

, B0 j5 ?: t' D9 a: h
                    u8date[1] = *pu8TimeDate;

5 p4 b# h! m; R4 T  n
                    break;

; K7 t0 d/ P, ~: c1 ^
                case 6:
3 |# h" m% s# o! y& j+ z* J7 D3 u  _; _
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);
7 l# W& C  }: G+ B
                    u8date[2] = *pu8TimeDate;

( [6 Y* z4 E+ t; y. c
                    break;
' C2 h6 d: x! @" ^  f; T
           }
( B2 t( H& d9 ^: C9 L
           pu8TimeDate++;

/ p9 h5 o7 d' _/ E% b
       }
+ w" B/ t% S% H, `& m& [2 {
       if(enRet!=Ok)

) U8 w, o, a0 d  t& X& @
       return enRet;

% ?/ x# J- J( z6 O  {. D2 w
       u8i++;
: {+ R& [# }$ o$ t
    }
3 K" h9 Q+ F# ~
     if((u8Mode&0x10)&&(u8Mode&0x20))
4 p4 ^- G% ^! l: Z) r) V
         {
" O0 w2 h' t, H2 `8 {2 X6 }: C4 v
                   if(u8Mode&0x40)

* ^# X! ~7 p7 ?
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));

/ Y$ R( m$ ~8 N
                   else
6 k& A% V" m4 P: R/ v+ {
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);

3 P! {# ?9 c1 B6 X' ?% J$ k4 r9 @
                   if(u8date[0]>u8mon_max_day)
) X. l1 ?4 ?! v. \' u
                            returnError;

4 v! Q4 q/ z2 J! j% y0 T
         }
( x. j1 L+ G, M& C6 R# J
         if((u8Mode&0x10)&&(!(u8Mode&0x20)))
. u2 [* d* K- M  \0 L5 d3 U5 R
         {

4 k1 K! W- ^- N/ L2 ^& w1 g
                   if(u8date[0]>0x28)

$ C* F# a0 ~. a
                            returnError;
) r& D0 V7 H$ ]' v* K
         }
* {) O5 n1 S. C& M
   enRet = Ok;
9 f! b6 W6 Y& A/ W8 u( G2 m
         return(enRet);
% f: B4 Q" o9 g2 {) B: G
}

& A3 d# C1 o, K3 |! @5 I
/**

0 Z8 [1 I: j" v8 ?7 b4 D
******************************************************************************
  W% E- l6 a6 F9 l$ N; C
**\brief  RTC设置时间函数
# w1 o# X5 |4 ~# t2 S* f& M! W
**

1 N* g  l6 ]; Z" k8 W
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期
& a1 y, f$ Y3 b- F6 x! a
**

# y1 u5 r6 a4 X: {& t  X/ L
**\retval Ok  设置正常
4 A+ O  W6 R3 b/ M: `
**\retval ErrorTimeout 时间溢出错误
- H* k, C5 f9 S) v
******************************************************************************/

5 g0 I/ U2 J- l; t
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,

! W, c. r! J7 \; a( s
                            boolean_t bUpdateDate)
9 s' g8 e5 S6 b! [% D
{
# t1 |1 e7 j$ V% y6 |1 d4 g: m
   int32_t u32TimeOut;
+ f0 `  @! i0 @, D8 Q+ y+ s; n& R
   u32TimeOut = RTC_TIMEOUT;

2 m  u# _9 J6 c1 o, h1 @
   uint8_t* pu8TimeDate;

/ N+ @: Z6 h! U, R
   en_result_t enRet = Ok;
- G: ], x* I* C( Z9 R: _; L9 y
   pu8TimeDate = &pstcTimeDate->u8Second;

, [6 Z& w+ T; r+ e" `4 H/ J
   ASSERT(NULL != pstcTimeDate);

$ K" }5 C: i6 G$ s: j$ y: n# q
   if(1 == M0P_RTC->CR0_f.START)
5 E/ y7 {5 Y3 q8 z  c
    {
4 p: P! v/ z1 h. c& G1 S+ V/ i9 s
        M0P_RTC->CR1_f.WAIT = 1;
# \4 W4 H3 U0 K! _
       while(--u32TimeOut)

0 Z, l4 D% r: f- j# N: _
       {

4 G6 r6 o+ B$ \2 Y* k7 `5 U  q3 v/ o" c
           if(M0P_RTC->CR1_f.WAITF)

0 m- U/ F6 D, |, z% p
           {

3 g, C4 h$ M4 K) O3 P) S& A
                break;

) l. {; t' o9 o$ x0 _
           }

+ S* p1 Q5 L* \" p# B
       }

1 `8 x* O" A3 N8 F
       if(u32TimeOut==0)

" {, K  o$ ~1 Z5 s! N* f. L9 N# R
       {
/ G; Z7 V. `$ h4 O0 L, h5 Y- x
           return ErrorTimeout;

8 m, s( b8 l4 b- N
       }

! {2 R% B# z; ^  V% c5 }6 w8 r8 L6 k
    }

& F; p3 a  k: I6 c: ?' }
    if(TRUE == bUpdateTime)
. S6 k: D4 O% S& \& |/ r) Y
    {
, n+ i. Q8 @1 d3 d
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);

" t4 U# F6 p0 ?; Y- g9 p9 f6 Y( s, q- W, q
       if(enRet != Ok)

2 k9 J4 O) C" o1 d; A
           return enRet;
' S% n! ]4 G2 {
       M0P_RTC->SEC = pstcTimeDate->u8Second;

  Z' ~3 v. P7 S
       M0P_RTC->MIN = pstcTimeDate->u8Minute;
2 I% o0 `. ^1 N. f. o
       M0P_RTC->HOUR = pstcTimeDate->u8Hour;

9 T, J6 D4 h' @" H6 A3 D
    }
2 n+ u0 V$ r  Y/ [; R4 L3 y
   if(TRUE == bUpdateDate)

- Y% X2 ^- J5 J* v* a
    {

7 N: Q2 [  x* I9 T6 z; S
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);

' o6 P: |) c+ M9 P
       if(enRet != Ok)
! S0 K( E& r  r
           return enRet;
9 d1 ~( S- Q  i4 |: K, l
       M0P_RTC->DAY = pstcTimeDate->u8Day;

- {; h9 n+ _- w# g" t2 g
       M0P_RTC->MON = pstcTimeDate->u8Month;
9 l. I( }) q$ x. D- j* J( @, a+ ]' y
       M0P_RTC->YEAR = pstcTimeDate->u8Year;

/ r. ^, O( M; p
       M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;
3 C" @" e- N! Y* I: N3 `' R& X5 e) ?% T$ X
    }
- N. r3 i' B, A
   M0P_RTC->CR1_f.WAIT = 0;
, s* e/ p, S: O; O7 i% [+ B
   if(1 == M0P_RTC->CR0_f.START)
  H6 w  @; s# u2 i
       while(M0P_RTC->CR1_f.WAITF);

6 D3 k; R4 A, ]- G
   return enRet;
% {  q% U% O6 _# b( p
}
. U. Q1 x. R" N) O
/**

6 u( ?. U$ ]; x) \0 [4 ~6 {
******************************************************************************

1 f0 T- f; W( J3 d: K4 w* j4 m
**\brief  RTC获取时间函数

  T. Z) e9 y8 [7 D5 t
**

& S$ e3 }% v$ @: b- ?
**\param [in] pstcTimeDate日期时间数据
0 C2 j9 s) j1 K$ ]& M* E, {5 L' t" p% y0 ^
**

/ T2 k5 \/ e# d1 G" w9 R
**\retval Ok  获取正常
. Z! B% Y& N9 c
**\retval ErrorTimeout 时间溢出错误

  c( Y  h) z9 y+ \1 t' N
******************************************************************************/

, ]! W. ]% S/ B# w1 G
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)

/ Q6 M& |/ B2 u2 P
{
- r% }8 a( ~; a+ m2 k
   uint32_t u32TimeOut;
. a& A1 E* Q- |: `: p) ]+ I
   uint8_t  u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;

/ O% F- }3 {! F+ M$ l' t

+ U2 }! M7 v4 b% }
   ASSERT(NULL != pstcTimeDate);  

, z+ R9 z) |" ?" W5 a
   u32TimeOut = RTC_TIMEOUT;

7 @. F; s0 D1 y
   if(1 == M0P_RTC->CR0_f.START)

0 X( ?' C* q& J* m+ f
    {
/ B. ^' {: _, X4 }, \9 K
       M0P_RTC->CR1_f.WAIT = 1;

5 ?$ ^# k+ s$ M
       while(u32TimeOut--)
" ?6 V2 q( }# j0 A4 v0 K0 m9 P" i
       {

, h% |4 Y. [1 n4 O
           if(M0P_RTC->CR1_f.WAITF)
6 I% a( B- t7 m% S) J! b5 W4 C! s! _
           {
  N6 a' g* L3 N
           break;
. P8 {1 }( I: J( u/ k0 j
           }
7 j6 q1 O3 J& X( O' l- M% }8 Z5 b6 A
       }
3 S1 }7 t& Q& ^; [; h
       if(u32TimeOut==0)
* f: @. J: w5 v0 M/ k. [
       {

. \" }/ n& W6 Y* e, r, ^7 R% j7 Y* O
           return ErrorTimeout;

% B  e8 d+ B; {3 D# X1 e
       }

# o! b! s, B% b
    }
: r, `/ b9 l' P3 K. ]1 A9 s
   u8BcdSec  = M0P_RTC->SEC;
2 B7 |  X9 P1 b6 N4 W
   u8BcdMin  = M0P_RTC->MIN;
' Z8 w  ?- Y6 f! a" ^
   u8BcdHour = M0P_RTC->HOUR;

  @) @. c4 U  W0 k
   u8Day     = M0P_RTC->DAY;

1 y: |8 c" ]9 E0 @1 k. n" l
   u8Month   = M0P_RTC->MON;
$ @& j' t5 M) \  {, `/ j
   u8Year    = M0P_RTC->YEAR;
$ d/ G$ @$ d2 ]+ ^$ p" M
   u8DayOfWeek = M0P_RTC->WEEK;

) k2 @4 \. K; Q% h3 t% {

: c$ F. d/ I/ m' k4 r3 f) v7 e, q
   pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);

" I; [3 l3 @: i" p* R* r% v# c
   pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);

- i/ s$ o/ ?0 g8 v3 F1 B" N* y
   pstcTimeDate->u8Hour   =u8BcdHour;//BcdToDec(u8BcdHour);
( [" J% Z# p' D  k+ h
   pstcTimeDate->u8Day    =u8Day;//BcdToDec(u8Day);

2 ]5 e: S- I1 |
   pstcTimeDate->u8Month  =u8Month;//BcdToDec(u8Month);

6 N7 N* Y, C3 y! k' t8 c2 g
   pstcTimeDate->u8Year  =u8Year;//BcdToDec(u8Year);
" u6 R7 b! ~  Y2 W5 x6 B0 ]
   pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);

* Y* p$ v% j( g, z; P
   M0P_RTC->CR1_f.WAIT = 0;
6 D2 `% z8 p. ^4 c- g1 D
   if(1 == M0P_RTC->CR0_f.START)
) R& f0 O5 f3 e! ]& I% [
       while(M0P_RTC->CR1_f.WAITF);

$ T$ B1 |! L8 g0 j8 @  n4 o
   return Ok;
5 \/ p* e3 G* @9 I$ `& b
}
9 Y8 W- ^2 v4 ?' \/ X  ^/ @
/**

6 G/ ?" J7 j9 K- R
******************************************************************************
8 Y8 u) K" j* b: P
**\brief  RTC计数or读写状态获取
) k5 }3 g' C/ c0 Y  o
**
0 z' ]# h; }" G0 ^/ R$ V# ^1 K
**\param [in]

1 q( d  Q9 ^1 n, f/ v, ~2 H4 r% g
**

0 z4 n+ g; k/ H4 R: ]! _/ M) I
**\retval 计数or读写状态
) o2 _2 v4 _5 h! d
**
( ^& k" |9 W+ m$ [1 J
******************************************************************************/
7 p1 V5 q$ H6 W$ @. R: i
boolean_t Rtc_RDStatus(void)

5 c0 h# y; d& a
{

6 n7 u4 L+ I4 h% P6 x9 D/ A
   boolean_t bRet;
1 z1 _; T7 |! m2 k
   bRet = M0P_RTC->CR1_f.WAITF;

. K4 e' X" o: L- R
   return bRet;
: i* L: o3 a+ O% C
}

* a' P+ n. `& W7 r+ X
/**
. A% k- H# o4 z8 C
******************************************************************************

9 ~' H& y( K  `* F
**\brief  RTC闹钟中断使能

% K* s( P4 z; L& b  i4 V
**

; K5 H4 i* T+ b6 s3 e7 q$ V
**\param [in] enordis中断使能or禁止

% x: R' a/ P# j
**

& ~: q1 S# T( z- r
**\retval Ok设置成功
" j* o* J; u$ ~
**

; _( t" F7 a! V, U* J
******************************************************************************/

7 \8 o3 O: G5 K6 Z- K- \8 x
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)
* M, U- Z+ M' H( W: D  H3 e$ _7 V
{
: U6 r1 ~5 ?6 ~" D
   en_result_t enRet = Error;
( [0 ?  y- J3 d" ^1 k8 F
   M0P_RTC->CR1_f.ALMIE = enIrqEn;
3 h* K5 q/ A8 i, O% x" i6 z
   Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记
6 ?7 z; x( [% z* Q
   enRet = Ok;

' C; |. g+ m, N) ^! \) S
   return enRet;
0 `4 T& g- h; ~& F* e
}

. M& h" R, W1 N
/**

% S+ E$ @) h6 S3 d% B
******************************************************************************
+ R: r8 i# Q8 \" n. j2 q! U' b" e
**\brief  RTC中断请求状态获取

9 g8 v% m8 x% u4 V. ]% D
**

5 F' ^* S/ U2 G# Q2 e* t4 ?" h
**\param [in] enIrqSel获取哪种中断请求

# _" J( m) o9 W. Y3 s$ [  B
**
8 F7 j5 A# }: Y" L. k" Z
**\retval 中断请求状态
- R& F- [0 O, s: K0 l+ l9 X: S+ Y
**

7 _5 Z+ `4 W, ~: C5 w
******************************************************************************/

2 C" R# i, b0 L! l" u- ]
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)

" J6 E9 ?' K( }, O( k# W
{

8 g3 _2 }8 O. F& I
   boolean_t bRet = FALSE;

, Y1 V2 ~) g: o
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
0 W( z+ T) _4 f3 N# I  u
   switch(enIrqSel)

. ?4 c3 s" P9 S( J
    {

* D5 `! T. v3 ?" C
       case RtcPrdf:
9 c# X0 ?4 L$ y
           (M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);

' C! o9 g! J; [2 g. n# f6 ]
           break;
6 P! d+ ~9 H7 P+ f! |" w
       case RtcAlmf :
! Y( u+ E7 J' c8 Y
           (M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);

! |6 a: A2 n, Z  G8 Q( O5 N/ D
           break;
* a4 }" [5 U+ D: D
       default:
+ m$ @! C  D8 e  v0 y4 \4 Z
           break;
0 J, o+ {$ M; j# f4 |* L
    }

1 S  v, {3 Q8 s" q  S" Y, V
   return bRet;

' b9 X& f. b4 P0 U% }0 b
}

2 g7 y- f- w, Q3 ~' k- E
/**

% T. A6 n: C$ p! o
******************************************************************************
6 _$ l. j1 L5 D: H
**\brief  RTC中断请求清除
7 q& o( I; A# l8 n/ h& H
**

4 J$ x- m; z" ]: ~$ f
**\param [in] enIrqSel清除哪种中断请求

3 y8 P, ?1 v( G3 B2 N7 N
**

- \( u/ c+ Y% p3 n$ u( T' p" ^
**\retval Ok 清除成功
+ U6 N  k) t- o$ Q: Q3 h! n( w
**\retval ErrorInvalidParameter 清除失败

4 [: f# l$ }7 {# }6 j# r7 h" H4 V
******************************************************************************/

, q- P+ E9 s- T6 s8 S
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)
. k: b4 f* A3 F4 T+ g
{

1 W! V) M: z6 Q! p
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));

$ C4 _. }7 p8 Y
   switch(enIrqSel)

& Y. [' I5 A" H7 b) l5 E
    {

0 o( F8 q' m* m/ C6 B6 Q. A, I) v
       case RtcPrdf:

" m2 i& R0 T& u6 f, N- Q) R
           M0P_RTC->CR1_f.PRDF = 0;
7 R6 Y  m  d1 c9 }5 Q
           break;

# R( z9 U4 |1 f0 ~
       case  RtcAlmf:

0 g( @1 l5 f( o5 y3 N7 ?& r
           M0P_RTC->CR1_f.ALMF = 0;
3 w: f3 Q- ^7 J+ z, A8 c3 I
           break;

: B- r: R: C# l" s
       default:

7 Y9 w4 @1 R- u9 z9 f6 T; w1 n
           return ErrorInvalidParameter;
) y" m& X9 c  Z7 c$ S* o
    }
$ w+ r$ f4 Q, n: o( z
   return Ok;

# ]  j8 n% P% p) I
}

/ f  S" b, S! m1 A) @

$ Q+ V) M4 D# R/ i( Z
/**

, Q# V6 O0 j! ~/ i
******************************************************************************
5 s7 H" D% _* K6 Z) P
**\brief  RTC中断处理函数接口获取
6 K& n9 V+ e+ _
**

: U# \1 i1 ]- @# j( Y5 z+ {
**\param [in]
8 x" ^, M7 L6 o9 s$ A! Z
**

. s+ T. u7 t7 L5 u
**\retval 接口函数地址
# r$ k9 Z( T- x9 Y: j
**

( E, K- X% [0 N* A. q6 I
******************************************************************************/
- C* i% l; N& _" ?; m
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)

* E& Z% I3 a; B% L% w  M& @% k. T
{

0 \. o0 k' u: [
   return &stcRtcIrqCb;

2 S! A& Z; C: u  c
}

% ^; v) K. R' }" t. ^" B2 o; }
/**

3 ^9 S8 t) a0 D# _
******************************************************************************
5 @4 i% O: t' u
**\brief  RTC总体初始化函数
) B! n) |- G- v* }0 O$ T2 K
**
! `- Q1 u# g1 y& e
**\param [in] pstcRtcConfig初始化结构
7 v7 c" E$ _! ?' X0 f# j- F" j9 {
**

5 m8 o3 o0 R4 ^* z% |' h
**\retval Ok初始化成功
1 A  M. A4 l. J1 g, L+ c
**\retval ErrorInvalidParameter 初始化错误

4 q1 f! Q8 e4 s: q$ t
******************************************************************************/

( h8 V3 L  D: g) Y' I" v
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)
, z9 J1 I. q$ K( b4 I3 K0 {
{

+ V+ p! b' e+ t0 V0 n4 r( v
   en_result_t enRet = Error;

' v3 c# E: _5 ~1 u/ G; y0 W
   stc_rtc_intern_cb_t* pstcRtcInternCb;

$ Y) X# U2 |: b7 h/ Z: J! o# a
   if(NULL == pstcRtcConfig)

3 K0 B# ^3 I! ?
     return Error;

$ j7 ?2 O& {, |; S8 q) V
   pstcRtcInternCb = RtcGetInternDataCb();
" J; E$ M% k) l
   enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);

1 Y! T- x1 X) H1 t
   enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);

1 {6 a3 s: I' Q, _( g: K4 Z
   if(enRet != Ok)

2 n$ E& K4 @( f3 W3 x% M; z
    {
; n2 X) B/ }* D2 A
     return enRet;
1 o' P5 |6 N, B2 h: v
    }
/ `2 \/ D6 ^; P& R- `
   if(NULL != pstcRtcConfig->pstcCycSel)

/ i" r0 I/ g4 t) d/ i
    {

; _3 u* t. i3 x7 s8 u. m
       if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))
1 i/ L& R$ `1 C9 T; Y* N6 _
           return Error;        

. {4 M5 z0 ~3 _% z/ S4 h
    }

6 q8 D& J% ]/ b' W5 N$ M
   if(NULL != pstcRtcConfig->pstcTimeDate)
6 K% C, F* M8 I7 b" S/ k! H
    {

/ A% k8 A, E3 G2 p) h
       if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))
' j# L: M* b" }% j- K# K0 _3 z
           return Error;

# h! {4 l7 u3 H3 @
    }

* C) [! a( x9 F: Q: y( u: n8 }
   if(NULL != pstcRtcConfig->pstcIrqCb)

9 I1 L7 N4 U$ Q4 k) @
    {
2 q6 @/ D0 d3 w
       pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;

7 R2 n. F, }6 D  x5 F
       pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;
$ x: J9 [# |( a2 ~  |6 S3 q
    }

1 l2 R1 G" v; T, s6 V4 i3 C
   if(TRUE == pstcRtcConfig->bTouchNvic)
. Q  a4 j0 X8 A( p
    {

9 |  F+ c6 v* a
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);
' \, i) ?0 _! m* A% o" L: W
    }

1 q: D8 z( y( D" ~9 X
   else
0 u& }/ Q9 I/ u# x( v% X
    {
7 y" b! x# }! {* E+ k& ]7 I
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);

6 y6 G' l: B1 W1 O" B. `
    }
5 T" _9 e( _1 l7 {: s
   return enRet;
& U$ F) y$ y- G4 k' }
}
, T/ V2 N) Q7 P5 G
/**

! [3 O# _4 z# \+ `( s/ z
******************************************************************************
% y# @( X4 |9 O5 r
**\brief  RTC计数禁止函数

% w5 e/ w, c. i# y
**
& ?1 B/ h* K  w8 O4 L; }
**\param [in]
+ m7 q/ k& {% o# \
**

9 O  b$ o6 i1 [* q6 c1 q
**\retval Ok禁止设置成功
, g4 C; [; {) @& z* ?4 |3 z
**
4 t$ `7 I* ~+ H, b2 I  X
******************************************************************************/
2 y  y2 J# s( E2 E( _9 h
en_result_t Rtc_DeInit(void)

! F5 ~0 O5 A% [: k% X! o1 j' P
{

" s3 t9 A- c$ O% ?  I8 M1 O
   EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
6 s1 c" e# t. a* c9 e
   Rtc_DisableFunc(RtcCount);

. r% Z9 f; [7 q! J$ ^* [$ G
   Rtc_DisableFunc(RtcAlarmEn);

6 `/ y# Z' O; r  U7 G4 c* S5 N/ C% P
   Rtc_DisableFunc(Rtc_ComenEn);

9 }/ @) u- D& l, S; {/ Y1 j/ i4 h! N
   Rtc_DisableFunc(Rtc1HzOutEn);

3 {( K. ?6 C3 A
   return Ok;
  M6 f1 L0 \9 y
}

( \" P) Z" G$ X* i, l' o  R/ n
/**
! i$ M) b, a0 X/ M3 n1 b2 d9 j* f) k
******************************************************************************

1 d+ U0 [& o- }7 @8 v( E
**\brief  RTC中断处理函数

$ A+ ]8 M" U7 l+ Z
**

  \% F& ^6 e0 v
**\param [in]
! @: N" Y. c# P* d5 \: L
**
' s5 T: i* u* O1 F' `  E: ]& v. O# Q4 b
**\retval
, @! Z+ N1 W$ h  ^" q, T
**
  {; p  {2 j4 g) g: x" N  \/ d: d7 i
******************************************************************************/
( O; v& V0 W, g
void Rtc_IRQHandler(void)

+ a9 Q" J# I  w9 Y/ M7 i( W# c" v3 y
{

# G" U6 M% w1 M+ O, w
   stc_rtc_intern_cb_t* pstcRtcInternCb;
0 h; I( r& v8 e- ^$ {' \
   pstcRtcInternCb = RtcGetInternDataCb() ;
5 |1 v; S/ y) P4 c6 e5 \9 p5 ]8 V
   if(TRUE == M0P_RTC->CR1_f.ALMF)

& D- h' p4 D2 m
    {

4 |7 J/ @+ \' K7 s
       M0P_RTC->CR1_f.ALMF = 0u;

: \# l* K! A' k. T
       if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)
, \0 g" v$ H' s5 s
       {

" R8 _7 e; ~: z9 p  c
           pstcRtcInternCb->pfnAlarmIrqCb();

0 E! Y3 p" N/ m# g
       }
8 H$ j$ t8 O! j- i8 D3 B) k
    }
8 Q8 o! u" h( i" f, L3 I. ~" g
   if(TRUE == M0P_RTC->CR1_f.PRDF)
- n1 F$ ~* a4 r
    {

2 m+ n2 M. i8 r& w4 E5 \
       M0P_RTC->CR1_f.PRDF = 0;
! ~  {! `; m1 Q) G3 p; J
       if(NULL != pstcRtcInternCb->pfnTimerIrqCb)

! u' }8 C$ [+ ]" O% X7 y, C
       {
. F+ J' w- B0 j1 |0 G! B0 I5 C
           pstcRtcInternCb->pfnTimerIrqCb();
- I8 x6 U  b0 A8 y
       }
4 V& q% w) x' E) `, z8 f
    }
2 r' V, U9 J* i9 T! B6 w9 `& v
}

* V* d+ Y$ i' S& O

1 P+ |7 ~- I8 X  ^, M, h

, c1 P3 C; O. k) w, U
static void RtcCycCb(void)

( l, {& E3 N: S) Q1 ]' p2 ^
{

$ m7 k! i" w. n0 I4 g* H3 Z4 b: r
   cyccnt++;
, H0 H: X* K& v2 o- K! H% m, h
   flg = ~flg;
' `: W  B4 H* J( L# R" q
   Gpio_SetIO(3,3,flg);
0 {' \- [+ m. _' l7 W
}

  l; m" L2 s7 G/ L7 ~- l6 }" r
static void RtcAlarmCb(void)

  l  F7 p! p3 s
{

0 H( C1 @+ i3 {
u8Alarmcnt++;

% ~2 s" N! S5 J
}

  z& B$ \0 K3 y5 @" l* @
int32_t main(void)
$ c1 g, G1 Y% m0 _9 t6 i5 i
{

) v( U. Y1 N1 p3 n+ m" W
   stc_rtc_config_t stcRtcConfig;
/ [; N/ S( b/ ]% s& a0 z- f- i  n1 H! t
   stc_rtc_irq_cb_t stcIrqCb;

/ J4 q6 G( F& s3 S' I" V  k
   stc_rtc_time_t  stcTime;
) s* C7 i* }5 c3 d
   stc_rtc_alarmset_t stcAlarm;

, v/ j/ @* B$ N, k9 ~
   stc_rtc_cyc_sel_t   stcCycSel;

; |3 D3 _; o2 f7 x) j7 t
   DDL_ZERO_STRUCT(stcRtcConfig);

6 A8 d6 \) f9 b
   DDL_ZERO_STRUCT(stcIrqCb);
6 B8 n) _, \( T7 Q, N: G- s
   DDL_ZERO_STRUCT(stcAlarm);

) B6 G9 }" N- E
   DDL_ZERO_STRUCT(stcTime);
5 A( c4 I+ _& m; o: C/ M; O
   DDL_ZERO_STRUCT(stcCycSel);

# n9 q- c/ V2 h
   

6 e4 e  ?) h0 k" e
   Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟
% H# z2 I1 W. w: |
   

) X" I1 Y8 r7 C. a, h
   

4 p+ Y2 @6 j$ n+ W  z! ~% r5 S" {# a
   Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口
! i9 e  ~6 x7 q
    Gpio_SetAnalog(1,5,1);
2 ?  T' P9 m% I0 n" [
   Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768   
7 L/ n4 ?) P5 O  r! g/ B/ O: {5 {
   //Clk_Enable(ClkRCL, TRUE);

9 ?" i" u  b% L) {% K3 N" |6 J
   //Clk_Enable(ClkXTH, TRUE);

8 R+ j6 Q/ |. _6 P6 j- [3 w9 E
   Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟
; @3 A9 F( I$ C. g( ?
   
# \. T/ l/ N0 @2 @3 R. Z- e
   stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//

0 \7 U, b: h' N' |  V) }
   stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//
9 B+ U; P& `, w/ E$ ~8 J# z1 _
     

5 w. ^, n! D2 q' G0 H
   stcTime.u8Year = 0x17;
! S6 r+ t) }3 n6 p3 g* y$ X
   stcTime.u8Month = 0x06;
3 t+ \9 p8 Q( J8 k% z; @
   stcTime.u8Day = 0x07;
1 a$ t/ j/ s$ Z/ f; C' Z
   stcTime.u8Hour = 0x12;
' Z4 X/ L- S6 n
   stcTime.u8Minute = 0x59;
2 C- h8 M* |# ]+ l: G. @, i
   stcTime.u8Second = 0x59;

& o: ^' o6 k* f, @0 X8 j( p
   stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);

* Z) P# L( L$ {% i. W+ x; ]
   stcRtcConfig.pstcTimeDate = &stcTime;

" N# ^) I  |+ g) l  B* T. @
   
& `* @2 V# [3 A, [1 @
   stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;
9 r- M3 B1 ~( q) ?3 ^3 S, l
   stcIrqCb.pfnTimerIrqCb = RtcCycCb;
) w* [7 U. h2 f3 g$ N2 K
   stcRtcConfig.pstcIrqCb = &stcIrqCb;
- x1 u7 F7 d/ f8 g" _8 Z; y
   stcRtcConfig.bTouchNvic = FALSE;
$ S+ W) f7 T  i
   

, }$ R  p7 n* c7 T6 Y& j0 U
   Rtc_DisableFunc(RtcCount);

) Q1 E8 t$ U+ u
   Rtc_Init(&stcRtcConfig);

. d  S+ `5 k1 \; R
) x/ n4 ^4 E, o
   

; Y2 r2 j( f8 z5 x# s% z0 L
   Rtc_EnableFunc(RtcCount);

7 W* z9 {4 Q+ Z
   Rtc_ReadDateTime(&stcReadTime);

% ]% E) {4 K' c7 |
   while (1);

, x& m! z3 \( E. |. K( t" k4 K
' r4 K' s$ l( [& \
}

0 @# D! B6 i8 r: d0 G# \$ A

  u$ ]  Y1 ]5 n& n7 O# t
/******************************************************************************

( s6 F  |; ]# \' ^) m
*EOF (not truncated)

2 i- ^. s  h6 U& \
******************************************************************************/
6 n- ~8 m4 |+ a8 Y, _# t/ {

# e3 Q7 R% {4 L; Y7 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-19 09:44 , Processed in 0.070910 second(s), 32 queries , Gzip On.

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

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

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