找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

4

主题

4

帖子

60

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x

& Y5 M! b9 C" o( V6 t1 Y
/************************************************************/

/ z  }* a* b+ |- |4 V
/*******                 样例使用说明           *************/
2 m1 w" ?0 i! U
/*******                    版本历史            ************/
0 X% s# c0 |  @& t+ ]
/*******  日期       版本    负责人  IAR   MDK ***********/  

! c( e; @/ L+ p2 n
/*****    017-07-14     0.1     CJ    7.70    5.14 **********/

7 P: a' B! T2 }
/*******  QQ:3386208645                       ************/
' P# H+ J0 W% Z3 s

! G( N. T8 v. U2 g
/*******               功能描述                  ***********/

7 \  j+ v, w! ~3 t
/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/

% \* ~/ V+ h3 H
/*说明:                                       *************/
2 m+ A; m! m1 j, w( }% f6 e
/*计数初值写入计数寄存器                       *************/

3 l) b* n0 p- @  n" ^$ [0 b2 ~
/*启动计数                                    *************/

( G: c, K  n- D5 t
/*读取计数寄存器数值                           *************/

! @  ~5 |3 Q( C# R0 b7 v. k4 q
/******* 测试环境                              *************/
" {/ `9 C% Q: q, {5 Y9 k5 g
/*     测试用板:                              *************/
( n/ Q( i: C, j% b
/* SK-L110-TSSOP20 V10                        *************/
+ }* B. T; w+ x* s. t9 v" n0 c
/*******辅助工具:                              ************/

7 |) A) v) I+ v! l4 J! m+ K
/*  JLINK调试工具                           *************/

3 t/ w- q/ }8 k# Z
/************************************************************/
) Q& j' F2 K1 ?+ e8 x+ x
#define IS_VALID_CLK(x)             (RtcClk32768 == (x)||\
0 O0 f# d" x: n, K2 S( X: A
                                    RtcClk32768_1== (x)||\

/ f3 |% m( U; }! o4 N2 s. \) s7 \+ W
                                     RtcClk32== (x)||\

. p  z. b( D' Q. x1 {0 u2 X
                                     RtcClk32_1== (x)||\

. [7 Z2 L; ]" u2 d
                                    RtcClkHxt128 ==(x)||\
5 f1 K; Y# a) b9 w" b
                                    RtcClkHxt256 == (x)||\
$ O( h3 Q  b# D$ o  G- h
                                    RtcClkHxt512 == (x)||\
/ P- i+ r* S0 \( g
                                    RtcClkHxt1024 == (x))

& ^0 z: d; j' M" W. q8 R
  l  I& `8 Y0 s3 D/ `
#define IS_VALID_CYCSEL(x)             (RtcPrads == (x)||\

' f1 m+ I3 C- i: p! {
                                 RtcPradx==(x))

. u" E9 k( p! U0 H" C, r
4 ?8 t! i1 M# F
#define IS_VALID_PRDS(x)        (Rtc_None == (x)||\
# N! y6 ?, t1 y
                              Rtc_05S == (x)||\
" B' O5 A6 p0 T) {/ x: q
                              Rtc_1S == (x)||\

! A; r( b) `2 q
                              Rtc_1Min == (x)||\

( ^# w3 W: c% V8 w  \( V1 \
                              Rtc_1H == (x)||\

2 q% n! D9 h) n
                              Rtc_1Day ==(x)||\
; c" l& Y2 Q& F! x% \# [+ K3 f' R* o  Q
                              Rtc_1Mon ==(x)||\
2 l) z/ f( z% y3 P3 U: e
                              Rtc_1Mon_1 ==(x))  
+ U" H2 [- H4 ]
) @( }9 y+ p3 \, ~! z; S8 b
#define    IS_VALID_IRQ_SEL(x)      (RtcPrdf== (x) ||\

, J/ Z* p$ {( K2 h5 f
                                      RtcAlmf== (x))

: ^+ g  `% w4 G0 p
+ g8 B1 \6 u1 g* \& [# m% T
#define    IS_VALID_FUNC(x) ((RtcCount<=(x))&&\
* U+ q7 ?0 G$ r4 ~0 V5 s$ E' S
                              (Rtc1HzOutEn>=(x)))

- j- d* e- {, m8 B
#define    CkDateTime    0x7F

6 a3 x% g' ~& ]
#define    CkDate        0x78
# D! Z! t* N6 F
#define    CkTime        0x07

: s# w) o1 K, p  S% n5 J
#define RTC_TIMEOUT             1000//test 1s

1 H) X0 g" Z" R5 O! n
#define    T1_PORT                 (3)
  r+ z6 I) p2 ]- b) s
#define    T1_PIN                  (3)

# J) x2 A4 R" p
uint8_t cyccnt=0;

2 b/ E& G' r" G- r& ^' C0 r" n
uint8_t u8Alarmcnt=0;

3 n5 n. q( n# y( R/ {
uint8_t flg=0;
. c+ c: O% L3 e# T  N- ]/ y+ E
stc_rtc_time_t  stcReadTime;

9 R0 J8 [: Q. R3 O: P* P0 ?# U" J
9 l! I2 P4 R: g0 T2 ^0 M
/********************************************************************************** \brief  RTC计数时钟选择
( j' q! y; |2 @+ Q7 }% H& X
** ** \param [in] enClk时钟源
/ n$ j1 K7 G3 l) b5 H4 o; `* X  v
** ** \retval Ok
" s2 M4 Y7 M; H# W0 b7 G
******************************************************************************/
- O7 [( [) g' D0 I% b" v
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)

: k  D/ D2 y; Y% R+ g: |
{

# }' M  e1 v5 G0 k
   en_result_t enRet = Error;

* k1 q) S+ D! |6 C( J3 O2 F8 K
    ASSERT(IS_VALID_CLK(enClk));
! t8 A* O. W" e
   M0P_RTC->CR1_f.CKSEL = enClk;

  R: M  D8 T( H' l
   enRet = Ok;
% R1 `( ]  T# l
   return enRet;

% Z, ~# k( R( ^0 _* @/ r9 z
}

: N7 E: H  Q, a0 ~( k4 O) m( G5 u
/**

  M; Y1 C- P5 r1 d1 a% z
******************************************************************************

) Y) J0 Z( P1 y8 X% d7 X
**\brief  RTC周期中断方式选择

+ J: A: I- h+ w: }) w- s" S
**

% Y! G: K+ T6 f  c) z. N7 ~
**\param [in] pstccCyc周期中断方式及周期间隔选择

! Y9 x7 l; v, l
**

: _- r. ~! S' W4 |+ s$ U
**\retval Ok
/ y. n2 J' y3 @7 C  {( o) J
**

7 n/ v0 ]5 j  u( k- }# |3 z
******************************************************************************/

( |6 Q$ ]# Z* A, [/ C' D+ ]
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)
# O1 i8 i; ?2 |
{
/ T0 w$ z% F, h$ r7 e! q
   en_result_t enRet = Error;

' m" y, U$ d# j& S; n. ]: E
         ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));

$ R. X7 [. Q1 I! P
         ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));
: ^( d+ `! y: v* F! I
         M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;
* y4 a7 e# C; Q& p, |
         if(pstcCyc->enCyc_sel)
# d; {; I$ N7 m+ K  s1 n" P0 e" D
    {

! s; p* K% B* g
       M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;
2 r+ J" \! T& |$ Q* U
    }
) R0 ~3 a3 K* w# Q
         else
7 V% O. F' F, d% n  n
    {

, Z) A; Q" y: e( A; ~+ L. q3 i
                   M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;

8 D! ~. \2 `! a/ R* M5 ]# `
    }

4 I2 U* M7 |5 K- X4 p4 R3 w
   enRet = Ok;
  |2 Y# ]! n# D& K
         returnenRet;
" H2 H: S" E6 j
}
/ \6 i5 U& e9 ]- ~
/**

9 m, j( b/ A- O- S+ e. e
******************************************************************************
; n) K& v; A" C9 w5 v1 I& O
**\brief  RTC时制选择
$ m* l2 O- q' n" o
**
+ a0 @7 j, I7 E& Q( h
**\param [in] bmode12时制or24时制

+ l% x) q- m+ D! W
**

( N' A: ]& c. e4 s
**\retval Ok  设置正常
! a( F+ n5 h$ b, t$ z; R- @
**\retval ErrorInvalidParameter 设置异常
$ ]2 p. E! S6 D
******************************************************************************/

  D; n; ~, E, [; {" f+ w% s' b
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)

: A4 H0 _! p- B% y4 k6 {( W
{
$ \  L: `0 H* y0 ?2 a. |8 q- y
   en_result_t enRet = Error;
$ h2 E8 A4 o. @8 H5 L- Q
   switch(enMode)

# I' I+ m! a4 Y  V) l
    {

# k; B8 r' {+ b4 ^. L. |8 R; c
       case 0:
  L1 b% R9 z7 I" u0 t8 n
       case 1:
7 m" A/ p9 N8 o3 V" q
           M0P_RTC->CR0_f.AMPM = enMode;

% c% n0 E* O9 S1 o( a' n
           break;

, P/ [4 p- ^5 E: O0 T; b: }
       default:
; N+ \0 L$ B" D
           return ErrorInvalidParameter;
4 P6 j6 U/ O: |6 T; f
    }
8 n) a3 ~+ O# W! t! F  _
   enRet = Ok;
  `% N6 T) E5 r# u
   return enRet;
% e, F; t" s8 O4 y5 T
}
' z, `& C* `4 f. E# I# w( H1 K& E+ Z8 q
/**

. H, R. i- w- q3 w; Q+ A& D# U
******************************************************************************

4 `# b. `) T6 ^5 r7 f  V
**\brief  RTC闹钟中断设置

8 I" x/ R+ }' D2 T* c; f, f. O
**
8 G0 z6 x" s8 W  u5 q
**\param [in] pstcAlarmTime闹钟时间时、分、周

( D+ |6 Q: S) @7 |
**

5 T2 c4 F; L" p( ^# G" b# g* w' l
**\retval Ok  设置正常
1 H% _6 C! q$ o* J0 k
**

+ k5 J" r% y/ S- W/ j
******************************************************************************/
8 x$ G5 }5 Y8 L/ W: [& J, w
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

2 w( Z4 j$ Q9 \( T
{

: }% A: _/ O- ]' T; O# `
   en_result_t enRet = Ok;
- C. {5 a: N+ @% o3 ]9 |+ }
   ASSERT(NULL != pstcAlarmTime);
3 U6 c* M2 @) A6 j$ w
   if(Rtc12h == M0P_RTC->CR0_f.AMPM)
& Y8 y- U5 p# |: L4 ]: V6 B% R! b
    {
3 F% h; ^9 u$ B+ z# u, [3 A; V
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);
6 ^3 \  W) _& s- `6 }
    }

( ^* `% n8 [" g6 U
   else
- x1 j7 f: _' m  y4 ?, C
    {
% Q# c# Y) z9 w, e# A
       enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);

+ x, V$ I  m+ t) o3 y9 C
    }

' l0 d' s) r7 s# d3 k: [
    if(enRet != Ok)

; v+ e: n2 l5 f3 c7 o$ K. m+ |8 d
       return enRet;
( ~; O( _. v3 |
   enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);
% A) Y0 q5 U) Z* g
   if(enRet != Ok)

6 [, j* s& P: t' ^/ c
       return enRet;
* L; c& q) C8 [! R
   //enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);

! U. o: z* {; F+ r5 E9 u
   if(enRet != Ok)

6 ?/ B& m$ B) N/ V9 B' l) V6 w
       return enRet;   

: ]) `* J% ?$ J. ?# o2 K% L
   M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;
4 O+ h( D8 X4 l1 D
   M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;

( T( `) V/ n2 W4 O1 {
   M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;

4 G$ z$ U7 q" Z2 N% ~( }
   enRet = Ok;
0 ~9 ~( L6 P+ W5 e6 v8 \  J' J2 S0 J
   return enRet;
0 e1 R4 c/ o2 f6 a; C, ]* v
}
1 B* ?& x2 `, }% I4 t7 ?
/**

, ?' a% A4 E# k* b  N' J
******************************************************************************
1 _& x8 }# U! }* U- C9 }
**\brief  RTC闹钟中断时间获取
) m* K+ x/ t$ _8 [! ]7 Z
**

9 @) s% T$ c( C1 I2 t# U
**\param [in] pstcAlarmTime闹钟时间时、分、周

6 d: R6 N( S/ w5 a4 ^, W/ c
**
+ y$ k2 O: o& ~8 \4 @
**\retval Ok  设置正常

1 p( j8 e  o9 e
**
2 B2 M" ^! C1 A; e2 ]
******************************************************************************/

& D) |3 M6 [  p8 e
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)

* y/ @6 [; V) n+ {
{
7 c2 P1 u( c6 q, v
   en_result_t enRet = Error;
5 Z( a& f( x0 v0 I
   ASSERT(NULL != pstcAlarmTime);
- \- z: P, y; [! k6 c) e
   pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;
' d, F- {! Z, {* c' N
   pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;
  t* B% _* ]2 R/ q
   pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;
; ^9 V8 W( [2 h4 B
   enRet = Ok;
& K6 E  X5 \1 C" t6 _
   return enRet;
+ G% _% u. r* }& Y4 B
}
( W# b* T" p$ D: x. U
/**
4 v4 a7 j6 @5 {/ s! d
******************************************************************************
4 g0 X) F4 S3 Y* ^$ H. y" F5 W
**\brief  RTC 1hz模式选择

! q  y, e' e; Q4 n5 d
**
' L6 ]6 m: e( A6 m
**\param [in] bmode 高精度和普通精度

) ^5 F4 T! L7 \: i
**
8 [$ k' V+ W- y; T! y% d
**\retval Ok  设置正常

1 q* g6 H4 H: O4 E
**

3 f( X) |% a* D% A" b
******************************************************************************/

/ S' d- O% R8 N; ^! g
en_result_t Rtc_Set1HzMode(boolean_t bMode)
: ]0 o' m! }, _& T3 c+ s
{
: h7 B* w% M% ^: L2 E" H$ y
   en_result_t enRet = Error;

: h/ B3 v* d4 q5 V
   M0P_RTC->CR0_f.HZ1SEL = bMode;

0 \3 }6 v8 D% y
   enRet = Ok;

7 P( ^+ p3 C: W/ m- v0 u5 k
   return enRet;
- c1 T( P3 r4 }8 B, c6 z
}
; x! l% d$ {( N' |+ P; B
/**
# n- A$ C/ J3 C- V
******************************************************************************
9 U- I/ B. ?& d/ r; [: g
**\brief  RTC 1hz补偿值设置

# s" ~6 [7 W. e, D4 U4 X4 U4 E5 x
**

" j$ f  f, b  @/ D& X- e& E
**\param [in] u16Cr 补偿值

+ e9 L4 v# w* s6 X! v* V" \1 d* o( S
**
" D  q" G: v* s. ?* M
**\retval Ok  设置正常

" q8 x# P. [$ ^" X4 n6 [0 Y
**

2 R2 y8 G3 H  P; V
******************************************************************************/

* U# e5 x3 I* d) g  m8 e
en_result_t Rtc_SetCompCr(uint16_t u16Cr)
# E0 ^& h4 W8 \9 @
{
0 i# i0 s* K5 i3 m; E/ `- D5 n4 q' `
   en_result_t enRet = Error;
+ X! Z& A+ A# r% n" B. {. d0 P
   M0P_RTC->COMPEN_f.CR = u16Cr;

$ l. `6 N  Q" v7 N. j
   enRet = Ok;

( _$ E) T# c/ w( A- M
   return enRet;

. J. W6 ^1 v- Q
}
- K9 x, z7 A: H7 Z2 u
/**
. k$ P3 z/ h" `+ `( z
******************************************************************************

0 `' I; X, C( }% ]" ~" \; X
**\brief  RTC 功能使能设置

1 h' m3 R/ t; |: u% a9 ^& q$ ^
**

# E5 B; D+ q, U6 L
**\param [in] enFunc 功能选择

1 |7 o7 p1 s6 q6 f$ D' v0 U
**
0 y* |/ c0 D$ k+ B* G' a
**\retval Ok  设置正常
( Y$ @0 p0 Y# g. D9 g
**\retval ErrorInvalidParameter 设置异常

8 G. V8 Y* u8 H3 p6 _3 p
******************************************************************************/

/ [% y. ~6 b! o, X
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)
8 o7 {7 N# `" v( c$ }+ `  q  Z
{
/ f" a" x. e* Q1 m4 X  k& q0 ?
    ASSERT(IS_VALID_FUNC(enFunc));

2 A2 y! V8 G0 v% d5 W& @
   switch(enFunc)

- Q9 _) ]7 b$ p- f' x
    {

, I/ Y; \) |, ^% [1 e  V
       case RtcCount:

9 |2 j- o6 Q  y" p# y
           M0P_RTC->CR0_f.START = 1u;
$ v! [! u! c2 H
           break;
7 h6 X$ E7 i# R7 G
       case RtcAlarmEn:

" E: B7 V+ w5 ]! c
           M0P_RTC->CR1_f.ALMEN = 1u;
! Q5 w, ~5 p% m  }7 u1 x6 z1 D
           break;
; S" i" r1 A6 q" i5 A; x! H+ a
       case Rtc_ComenEn:
( U3 a; Y, [; U8 {) B+ _9 J6 n
           M0P_RTC->COMPEN_f.EN = 1u;
' G! _& ?9 h' f" O/ w$ G& _. X. D: r
           break;

( f1 Q! A3 n; H
       case Rtc1HzOutEn:

0 Y) |2 U, M( O; r& k. q( G+ P" {
           M0P_RTC->CR0_f.HZ1OE = 1u;
) B* Q6 S1 M2 J5 Y7 Q" ~
           break;
0 V+ f2 ?* n4 Q' y9 E6 C% Z
       default:
  Y9 [/ `3 n: ]% p2 c
           return ErrorInvalidParameter;

9 Q2 x( k! n2 T9 R8 e( l
    }
( _8 `; f3 Q4 Z7 w0 `. i
   return Ok;
1 C" J5 R9 @) n# d, Z3 M; g
}

! b) u8 N; W- U* m5 r2 l
/**

6 P& C2 \( a6 O  r3 v
******************************************************************************

6 T$ ^( ?5 l  x8 Z3 U/ w
**\brief  RTC 功能禁止设置

; d/ L) M$ D) y& c% M$ d9 h
**
% \% l; L! a' }7 C! @
**\param [in] enFunc 功能选择

& G6 o. s) N! I$ e# x
**

/ ~7 s3 g5 O" l* A2 @( q' d: T# i$ K
**\retval Ok  设置正常

+ z0 [, D; m9 v3 Y2 s: K
**\retval ErrorInvalidParameter 设置异常
+ Y5 ]2 X4 s/ g) I5 d
******************************************************************************/
$ w* G2 y$ h$ o+ @& ~7 w# @; z
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
3 R7 @$ Q$ V/ a1 l" S
{
1 I) `- l8 p! d+ \, ~0 y6 D
   ASSERT(IS_VALID_FUNC(enFunc));
, ~, |7 p* B: w, @/ f9 o
   switch(enFunc)
3 |9 d5 c2 u! s
    {
- h; \- ~- N% M- c* }7 X+ l3 e
       case RtcCount:
( q& \8 C, G$ t7 x* }3 }7 A. t
           M0P_RTC->CR0_f.START = 0u;

, k# y/ I6 h1 g
           break;
$ a* \$ ]5 b: I% ^
       case RtcAlarmEn:
( b6 c: _0 H* M* M$ k: T
           M0P_RTC->CR1_f.ALMEN = 0u;
! e0 @0 |& R4 C# C
           break;

$ a2 R) U3 h: t( g! d- J$ I
       case Rtc_ComenEn:
. R0 Z( H: N1 W; d- x
           M0P_RTC->COMPEN_f.EN = 0u;

/ o! T4 L" y, j1 r/ l! t
           break;
; W" S& b( [5 B; f$ v
       case Rtc1HzOutEn:
& X; ^5 c1 w, C- N
           M0P_RTC->CR0_f.HZ1OE = 0u;
/ Q9 q0 w1 C' t  j( r- ^
           break;
, A7 Q0 U6 W2 J; |) G; {; M
       default:
+ W: V# \8 Y: J  ?  i$ K
           return ErrorInvalidParameter;

4 @' B$ x( A! p9 ^9 d
    }
, }) [- r* j' t, x: ^5 x6 h
   return Ok;

0 i  H" g4 L$ Y
}

0 A4 e( C  i& I- V6 K( c7 W) o/ |  D
uint8_t Change_DateTimeFormat(uint8_t u8sr)

; [" O6 w1 U- t5 q
{
; @6 V+ r  G: r6 _- m  F3 ~
         uint8_tu8de=0;

4 H+ z4 a& c. e3 n, K
         while(u8sr>=0x10)

" N$ u& w9 `5 h- L( \
         {
3 q8 ~- B) l' ]
                   u8de+=10;

, y/ C4 h1 t, E2 o$ @
                   u8sr-=0x10;
( i& C$ L8 r" [
         }
! `9 e9 _: a& a
         u8de+= u8sr;
' |  y% f! B+ i% Y) x5 D1 q6 Z
         return(u8de);
) K8 [$ _4 B% o- a
}

! @0 X7 f" R3 b$ M) l3 `
/**
. c( q/ S: w- j) {: O4 T
******************************************************************************
* d5 _5 p$ v$ L+ L# R( S
**\brief  RTC 平、闰年检测
4 b# h2 O. u2 P+ q: n) {
**
, U0 I  I5 c( n2 `; f
**\param [in] u8year 年十进制低两位

) Y! ?; d( `- }# W, U
**
" }/ _$ W) U& _4 W5 M
**\retval 1  闰年

6 \) i  \* {$ q6 @
**\retval 0 平年
+ B1 Y4 N1 u2 p- j
******************************************************************************/
: H3 M- u7 F/ f7 A
uint8_t Rtc_CheckLeapYear(uint8_t u8year)
5 d% u7 c; A2 x' |/ B
{
4 K3 K1 E- k0 B/ r% c
   uint8_t u8year_shl,u8year_shr;
. q# l* o7 \! S# r+ T
   u8year_shl = u8year>>2;

; S' x  C( d5 U9 _% @( E
   u8year_shr = u8year_shl<<2;
1 g# K6 t; y. Q4 h
   if(u8year== u8year_shr)

# W6 K. ^' F+ \
    {

" z9 C, w9 b; Q/ [4 l% o. @
       return 1;
! q# w% H2 ?& W# o" c
    }

( z- o; X; V( o
   else

6 p' h, e7 ?' h' x% D6 ^. N
    {

  C3 s+ E( W7 s: }3 [
       return 0;

; ?9 ]! f1 `4 N
    }
9 w" ]9 R7 p$ h/ {- U) |3 I, G, e
}

8 |6 H5 K" c0 B4 Z: u
/**

- c* @. E7 X: c% o/ B
******************************************************************************

& T6 D6 b/ R4 g6 f* z* R8 r4 k" @, _
**\brief  RTC根据日期计算周数
; t/ m# P+ O( I0 F: i
**
! s7 d8 x% i* I. s% Z/ a' f
**\param [in] pu8Date日期
9 j" _) Z0 G  D9 B" Y  G
**
, T1 f  K  S% E4 B2 S( X
**\retval week  周数
" H( F5 F8 Z1 G2 J3 W2 C
**

* g. h& i7 Y+ m7 c: z
******************************************************************************/

" t& e+ U# `8 s, l. i
uint8_t Rtc_CalWeek(uint8_t* pu8Date)

: t5 V0 q" Z' Z$ m, ?
{
6 B3 T) f  I# V0 F" R
   uint8_t u8week;
( {+ v" M! u; F* f
   if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))

: B3 B7 S4 G- I8 L5 k1 I' C
    {

) v4 F1 l8 m. a6 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;
* J3 |3 y4 v1 ~+ ~
         }

( b7 I0 L" \! y$ K1 v! ~
         else

4 i8 p  H; Y8 t0 }( l5 m8 [
    {
, g7 }, M) H  _( b2 s1 g$ r
                   u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
; O- \( V$ T! f* p1 z# [8 {1 z
    }
+ F9 @0 j& S+ m- D( J
   return u8week;
  j; P+ Y" X$ t8 K
}

6 t, z# j" U5 i) a" Z
/**
; O: h5 @* v6 I/ b( {
******************************************************************************
/ {! o0 @& F6 o; }: p- `- h
**\brief  RTC根据年月获取天数
6 T: e1 W, b/ V& i4 a
**
( l, G, u' _: Q, C: v
**\param [in] u8month月份,u8year年份
, w, q% z: m- J7 L
**
" w* m9 b  {; a9 c' [" g2 J
**\retval u8day天数
+ f4 S/ A. Z" [& W, o- y
**

# y' Y* J+ h) Q9 w5 u! \* v
******************************************************************************/

7 k/ n1 `2 e/ |
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)
" O; F$ `- K3 x* a$ i
{

1 X# u  R: G, C0 U% }4 L$ A
         uint8_tu8day = 0;
6 k: h7 ?5 o: Q& m+ L4 f) v
         
% N. v/ p' M' Q/ P" N$ f
         u8day= Cnst_Month_Tbl[u8month - 1];

6 e# a! E0 M8 R( `
         if((u8month== 2) && ((u8year % 4) == 0))
$ `. P, f% C8 f
         {

2 k3 Q  f  v4 d% E: q, k' r
                   u8day++;
5 i- p! `4 v7 E
         }

( a9 X1 I& T  ?* E
         return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31
9 L+ ^! K5 s" H- V
}
9 N3 V5 |3 Y1 [7 v( `
/**

& R" Z. ~) V3 N& b0 h+ ?
******************************************************************************

4 m1 A/ m- j9 A0 s; {$ {5 q6 @
**\brief  RTC根据日期计算周数

" V: o  H( X% l6 u6 @: N5 E6 a
**

4 `: }1 ?$ j, \: h" }5 `
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值
: L) x0 c. k4 f
**

; }0 u) v' l' }+ J" T5 b& P
**\retval Error 错误,Ok校验正确

" m/ p+ H* `- O8 n9 S3 n
**
: o# ]& G' A% G- @* _0 K
******************************************************************************/

  S, ~. _4 t% t3 @
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)

; T0 S7 `% `! i/ {& A; r( t3 V/ J
{
  T! S1 b; q1 r; q

1 a: K; I8 m3 |1 r
   if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)
- |" H9 k5 F! {' {/ W- ^
   ||(u8data > u8limit_max) || (u8data < u8limit_min))
2 Z! y  N& O2 e4 l9 \' l
    {

) r7 G  ]% y% r9 N5 `! \) h) x$ {: L
       return Error;

. D8 d8 A* a7 Q4 ^; L# Y
    }
! l* g' v, h  |# N
   return Ok;
5 Z+ R: ~) d' i3 }2 F- l
}

- x  K& c) W+ e% x9 D# W2 y' |
/**

1 X2 a! y/ o" I9 Y6 N. Q, k1 J" r
******************************************************************************
: N* Q9 d# f2 K: k% P
**\brief  RTC时间格式检测
/ s& Y1 F, _3 p. t
**

5 H/ h. P1 M+ D. G) s" {
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式
4 i! b$ w$ L% {6 c, F
**

& O% K2 ~4 P* h
**\retval enRet校验结果
0 `9 D! T7 n/ Y% {7 H  {
**

/ W8 f3 ^! [4 A+ {% G$ @  }. F
******************************************************************************/
% n3 u- o1 n7 ]5 X& M: \5 N. I
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)

) o0 f3 f; w6 ], F( g, a0 B) u, i
{

4 U/ g. R- I; q$ K  i; A4 A) M3 B
   uint8_t u8i=0;

$ M7 m, s# o" |; J1 R3 H' [4 T
   uint8_t u8mon_max_day = 0x28;
+ \; b% s) ~4 l
   uint8_t u8date[3];

, s& }7 |8 x: J' ]2 b- P
   en_result_t enRet;
4 `' L0 p3 ?  y0 l
   while(u8i<7)
0 z+ X# l  X: s; q- e/ U
    {

" s" C9 I8 e  m4 X
       if(u8Mode&&(1<<u8i))

" f3 k1 o9 u7 n
       {
  [) _: }" b& I- t" L7 U. j& j! @
           switch(u8i)
0 W7 ^8 j" L$ b0 h
           {

* M! h+ S3 k. P$ R
                case 0:

; C+ X$ \) X9 k# J5 D% S+ r8 w
                    enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//
7 l' M( R7 ~. R
                    break;

% z6 f/ \1 A! P, h! L
                case 1:
% b. E0 T8 n9 h5 |( Q+ \
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//

7 p  h4 ^0 j4 x% z
                    break;
$ u! x5 {& Z. p% K
                case 2:

# n8 }  }6 l" f. ?. v% K4 ^
                    if(Rtc12h == M0P_RTC->CR0_f.AMPM)

% u6 t6 o' L9 {2 M" x
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//
% s& \/ ^2 F* j' W" E/ c! P
                    else

# L$ Q8 Q2 k2 c  f1 {# i1 `8 k
                        enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);
) K) c% }" E5 X& C
                    break;
) z8 \3 f' a( t
                case 3:
& k/ q7 ^1 P# u6 k. K0 L0 t) ?
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);
( T  w5 F' ?1 b1 x1 ^; k
                    break;

1 M3 c6 _% J" }1 _% ^
                case 4:

8 M% T+ J+ {' }- F' B6 E
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);
% o/ l9 I4 `6 M' I* M5 n) d7 r1 @
                    u8date[0] = *pu8TimeDate;
, e8 m9 O+ w, ?! \
                    break;
, ^1 F, X6 x$ j4 S* U
               case 5:

# H/ P; d6 F; h, N
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);
$ ^, x* l- u% P: Y2 `. T, q
                    u8date[1] = *pu8TimeDate;

! K' ]" ]8 M: p  v
                    break;
+ J( f  K5 V) K6 e% J9 b
                case 6:
4 I& T* {  ?; Z5 i0 b' ~
                    enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);

. j, n, N9 k0 o* g- l  M* d8 v
                    u8date[2] = *pu8TimeDate;

# |4 z7 m1 F- O  S7 l
                    break;

4 e' A; d; o  x: Q: G
           }
9 {/ U3 |, O! G; K
           pu8TimeDate++;
, V2 z/ y9 ], o6 P' @: e% U
       }
( h6 Z: h3 s9 N/ I
       if(enRet!=Ok)

0 l- D% m) \+ Y' S7 h
       return enRet;
/ q, A6 x! @( I$ n% U7 d/ d
       u8i++;
5 O) Q( N# D3 i
    }

5 b8 x# m' l% c/ q) E; J
     if((u8Mode&0x10)&&(u8Mode&0x20))

0 I; {* x; q, ]. u5 q# {4 {- E
         {

* p9 q8 A5 V- f: v1 Y5 H
                   if(u8Mode&0x40)

( \2 H. }$ W5 W/ P. j, |# d, `
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));
( _$ j6 o3 h  z; m8 M, ~
                   else

3 z  C+ j# \6 _3 x
                            u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);
3 i% S8 J9 q1 Q+ U1 j# Y
                   if(u8date[0]>u8mon_max_day)

' b! u/ W) R* i/ c" q6 `7 Z$ L
                            returnError;

# q/ y. n+ t; p
         }
; o  e- E6 ]9 s0 n$ F
         if((u8Mode&0x10)&&(!(u8Mode&0x20)))
8 J4 C+ P- O) o" C$ N
         {

& w( j6 W$ i0 V* D/ w% u, P
                   if(u8date[0]>0x28)

5 y+ U, S2 c/ {7 Q( b/ U: e
                            returnError;
  B" l/ r4 D( S3 K, O0 V
         }
0 h+ M8 ]  ?7 g# I) F
   enRet = Ok;

6 T2 G0 r( s0 K, v6 [2 r- l3 d3 _
         return(enRet);
( d" R/ E$ j& G5 q6 ]# }
}

8 f5 l& r; K& R% D# v- O3 w
/**
6 @9 @, r( j' B9 O9 i% J& Q
******************************************************************************

5 @( [3 J# |' I
**\brief  RTC设置时间函数

/ i1 N; M+ f  f; q7 i
**

1 }# [4 t8 I  j% q0 a8 D
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期

! m6 l& }9 c! u7 E" C+ C: x- W) ]; p
**
6 [- D. I, t# Z9 B' J3 k
**\retval Ok  设置正常

1 E" C2 V# {8 n# D7 Z
**\retval ErrorTimeout 时间溢出错误
4 \) t5 J) w7 I# p5 [& O2 e
******************************************************************************/
# e% H% I) ]6 e2 V1 ]) _1 I8 ]
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,
6 @9 y0 z. p# N  W0 w% `
                            boolean_t bUpdateDate)
* i, \( g5 R% Z( p$ g2 Z+ G1 u
{
+ ^$ x6 s2 K  c! A! y( W
   int32_t u32TimeOut;

" ~2 X  v( @/ A+ w8 M
   u32TimeOut = RTC_TIMEOUT;
2 b4 h1 d  W, ?; Y! H  _# h! z4 V
   uint8_t* pu8TimeDate;
- p9 z" j' N3 c1 l1 H
   en_result_t enRet = Ok;
& ^) H- \6 t/ v# L- j3 A& u
   pu8TimeDate = &pstcTimeDate->u8Second;

% S" k" i9 V! P& o
   ASSERT(NULL != pstcTimeDate);
4 ?% ?" O) u" h& A% E+ A1 r% h
   if(1 == M0P_RTC->CR0_f.START)

4 z, M5 B- L9 B
    {

- x3 {: |; Z5 A. E0 X9 O
        M0P_RTC->CR1_f.WAIT = 1;
* l' c; M- {) t5 h1 Z4 ~/ y
       while(--u32TimeOut)

/ J+ f. O* G+ F: T7 z; q
       {

/ o* C! B0 M& b: q
           if(M0P_RTC->CR1_f.WAITF)
# j2 a( u. I$ |; q1 W
           {

5 V. d4 s2 R  T* q1 i, [
                break;

5 }( Z5 q1 O, r8 ?: H
           }

- c3 C1 l/ M/ ]# w8 m
       }

% i. `  \: K/ e( L6 q6 d: z7 R
       if(u32TimeOut==0)

. r# a, n+ Y2 x3 ~- _
       {
4 e3 y# w$ N5 }2 E
           return ErrorTimeout;
! k2 ^/ i, ~& L2 d. m1 K; k: x
       }

* i2 j- I/ B7 ~$ \  Z- u
    }
5 F7 I+ s! y; m' b9 S
    if(TRUE == bUpdateTime)

. \! o& d  Y6 u3 `4 K$ n" Z9 x
    {
3 s: B/ I( r6 H, v! O2 [
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);

% T: h% O" B1 C' u$ ~4 S$ w! J
       if(enRet != Ok)
8 t- V/ J: D7 U8 f6 d6 q% ^1 m. _
           return enRet;

$ [! M. O# t7 j3 z
       M0P_RTC->SEC = pstcTimeDate->u8Second;

/ r4 `  U) a: v( L) k; Y* z5 r8 E8 L
       M0P_RTC->MIN = pstcTimeDate->u8Minute;

3 i, x1 |" D7 Y, s9 E5 Q: G, ~2 e; n
       M0P_RTC->HOUR = pstcTimeDate->u8Hour;
# W' }3 Z6 s2 l- f9 @* G3 k2 v5 t
    }

4 _$ D$ ^  T' S3 A- c: e/ \
   if(TRUE == bUpdateDate)

' S  ~) ^7 Q' O
    {

+ ]: }$ J: l3 v
       enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);

- h- \; Y# s9 F% D  v
       if(enRet != Ok)

& I: _5 T" J* |4 o5 y$ s4 S. X
           return enRet;

9 ?5 q0 b2 `; l* ]7 N5 K. Q
       M0P_RTC->DAY = pstcTimeDate->u8Day;

9 t& j3 {3 P) [% X* d* A- ?
       M0P_RTC->MON = pstcTimeDate->u8Month;

5 a+ S# K3 d! m9 `, A1 A/ {
       M0P_RTC->YEAR = pstcTimeDate->u8Year;

3 u8 N/ q- W# C. G% r. j
       M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;

! R; M, J/ c4 a
    }
# E9 K5 c1 Y$ }. Z5 [# [+ Q# C
   M0P_RTC->CR1_f.WAIT = 0;
* c3 k' Y; p6 a' K$ \4 F
   if(1 == M0P_RTC->CR0_f.START)
, P$ Y4 W; V; O, O! T+ N
       while(M0P_RTC->CR1_f.WAITF);

" j7 ^- W/ p4 o# W
   return enRet;
. W! k9 `! o* c2 J
}

0 u( x: D0 J- e
/**

" T9 Y9 V7 o- K9 B* Y/ }1 [
******************************************************************************
3 J8 }, U. C/ @( w
**\brief  RTC获取时间函数
0 W5 f1 s9 I4 Y# T, b/ X
**

6 A- |" a) ~6 D# c& G# J5 c
**\param [in] pstcTimeDate日期时间数据

' y1 t* U& g/ W5 p; r
**
' S2 S" Z' @! Y* x; Y! ^
**\retval Ok  获取正常
' ^" M) j- Z0 K& p, l: q
**\retval ErrorTimeout 时间溢出错误

) x9 \% h. V) i3 J
******************************************************************************/
3 u+ I2 p3 O$ _' j% @
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)

1 `6 c7 S* t2 {
{
7 S" p. `5 e) X8 |( s/ k
   uint32_t u32TimeOut;
# I3 U5 o: o( s3 j, S' G3 ?
   uint8_t  u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;
* T$ J! E. Q! |' K

0 T+ ?) K, C7 N* P! l# ~! p" |+ k# {; t
   ASSERT(NULL != pstcTimeDate);  

! }" G  G- z0 A
   u32TimeOut = RTC_TIMEOUT;

) I$ Q/ K( w( t. q6 c
   if(1 == M0P_RTC->CR0_f.START)

+ ?" k$ U) s  T8 Q1 O
    {

6 d; P  j3 ?  ?5 R/ @! ^/ Y
       M0P_RTC->CR1_f.WAIT = 1;

+ {3 f- f& }( X1 r# F7 k
       while(u32TimeOut--)

: U. G9 V* v4 u) Z# f
       {

  h" y) b0 s: W1 i
           if(M0P_RTC->CR1_f.WAITF)

  }( v/ r+ @: }5 W& J/ c
           {

1 g! z$ g: `# Q' ~% b( ?& ~2 k
           break;
; P: r! B8 |9 l2 @. g5 h* @
           }

! r' u/ ?% s  n9 |
       }

  ], ^, b0 C. I4 }- V0 E' X- E
       if(u32TimeOut==0)
& u# w" g% v4 s! }
       {

2 J- C% h, B1 \1 R6 R
           return ErrorTimeout;

2 ]+ }! f  v+ T( X7 N5 e
       }

8 Y' _6 v: t* X6 n
    }

( x( g8 o1 ^: _' d9 U  P
   u8BcdSec  = M0P_RTC->SEC;

9 v: X4 ~5 g" w% g+ e( w: r2 s
   u8BcdMin  = M0P_RTC->MIN;
  |% {2 r7 q! u' R
   u8BcdHour = M0P_RTC->HOUR;
& v/ s/ B: M* n8 j2 X
   u8Day     = M0P_RTC->DAY;

" v7 b' }* z5 ]9 X" l
   u8Month   = M0P_RTC->MON;

# a+ x; ~* I3 `8 E
   u8Year    = M0P_RTC->YEAR;
( [6 @9 Y# e% w! ?
   u8DayOfWeek = M0P_RTC->WEEK;
6 _5 q7 u: b: m
+ \8 f+ e9 P% M+ Y0 X
   pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);
! T; n  h( n, B. U) p; X
   pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);

- ?) T; U: C, b) F7 A! K
   pstcTimeDate->u8Hour   =u8BcdHour;//BcdToDec(u8BcdHour);

1 M$ m2 v3 z& H3 a  S) W
   pstcTimeDate->u8Day    =u8Day;//BcdToDec(u8Day);

, N: V% ]- @  S
   pstcTimeDate->u8Month  =u8Month;//BcdToDec(u8Month);

% }; P3 w" y+ W
   pstcTimeDate->u8Year  =u8Year;//BcdToDec(u8Year);

; d  q# y- V, z' @
   pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);
( C+ L, }5 U# @; d3 j8 k
   M0P_RTC->CR1_f.WAIT = 0;
( A1 ^* g; A7 ?  u- c1 ^
   if(1 == M0P_RTC->CR0_f.START)

* _+ c# V. \* K) H' z0 o$ ~6 R3 R
       while(M0P_RTC->CR1_f.WAITF);

* A  ?; G* m- i0 D
   return Ok;
8 B0 p* {8 W: {4 k% b
}
- l( \1 `' J  H% r4 S  x' u
/**
# M3 S2 E+ g1 |" a& ]. X! F
******************************************************************************

" h. Q/ H2 d4 j( s! q' J/ m" ^
**\brief  RTC计数or读写状态获取

2 J2 i8 [( \4 S, D$ c% o
**

' C  m) _. ]4 K0 e. l
**\param [in]

9 B+ o1 A1 q  A  |/ I6 d8 L
**
. m$ h5 r: s4 R) v6 B
**\retval 计数or读写状态
# O+ w9 C! `7 h$ i, k# `
**

( T- Q* k; B* P$ J
******************************************************************************/

2 F- F. K4 A' e: d
boolean_t Rtc_RDStatus(void)
+ [# I' V# \& P3 \& X  J7 B6 X6 X
{

, c' \* z, Q0 x3 q, J0 J
   boolean_t bRet;

4 l/ L5 x$ k# v" s8 x1 g. e
   bRet = M0P_RTC->CR1_f.WAITF;

, U9 T' b1 c. ?: v* S1 D: ~, m
   return bRet;

' R8 ?  \/ Q! ~! i+ p& h& Y
}
0 D" E6 N4 A4 }. }: r
/**
5 N( }% z+ p) p$ ?
******************************************************************************
9 ~4 g$ \: W2 K# y! |* H
**\brief  RTC闹钟中断使能

) m* i6 `) p. b
**

6 h, A9 r: [  N& h" t0 L
**\param [in] enordis中断使能or禁止

  B6 V6 L8 S3 l+ e) Y6 n4 r3 w
**

) n1 v, u3 P. t$ n8 M
**\retval Ok设置成功
' A. R& S0 T7 H9 d% E
**
! b; S; }, x. n3 ^/ B
******************************************************************************/

, |/ X7 @7 ?5 F0 d
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)
5 e3 s2 j6 ~' [  V, y7 v
{

1 ~% k5 M+ `" P3 p  U
   en_result_t enRet = Error;

) n4 [1 O. d" F5 \: n- A6 u
   M0P_RTC->CR1_f.ALMIE = enIrqEn;
5 y( i# M: d3 v) I2 g6 G; G* f& ^% }
   Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记

# A2 \& X8 j+ S0 R/ j4 |
   enRet = Ok;
1 w1 q7 h. g( ?4 f! u( j
   return enRet;
1 u  Y$ O  {) e: z7 c" y1 R1 {; l
}

1 p9 n3 F7 w* h7 i9 H7 t% M' C
/**
$ K1 ^* G( n7 Z2 {  @4 z
******************************************************************************
7 p7 c# c: q! l4 O9 P
**\brief  RTC中断请求状态获取
, J4 e( v- c8 G7 s/ w
**

% ]2 i4 p, L' Y
**\param [in] enIrqSel获取哪种中断请求

/ U$ f1 P" \2 W8 X
**

# T) v8 A8 X7 x. E
**\retval 中断请求状态
! c, U& v! Q6 G$ u% E
**

) B3 G% t' N/ _3 ~
******************************************************************************/

& O  y  M0 k1 o& v; O
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)

) u% n( v8 H  ?
{

0 i$ \) b# ^/ }9 ^
   boolean_t bRet = FALSE;

$ R5 o, s1 n. [8 }/ n3 }3 r
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));

5 _8 s' S, Y4 M5 h3 h
   switch(enIrqSel)
: f7 @# Q6 b! f9 p- u" G' s
    {
2 r0 }% E% m3 H# H/ M( w, h
       case RtcPrdf:
" f( x& m0 W/ D. F0 ]& K4 N6 i1 k. V' q
           (M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);

9 a! D* j: H# L
           break;

6 |! r  Z- K' {/ F$ w
       case RtcAlmf :

$ |2 u" r6 t* b% v; v
           (M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);

$ c. i$ Q$ l2 p9 K8 d- O2 D1 K
           break;
8 x( Z- ]% i* w: z0 e; q
       default:

2 i4 J, f; V8 F3 P$ F5 _4 A
           break;
8 Q0 x) m, ~% i" P
    }
7 B; V2 h9 N2 p5 m( U: f4 e& S
   return bRet;
7 S5 U! a8 Q, Y: S
}

/ l2 w3 Z' M- E; p2 \) h
/**

& e6 G4 z1 X/ X9 H( I2 y* V% W
******************************************************************************
. R* u3 {4 R" B& ]* W! z
**\brief  RTC中断请求清除

* S6 W1 {7 E$ ~8 I4 E8 X8 D
**
$ G# Z  T  q& x3 K+ J( a: o3 d% z
**\param [in] enIrqSel清除哪种中断请求
3 j0 I( _3 c% V0 l! k
**
& y0 Z( W/ v8 a8 X/ ~0 Y5 g# d+ `
**\retval Ok 清除成功

$ p, o" X' M- g2 ~) f  R
**\retval ErrorInvalidParameter 清除失败
2 g( H! K2 X: \$ p5 M$ m2 p+ ~2 \
******************************************************************************/

0 K6 \: L( z8 W" I5 \
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)

$ K  x7 f, w, ?* q( `' ?: H
{
" k$ v2 x8 }6 |$ Q
   ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
% ]# M) O$ H! d* Y
   switch(enIrqSel)

+ n  M/ z7 x$ {
    {

2 K+ m) t4 c& a7 L4 a6 G. V* B
       case RtcPrdf:

+ w* n: c  q; j( g
           M0P_RTC->CR1_f.PRDF = 0;

2 }0 f* Q( S% E+ b. S
           break;

2 f4 A7 ~  C. {. p, h& n2 W
       case  RtcAlmf:

2 I" P! r. w4 G& T6 k
           M0P_RTC->CR1_f.ALMF = 0;
8 Y) s9 x0 w  t! ]
           break;

, l1 M8 d1 k4 F5 v" }( Z7 Y/ }! m
       default:
1 o7 J  v9 y& w5 N* |; O8 Y: Z% g
           return ErrorInvalidParameter;
, ~) k9 K3 J- V/ w6 a9 M
    }

3 i4 r: y8 W% h- |
   return Ok;

) H( x3 J5 |8 e
}
5 @7 e- |/ a7 F
7 E4 C2 E- J0 L* W
/**
3 B: T. Y1 F/ Z8 z4 }1 c; D
******************************************************************************

& ^; A% p$ C0 X+ A/ L! c
**\brief  RTC中断处理函数接口获取
5 C) z" T' G' T& [
**

7 ~3 G$ k) u" N5 C$ M* S* c
**\param [in]
6 o# I+ P# V7 T% `/ y
**
9 k' A) `9 s- @! I8 S* r. S
**\retval 接口函数地址
7 e1 h2 l8 ~1 G
**

8 h2 E1 q! z4 a/ m$ s* }
******************************************************************************/
: W1 O: v0 C: ~& K3 p! V
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)

7 y# [9 d3 y0 T- [1 L
{
8 I- y' a) |- ?/ Z6 C" n
   return &stcRtcIrqCb;
5 `* @8 O; ]. ]  G; A) N
}

/ U3 d! c( j. f3 t/ [3 c9 x, o
/**
4 s2 ]; n6 v3 s4 T& A1 ^% ]
******************************************************************************
9 y- b! H) _' A
**\brief  RTC总体初始化函数
8 C* m+ c0 P9 Q
**

. E5 X& h7 ?: @
**\param [in] pstcRtcConfig初始化结构
3 |; B9 H* C' V; k
**

4 B7 |: ?& J  V+ q5 C3 `
**\retval Ok初始化成功

2 }' U2 T1 M0 p9 D. g7 s7 D
**\retval ErrorInvalidParameter 初始化错误
$ V2 i6 C) z- F7 \
******************************************************************************/
, |/ L: ]3 I  V7 c7 [1 ^$ }4 M. z
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)
( {7 W/ D  K2 B, h: `0 n
{

- o3 y* S( b# b
   en_result_t enRet = Error;

# I5 I- h; W3 l
   stc_rtc_intern_cb_t* pstcRtcInternCb;

# W  Y3 {+ o" `0 D+ Q; x( h( b! e
   if(NULL == pstcRtcConfig)

9 S( a5 V' b% `/ O& |6 Y
     return Error;
7 S3 v3 e, J; @; B, E
   pstcRtcInternCb = RtcGetInternDataCb();
2 s, |5 p2 ^2 F! O) E
   enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);
! o5 A9 _+ Z9 ~/ s: \5 b; i
   enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);

" u$ \- j7 K% R8 X
   if(enRet != Ok)

% w4 f2 j$ O( ^+ v& Y: x
    {
1 d+ J3 n+ _# y; u, H! |
     return enRet;
: d( H4 O9 ]' _4 G
    }
; X/ J: W  l/ m4 j. s- K4 L6 L
   if(NULL != pstcRtcConfig->pstcCycSel)

+ D( A9 n7 r) g
    {
  S; u1 K, I2 V) a
       if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))
( x$ b3 y/ w! `( C, r
           return Error;        
& p6 R2 r( i7 @& {. R3 \
    }

# ?* Z" m5 t8 _3 c5 H: [
   if(NULL != pstcRtcConfig->pstcTimeDate)
7 z- g0 C; E  s
    {
- Y' k8 d$ [0 g2 i
       if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))
; }0 o4 m5 j( P
           return Error;
" n* C4 }( v$ Q# M& s/ D- _* ?( p
    }
8 E. e$ ~) I& o$ M  \' j
   if(NULL != pstcRtcConfig->pstcIrqCb)
* B. V( H' d8 y( J& d
    {
( q; F4 t# A. J! i4 z+ S
       pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;

" T0 Y3 A  D: F1 e7 B
       pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;

' `% J1 S3 V, d! v; l
    }
- R2 V1 i2 N0 U+ O) v2 n
   if(TRUE == pstcRtcConfig->bTouchNvic)

6 o- L2 D; j& C+ C  X- @
    {
/ }, d, A$ N" W( N
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);

" d% W2 J( H# w6 u/ c6 W2 ]4 E
    }

% j1 {; Q5 J" o8 \/ d" A
   else
' l; e* Q- u/ |+ ~( c
    {
5 I" S- }8 S: _
       EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
' a* H+ T0 x. q2 g9 {
    }

2 e1 l' O( ?% u* `% ~
   return enRet;

5 d2 N1 W+ [/ T
}
% m; t( S( b. Q$ {3 d
/**

8 u) b( `6 w  [3 \' g! S
******************************************************************************
) X' w) n- }9 i2 U  t  w# m; l- W
**\brief  RTC计数禁止函数
$ P% L4 y) ?6 D$ h" {7 c& a/ v1 f* i
**

. @1 e7 N2 x& E0 L# `
**\param [in]

' T& @9 S0 w( G5 y- m/ e
**

. i! ?# {: E. [7 W
**\retval Ok禁止设置成功
, U" Q7 Q; X0 {9 s
**
3 Q: M) Z! j! u
******************************************************************************/
- {! V9 C2 B2 E& i4 b4 }
en_result_t Rtc_DeInit(void)

8 M. ^! t' T3 ]( F6 O7 x4 `
{

: q9 D0 o* s- Y& O9 L/ u7 |! L1 Y. B
   EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);

4 R9 K. A5 D/ p9 g# E% \# ^- g' D& h3 w
   Rtc_DisableFunc(RtcCount);
) b( u3 Z" j; f9 m! h- ]1 Q$ Z
   Rtc_DisableFunc(RtcAlarmEn);

6 l! P) C) X  Y9 P1 {1 j( D$ I3 \& |
   Rtc_DisableFunc(Rtc_ComenEn);
; ]( `! l% p  b# G) s
   Rtc_DisableFunc(Rtc1HzOutEn);
8 t4 N) _" \. l  w2 p6 L
   return Ok;
: L/ T7 ?$ F  Z: R
}
/ u+ y8 u- u6 Q* g
/**

, {5 s7 D% {9 r5 l  H& R
******************************************************************************

6 d" u% i3 c* O& e7 f  i3 i: |9 Z
**\brief  RTC中断处理函数
; u' V6 a! n$ b! S- W: \: o
**
- U0 u) S: m% C
**\param [in]
9 g+ X$ @2 @& ?8 f5 f/ Z
**

% R; `9 W" ], h4 g7 v) y# G
**\retval

% k3 ^( F1 f, h- E0 ]! f6 c
**
/ v6 Y( E7 P- r4 ]3 e( b) r
******************************************************************************/

7 q4 q4 q7 A0 O3 Q5 L
void Rtc_IRQHandler(void)

7 B! G2 _: j/ B2 g, }" ?
{
% K; Z5 M8 ]' [, F
   stc_rtc_intern_cb_t* pstcRtcInternCb;

  d' C4 e. i0 H
   pstcRtcInternCb = RtcGetInternDataCb() ;
" f2 L6 \  C' [' m( r3 w! m8 u
   if(TRUE == M0P_RTC->CR1_f.ALMF)

  D- e* ~$ j3 S' Q& p) \+ L
    {
, h+ K9 g( Z) H; }
       M0P_RTC->CR1_f.ALMF = 0u;

  d, I! M2 U  I; i* `0 n2 w8 ?
       if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)
# ^& W6 Z6 ?- H2 M6 f3 z; |
       {

) n$ v. B* v) E' H
           pstcRtcInternCb->pfnAlarmIrqCb();

, f+ o; k* b% ~
       }
" l5 ?9 r/ \& N& {* O! k* Q6 g
    }

4 V- D. v& C0 T3 H
   if(TRUE == M0P_RTC->CR1_f.PRDF)

0 F; a& x; N0 T% b* Z& F
    {
- ]2 L% a6 z0 v4 N4 M3 ~' i
       M0P_RTC->CR1_f.PRDF = 0;

% S0 Q  u, z" m1 V2 B* t) z
       if(NULL != pstcRtcInternCb->pfnTimerIrqCb)

$ h1 i; X7 m' g" a" s# p
       {
. \3 D/ {* B9 N" y4 ]0 N
           pstcRtcInternCb->pfnTimerIrqCb();

7 `+ i/ L* s. L+ a
       }

$ b* n9 _& a7 t. ~
    }

( A1 m( B8 n5 m8 W# k
}

; [& [6 ^0 F5 Z- u; O5 ]$ C8 q

5 w9 o, m6 Y& s8 j& \
, L- A, L/ g4 n& [* M; K! |$ ~
static void RtcCycCb(void)

& [0 ]+ Q+ ?9 X. ?  O
{

1 M8 d; r1 T0 `
   cyccnt++;

* E# o  m1 z! g7 \. n/ x
   flg = ~flg;
; H6 @+ p' f  t$ X/ x) T
   Gpio_SetIO(3,3,flg);
( R7 ^3 ^% \* S# D! X
}

$ K0 |" V/ [. L9 o3 T: Q
static void RtcAlarmCb(void)
/ }$ y* R; A# [8 T6 m7 S* y) V
{
* o! Y. Q6 q' W( _* s* v
u8Alarmcnt++;
9 D! y% {6 a' o& k( F- B
}
% X. L5 }" G+ S
int32_t main(void)
8 ~+ L/ }0 W* v6 Q% Q4 ~. g6 F
{
" `1 Q$ ]5 y! l
   stc_rtc_config_t stcRtcConfig;
. p, S0 x9 V) t. g
   stc_rtc_irq_cb_t stcIrqCb;
* P& m6 e" v) A' R0 D( @6 T
   stc_rtc_time_t  stcTime;
. G$ M$ W# Y2 v3 y+ C
   stc_rtc_alarmset_t stcAlarm;

; x% f% I; {' M/ L: ~
   stc_rtc_cyc_sel_t   stcCycSel;
; X  Q. ]$ `. s3 v, Z( k
   DDL_ZERO_STRUCT(stcRtcConfig);
9 @& A; _$ m! p' Q/ K- \  S4 S% U3 ?
   DDL_ZERO_STRUCT(stcIrqCb);
- y7 D+ T" N) O' i  E
   DDL_ZERO_STRUCT(stcAlarm);

* l. k( E6 s0 L- N) a
   DDL_ZERO_STRUCT(stcTime);

# r& J  ], s, q2 K# D, v
   DDL_ZERO_STRUCT(stcCycSel);

  `$ y! w, r& \( x
   

8 g3 f! o) |, `+ |
   Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟

5 ?( T8 D0 N: X: e/ n" M
   

. i1 Z0 h: U9 E, {, \8 g# A
   

" ^, p; g9 H# ^8 |7 `  [9 Z+ c# D
   Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口
: A' ^6 l- f& Q- o, ?
    Gpio_SetAnalog(1,5,1);
* S$ t9 m: n9 g6 @9 S
   Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768   
# v1 ]6 O% e2 k) K  ^9 U+ _
   //Clk_Enable(ClkRCL, TRUE);

6 X3 I4 O  ^! g! `0 j
   //Clk_Enable(ClkXTH, TRUE);

' {) m, b6 v$ R9 ^# z, a
   Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟
5 |" q, f  f1 d& `  f/ X* T
   

$ i; Y: m) E. x5 K6 {6 `9 X/ e  I9 I( Q
   stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//

; N5 X: J! C# L) _; q( m3 N
   stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//
. e- l# v. b( N. Q" \- A6 ^) x
     
2 B- N9 F1 c9 t. h/ \
   stcTime.u8Year = 0x17;
4 V- G0 \; [; G/ _3 w
   stcTime.u8Month = 0x06;

$ f* v5 U$ f! b) s8 _+ \
   stcTime.u8Day = 0x07;

+ Z: Q7 b# z) ]
   stcTime.u8Hour = 0x12;
9 y) Z# N, E7 Q
   stcTime.u8Minute = 0x59;
( ?* @8 J& S: v+ G5 N$ q. }3 q/ n9 ]
   stcTime.u8Second = 0x59;

+ h" }( G* E4 |" b5 J6 W' E
   stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
: ]( X1 C7 n, u/ Q) ?0 D
   stcRtcConfig.pstcTimeDate = &stcTime;
) L- {1 K' @0 t
   

( z5 }4 K) |2 r1 ^0 P
   stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;

- k4 }2 s1 y2 t4 R
   stcIrqCb.pfnTimerIrqCb = RtcCycCb;
: v) }- i8 V; ~* N5 Y  d" y: z
   stcRtcConfig.pstcIrqCb = &stcIrqCb;
% b6 Z; y# J% B$ d
   stcRtcConfig.bTouchNvic = FALSE;
& ]' q  f6 Y+ R% h
   

, h9 O" _. ]4 k; J7 E6 g
   Rtc_DisableFunc(RtcCount);
$ T$ B7 o9 C4 I
   Rtc_Init(&stcRtcConfig);

* n* B/ o& R+ y$ p/ z

6 V+ I. ]" F& G& M! ?+ G8 n
   
4 p( V. y# a/ e% C/ u$ u* q! L
   Rtc_EnableFunc(RtcCount);
" S2 f* M: d8 E3 z. @7 m3 @6 D, D
   Rtc_ReadDateTime(&stcReadTime);
8 n- v3 p4 r+ q( C; d' F
   while (1);

2 C7 i, U* X4 F7 m
& ]' v- ~9 L0 H6 Q: p
}

( E2 l% a7 ?! g2 V" C! c6 A7 }0 `" B# H
1 j4 Y5 r# @( ?' q- T1 o
/******************************************************************************
, @1 t( Q. ^5 N0 h0 C! {4 F
*EOF (not truncated)
4 m5 \! R: e0 s8 P4 L
******************************************************************************/

5 Q$ q8 V) n7 Q% {7 G

4 V7 \, ~* z2 z1 |, ]* J& g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-4-28 08:50 , Processed in 0.781022 second(s), 33 queries , Gzip On.

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

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

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