EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 }6 I7 E1 b1 H8 J& X2 e
/************************************************************/ & c# f6 v8 d6 K) r1 d3 ~" X
/******* 样例使用说明 *************/
0 i) ?8 c% M# c Q/******* 版本历史 ************/
3 A# b& [4 q% u& v8 C% x$ r9 ~. _. b/******* 日期 版本 负责人 IAR MDK ***********/
9 ^% I8 n5 X. O& o0 C- Y! f! t6 F/***** 017-07-14 0.1 CJ 7.70 5.14 **********/
! _9 t$ L7 r2 N# Q: I/******* QQ:3386208645 ************/ # ?) A2 ]3 `- }
; M/ `0 I6 R9 {; J' D/ ^
/******* 功能描述 ***********/
/ l' Y! L( b6 | E* x5 t% c/* 本样例主要涉及时钟模块计数寄存器的写入和读取**********/
5 M/ {) e: g. ]3 D8 c/*说明: *************/
& k7 L* U1 Q; ?' G* b/*计数初值写入计数寄存器 *************/ % y" ] Z6 [- ?# c% }/ x
/*启动计数 *************/ ! `6 @/ T. p" h1 R8 M7 Q
/*读取计数寄存器数值 *************/
. j9 |9 _9 d* B Q5 l( U& }1 a/******* 测试环境 *************/ ; ]. s; J X! W# l9 _+ G
/* 测试用板: *************/
7 V3 w: W2 w7 C5 ^* \! k/* SK-L110-TSSOP20 V10 *************/ / i: i/ v# b9 p
/*******辅助工具: ************/ 4 K0 b1 A0 v, n5 G9 E9 v
/* JLINK调试工具 *************/
* @" d1 o5 P; R/************************************************************/ # u: Z* K1 ]/ Z, [- j
#define IS_VALID_CLK(x) (RtcClk32768 == (x)||\ + }& K8 W) a) H0 @, g1 e0 L
RtcClk32768_1== (x)||\
' q F' S9 v9 E9 D- D7 Q, n RtcClk32== (x)||\ 8 ]0 B' B" b& x& x: t7 z% Q
RtcClk32_1== (x)||\ ! K( r' v4 \ ^ h; W# ?- d* M) Z
RtcClkHxt128 ==(x)||\ , I8 a& j7 I8 b; B( e
RtcClkHxt256 == (x)||\
9 ~3 G" ?( t+ K$ ], X( W( L% d RtcClkHxt512 == (x)||\
, c; Q: O1 @& Y% u( K9 ]7 ` RtcClkHxt1024 == (x))
* O: e5 ?5 _9 j: ?* z
9 u) G2 z3 [# y#define IS_VALID_CYCSEL(x) (RtcPrads == (x)||\
3 e, U* O/ g5 |1 q RtcPradx==(x))
$ K6 N$ K% H: Z6 t9 g' X+ X6 @$ K # U- B5 N9 f5 |9 k
#define IS_VALID_PRDS(x) (Rtc_None == (x)||\
7 W; u: Z- s/ X1 e+ @ Rtc_05S == (x)||\
" H$ J: \/ s7 L+ F& L b Rtc_1S == (x)||\ ) |% M. z$ ~9 {5 U
Rtc_1Min == (x)||\ 9 H+ O2 v- B2 r H9 M
Rtc_1H == (x)||\ : P/ G6 H) ~6 F6 p" B) P+ K5 K
Rtc_1Day ==(x)||\ 6 v2 \9 t- V+ g+ _
Rtc_1Mon ==(x)||\
' W0 q0 x# ]) X) H6 i. u Rtc_1Mon_1 ==(x)) % J5 `: }& a7 S, W
/ E+ E1 Z4 `$ w8 Q5 p- {#define IS_VALID_IRQ_SEL(x) (RtcPrdf== (x) ||\
r) A1 i& P, v+ b4 b; L4 c% Q8 \, @ RtcAlmf== (x))
6 r! Y# l9 ]" r& k+ O9 p5 k# M
3 w; a! L' T: n, t. U/ _#define IS_VALID_FUNC(x) ((RtcCount<=(x))&&\
g" T' C* D+ A( ^% J (Rtc1HzOutEn>=(x)))
. X5 s+ s3 k0 a#define CkDateTime 0x7F
% O# T4 f; N! o( h#define CkDate 0x78
$ Z, V& X r: @% H, Q Z#define CkTime 0x07
# I* `3 T" E. r* ~' X. A4 _4 e#define RTC_TIMEOUT 1000//test 1s
1 Y5 b2 i: s: P#define T1_PORT (3)
: Q9 d. R- F ?1 H/ {#define T1_PIN (3) + y/ r. X; _$ L$ \9 ?
uint8_t cyccnt=0;
7 k* d- ~# v! L* u8 V* p; B( \8 ?uint8_t u8Alarmcnt=0; ; y% T0 L( v* V% g3 L# E
uint8_t flg=0;
' P" o0 A, h" c3 z0 ~stc_rtc_time_t stcReadTime; 8 D5 w5 V$ U- q
, q( m8 d9 Y7 O, v1 ?. m/********************************************************************************** \brief RTC计数时钟选择
1 z" a7 y/ I! `( k4 k- u8 _** ** \param [in] enClk时钟源 7 {6 a& L' j+ [. ~" {" Z+ `
** ** \retval Ok
# n5 E Q5 T4 ^3 g5 @' N% B******************************************************************************/
8 Y1 w+ i) R5 L: C: p( oen_result_t Rtc_SelClk(en_rtc_clk_t enClk)
( M9 c- H* D. j+ N" u1 O{
: M! g% o7 Q; ]4 O7 {! F en_result_t enRet = Error; ; [+ E j9 T( y5 _2 M
ASSERT(IS_VALID_CLK(enClk)); 0 p! H' o; w, a' c Y& a* X
M0P_RTC->CR1_f.CKSEL = enClk; 9 {% E0 S" ~/ x* R1 F
enRet = Ok; $ \! e: i& a& D$ n$ b
return enRet;
4 D% G! N& [1 c}
5 U; E! }& P% [! L& p9 F8 u/** 5 q* _8 {& s9 \+ s& V4 z }' Z
******************************************************************************
% l, M# ^- x2 q' L! G **\brief RTC周期中断方式选择
1 I% [1 X3 k0 e3 j' g8 d ** ; C3 e( U$ Q- _ l" B1 D; n
**\param [in] pstccCyc周期中断方式及周期间隔选择
0 f* M% `# I9 v1 p6 v ** 7 z# z b4 o' Q+ A* [9 Z% Q
**\retval Ok + e" b- o& W( a- A# j1 H0 I( ~8 u) ~
** 0 f% R I& s; k4 Y/ N9 y) B, X
******************************************************************************/
# |6 { v5 Z* R4 _# t3 J6 W) ven_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc) ! A. C3 H' I" L5 a3 r
{
2 k% ?9 ?/ |# {! e5 j. T en_result_t enRet = Error;
8 Q" C* H# Q3 H: K) R ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));
- O5 M$ y3 n2 `" Z. \+ v ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel)); 1 w$ J' F/ c3 W) v
M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;
5 @ P& ^* L) h9 z if(pstcCyc->enCyc_sel)
' j$ r4 l: X' q- M1 Q- D) p {
7 R, w" h) [7 U2 o6 X- Q M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;
9 V* y7 i& |& t# r' z# Y3 K m }
, w7 }! ]! r4 I1 E9 t else ' P9 _2 g; D2 @; M5 r$ {9 L0 \2 g
{
) K8 e, i/ H R& W# R. M- { M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;
( I0 o6 X1 ^0 I" f' r0 E }
; B5 _; P8 M W& Y- ~! \& A, k" O7 R enRet = Ok;
% H7 D9 L: |- U: j returnenRet; 4 M8 ]7 K2 f- _4 p) }
} - k7 e( T; N, N
/**
8 i2 }5 [$ p+ s4 W5 I ******************************************************************************
& ~ C$ I# h: b **\brief RTC时制选择 # g$ S8 A) Q b" a1 e
**
7 F0 g% `) b% R1 t7 M! L1 f **\param [in] bmode是12时制or24时制 . g- M8 |% d: L, f
** # w; ^( Q6 ]4 ]% _% j
**\retval Ok 设置正常 ( q5 g$ @6 ]( X! l: e
**\retval ErrorInvalidParameter 设置异常 O+ T: ~9 }: }' Z2 U% c9 f" x
******************************************************************************/
4 Y( o$ s' A& L7 W7 n a2 E" ^$ j6 nen_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode) . H( U/ W4 N V: w! ]$ T5 `/ D
{ 3 Q# c& U) ?. p# j7 a1 @; h
en_result_t enRet = Error;
! {! B; c7 s1 q) k, o1 L switch(enMode) & E8 |" L6 P" ?4 \. C' h' f
{
# L% T* D. e+ f7 v% b! U: t; [ case 0: 4 ~% V: n. w' y1 t. m5 `5 o
case 1:
A& s; O$ S( c. H- z5 U; h- z M0P_RTC->CR0_f.AMPM = enMode; 9 H8 q1 w( b+ p9 `% E0 [
break; $ D# m$ H4 W( g2 b3 N5 g- X' L
default: * X% z9 P$ [- B
return ErrorInvalidParameter;
0 u, G7 A, d8 z% _$ t } ' Q2 q3 e! a' N( H' z# M# x
enRet = Ok; / n) [ [. m. w( q0 G/ j$ }. X
return enRet;
9 @" ~/ x/ Y: D6 }' G* p# `& Y}
. v3 Y; K/ o# ~! x/**
/ F: z- e# \$ u+ [: {* V3 ? ******************************************************************************
- ]% f) L9 p6 @* T& S **\brief RTC闹钟中断设置
8 R) p1 x P" K! j ** ' a2 `9 L5 N4 g8 {# ~
**\param [in] pstcAlarmTime闹钟时间时、分、周
c' n* Y/ u4 t **
3 e; H$ @9 Q) S( a$ k W **\retval Ok 设置正常 . I: i% Y# j6 }: Q
** 8 D$ m: d7 F! f8 G
******************************************************************************/
# P8 ?9 I; |* m& j& d; h0 o; {en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
9 [( T; r6 y1 }$ F( S{ 4 @4 Z( s' i' |- J4 m* ?
en_result_t enRet = Ok; 0 C% ~. X9 f! w% S) W% |
ASSERT(NULL != pstcAlarmTime);
. w) z: v1 C' R- X3 X! j3 j: ^, v if(Rtc12h == M0P_RTC->CR0_f.AMPM) 6 K; s8 U! w5 H' n4 R/ S0 a
{
9 i& \# ^4 |9 m3 M: E2 { enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);
/ A% a& T/ C6 G9 z4 {5 M } * _' }; ~% l d8 K) U; v
else
' d. l% ~2 ]( z, ?4 h% Q) Z {
$ O G6 V' Y# n, G3 D* N* J* {" S enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);
9 s6 e' z$ |* k4 [# x% }7 {( G } 3 h5 _2 ?8 }7 o0 N+ }7 p1 k
if(enRet != Ok) ! S) Y& \0 m [6 i$ Q6 s
return enRet;
$ P$ q* y y! |; T' V enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);
1 V" b& Z9 l9 B6 e2 E C if(enRet != Ok) 1 W) w: {: E5 l) k
return enRet; 2 t$ Z, _! {: S7 t
//enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06); j$ e8 k% x2 A' h" Y
if(enRet != Ok) # B/ s5 Z6 w2 f3 O/ |
return enRet;
2 U" l4 ^0 k3 k# h' X: G M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour; 4 a, d( x9 k5 f* s3 L
M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;
$ n _3 W- ^# q+ w! K& t M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;
; u) h( C, \1 u5 y0 r enRet = Ok;
* F# @; E7 e' G+ }2 M return enRet; 8 e0 ]7 B" k3 K$ r
} & Z' t* @" o/ B% r! h' Q
/** " A# y- q, p( ~) ^4 d1 ~. s3 o
****************************************************************************** $ B: B! r8 H# e! B: m+ S
**\brief RTC闹钟中断时间获取
% Q( z3 m1 y7 F **
& Z3 g8 c" T$ }# x+ Q! P9 K **\param [in] pstcAlarmTime闹钟时间时、分、周
2 e; e3 a! l! T% ^* _5 D5 M ** 6 B5 r t/ c' x; U
**\retval Ok 设置正常
/ ?; s* X* T; ~6 [( x% n- b7 P3 e% H **
( \9 ^3 W$ f6 r5 @, o* } ******************************************************************************/ 8 _. d6 |' o& Q, |" q
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime) L" t4 {5 J% y, O
{
" M9 X* u' Z( i en_result_t enRet = Error;
) E9 R; Y' ?0 K! R- E, k) ]# z ASSERT(NULL != pstcAlarmTime); + W9 }+ t7 _5 ]+ K/ S' H# a
pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;
0 J# n4 a/ h" u; k0 X3 i0 H pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR; ( Q5 {! t' ~/ e9 Q7 m; n
pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;
" u3 `2 f3 ^* R. o0 u Y+ a, L5 ~ enRet = Ok;
" l9 N+ f/ `# y% ]! S | return enRet; , ~+ S2 {) Z4 Q) m) b
}
V+ A5 s1 z: k4 H0 \; B, C% U4 R/** 4 G8 c% J# F; G
****************************************************************************** " k4 x* N- ?+ ~* I
**\brief RTC 1hz模式选择
8 {! T( Y a, c( z6 e8 A" y+ _ ** $ M+ Y3 F7 c I
**\param [in] bmode 高精度和普通精度
/ ^2 p) S S. O8 _. J; I) @ ** , Y3 y! B( g8 t* k4 Y( N1 f( D9 Z
**\retval Ok 设置正常 . W: J' T+ \9 L. N$ C. [8 M
** 2 [( D5 O i# _3 y
******************************************************************************/ : t7 {; S! b+ X6 K b3 R1 o
en_result_t Rtc_Set1HzMode(boolean_t bMode)
- E3 x, y- J1 l! `{ 6 c; D. S3 L% ^) s7 b, s3 A7 a
en_result_t enRet = Error;
4 E4 t0 W, d5 v8 S# n M0P_RTC->CR0_f.HZ1SEL = bMode; , v+ q! B3 Z% c0 D0 n) A
enRet = Ok; , W& t+ e! \. U
return enRet; * U7 T- T; ^/ _9 [% V* ?5 X: `
}
- d# O( S n! F/** # b, z) ~4 H$ q+ m2 {# d
******************************************************************************
8 Z# l ?) C( J/ l7 Q **\brief RTC 1hz补偿值设置
. Y9 E% S# \, j1 W ** , r9 S* w! |. O9 @2 H3 b
**\param [in] u16Cr 补偿值 ' h' k' p: J0 ?7 z
**
: F- N4 X. \, {! J3 _. c% ]' y. a! |! x **\retval Ok 设置正常
. H5 k, N( O( v" f **
( t) m7 z7 k; g" V( M5 l ******************************************************************************/ 6 x$ R! i4 J4 r
en_result_t Rtc_SetCompCr(uint16_t u16Cr) / L0 i$ i2 ^9 q: T8 N" @
{
3 h4 p2 d2 a7 { o en_result_t enRet = Error; 1 @) t1 E2 b0 \* s4 L h
M0P_RTC->COMPEN_f.CR = u16Cr; 2 _4 f* U' Z L: Y. r
enRet = Ok;
) X; c% o, n1 i. t ? return enRet;
9 d3 N# ~1 h% ]' s} ! d" P# L8 w2 c, x
/**
. S7 ^, `3 Q! d8 N) s% E ****************************************************************************** 1 V* W: q" q k, U8 o- ?
**\brief RTC 功能使能设置
0 n3 ?8 N) k! X1 L! N; |: e8 p! P& Q$ N **
. l, q3 Q% ~5 M- x+ a **\param [in] enFunc 功能选择
! _$ v/ {( c5 A# u; U$ \ ** 6 t# y( ^- F3 y$ h1 b. V9 t
**\retval Ok 设置正常 % E. ]7 M7 ]* n$ i+ E
**\retval ErrorInvalidParameter 设置异常
$ V4 g! b- F$ `, p5 F0 y$ H ******************************************************************************/
) r* `0 e5 U! v/ G' U4 a; d: `en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)
9 K+ P2 w6 G2 a# s; ?4 H5 w% {) \" n{ - }) t! s; L- g6 q
ASSERT(IS_VALID_FUNC(enFunc));
6 Q( g# t9 d) N0 F& P* h3 ^ switch(enFunc)
3 Y2 \; O+ _) V5 p0 m% V5 r. \ {
" P# n( I2 m- G( H8 j: s case RtcCount: 2 a3 b" E% q0 j8 Z
M0P_RTC->CR0_f.START = 1u; $ G8 P6 k' ?# x+ L" X
break; $ {; }2 f& R" g
case RtcAlarmEn: " b5 o* w* w. ^4 f r
M0P_RTC->CR1_f.ALMEN = 1u; * \* W, P- T5 m7 \$ g' T4 Q2 f
break; . _! F+ V/ k5 F2 ]
case Rtc_ComenEn:
t5 b* g! ]% d" w) {& e& r M0P_RTC->COMPEN_f.EN = 1u; " |+ t! d3 P* X- ]: K6 u: y
break;
! ]0 h- d( T* a; V S/ T) I* h case Rtc1HzOutEn: & H% a& A/ y6 U# _% O* }2 C8 `
M0P_RTC->CR0_f.HZ1OE = 1u; - r" b9 S3 D/ U2 ^! l0 r0 m) A G
break;
" x7 O1 \' @- ~( M" h default: $ G: V9 e' ~8 d$ f+ i
return ErrorInvalidParameter; 5 S9 N8 ~* e. E) ^4 Q7 f1 {
}
. j X/ {3 a% Y1 ~; F( H5 O1 z return Ok; * L5 s6 h. q( v3 Y
} + x* q. n4 f7 }! K* e0 p
/** , W4 _" j2 R7 O5 N7 c {
******************************************************************************
. W, i1 o% r2 e **\brief RTC 功能禁止设置
' K2 [% p) P4 {, k! Q5 a- X: Y ** . Y1 s5 C5 F/ C% v. ^0 v, P
**\param [in] enFunc 功能选择
8 j% y# @: l& H3 R" s **
5 [4 s; F6 E8 A4 ? **\retval Ok 设置正常 6 {- H8 i) P# c! J
**\retval ErrorInvalidParameter 设置异常
4 O/ S( b; C& }! a ******************************************************************************/ 2 f( Q' m9 r+ H u. v. [2 {
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
' M9 m+ r1 Z- z3 A0 I7 v# W{ - y9 U. V8 C6 W k$ k
ASSERT(IS_VALID_FUNC(enFunc));
2 G& v3 r, r- c7 D' F2 O5 ~' R switch(enFunc)
( P% M- ?! t7 w2 f1 B {
, K+ J6 p% a+ Y case RtcCount:
( L @) \6 F/ ?& N/ G. ]1 n/ D) S M0P_RTC->CR0_f.START = 0u;
* b& P* n- k( \ ^ break;
% c9 ?* j& X- B' k6 N case RtcAlarmEn: 6 u r4 p& y; V
M0P_RTC->CR1_f.ALMEN = 0u; - E# _# a- j3 y n7 f3 X7 R& l) E
break; b( p) q. M& @$ n* Z2 W
case Rtc_ComenEn: , `2 d9 w9 w$ O
M0P_RTC->COMPEN_f.EN = 0u;
# \ O( M4 N+ T break;
2 r/ e6 g6 Q3 g& }! u0 d3 g/ O! v case Rtc1HzOutEn:
7 n) W( T( `: H: e6 j M0P_RTC->CR0_f.HZ1OE = 0u;
" `* L0 q# g; S* y: Z break; ; K0 G7 w; t6 v
default: , p* \2 ]% |3 V
return ErrorInvalidParameter; ' k @, f$ z/ ~, V% c
} 8 g- l8 K g/ I4 w& N" V5 I
return Ok; ( O$ o4 T" b$ l
}
) w3 y" f# ?$ ^& l- fuint8_t Change_DateTimeFormat(uint8_t u8sr) . R" Q% c2 f x$ `
{
- x N( w" ~& T( U6 [& \ uint8_tu8de=0;
9 U0 E2 x" v' `7 N, R: O while(u8sr>=0x10)
% n5 ?8 A. Q. a) p {
5 J- @/ E h# a- [% _; ] u8de+=10;
2 J) _- |0 D% ]! ], ^+ k u8sr-=0x10; & _6 M' ?3 z" W
}
& Q& j9 s! O2 k4 Q0 _8 {. a u8de+= u8sr;
2 p1 y ^2 @$ A: \0 g return(u8de);
3 Z7 N) q) l7 z* e$ v, q} 8 b( B: g: ?8 f1 B$ G' R6 g# n& I
/** t# s5 s1 e" D5 D( F2 C
******************************************************************************
! [8 A" s* i% t( `7 e **\brief RTC 平、闰年检测 / X4 S5 Z/ i$ ]
** 6 O# B1 i+ O% I8 D6 m9 C
**\param [in] u8year 年十进制低两位
% Z. u$ |& O1 U1 |! v, z% z **
: L0 D7 Z- b$ } **\retval 1 闰年 . [7 u4 T: n2 R0 u0 q+ N7 @) j* y
**\retval 0 平年
' h! F! c3 z4 G3 _5 Y* E' H) j! Z ******************************************************************************/
% }4 V, ]) s- E3 i2 Ouint8_t Rtc_CheckLeapYear(uint8_t u8year)
: s! o4 X2 A$ g" d, u2 @{
6 K/ I$ B) ]6 P uint8_t u8year_shl,u8year_shr;
0 T/ w( O% f. m3 m+ h& v u8year_shl = u8year>>2;
0 \$ j3 w- h0 v$ G# {; M u8year_shr = u8year_shl<<2;
* ?# N; L7 {- o* q if(u8year== u8year_shr)
% A) G9 N: t- e/ W1 X o" \+ {9 I) g { $ q" W; E7 [+ z- N' t- ]) [
return 1;
' d( T2 E4 }1 D1 q v+ o } 2 I# K, n" ]7 x4 J: G0 Y, B$ W
else
, ~# ]: V1 G( _5 k/ S { : {! b4 R1 ]1 s3 S. ]% e
return 0; & }% h9 h. R7 [: f" g; d; {
}
2 T8 [' q _( Y: |. b' y% f3 M3 J}
U) c4 M; o& {3 n2 D. S/**
/ \. ]1 C& e- B ****************************************************************************** " {- G0 U. F7 u% o" c7 ]
**\brief RTC根据日期计算周数
0 p: s7 M. B8 { **
, _" g6 w& H- v2 Z **\param [in] pu8Date日期 3 _; \' J5 H7 ^+ m) t
**
9 {% F ~4 `, v! ~- Q( R5 x5 h **\retval week 周数 $ h |/ D4 q" {
** % R$ v% w7 Q) J; F* N
******************************************************************************/ 0 j8 a! A# l* v7 Y: o; N
uint8_t Rtc_CalWeek(uint8_t* pu8Date) % f& B! q. H1 }- {; B7 N* Q
{ ) L9 `) i4 U1 ?2 |+ F
uint8_t u8week; , D% s+ N4 D5 V- x* P+ z
if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1)) ! ?- p2 b) L! ?0 y/ o
{
. ^. z. K% ]" K( Q u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7; ( D/ M% P6 |$ C2 B
} - P4 z9 A' I8 q5 D B% E; Z
else
4 A' A2 d4 s) h7 | { 5 S9 C: w3 `; `5 B* s# y
u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
8 |& b- e) Z7 n, G2 d* J& W, T }
" y, m4 ^: N) G; P0 U return u8week;
+ ?( C. f; ]- H8 b5 p+ `}
) e. A! v% m9 C4 D( l6 a4 F% v/**
( B1 ^2 D( l/ ~/ u& q- O ******************************************************************************
) n" W1 N( f H- p **\brief RTC根据年月获取天数 0 l/ g% c4 p4 P
**
. O' W! ?; }, O, V/ @, w2 ^1 C **\param [in] u8month月份,u8year年份 3 L( O3 z: W7 A. G$ K/ Q& D
**
% P& K9 l1 j7 C' X# _7 A **\retval u8day天数
2 r) {/ [0 A% L4 u ** ( K1 m$ v4 \! r# @' a0 b
******************************************************************************/
7 X d3 X. v9 N/ Y8 juint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year) 6 z$ ^) r7 l- T U- O
{
6 x* g& x/ s$ L uint8_tu8day = 0; 1 x: |7 T# s3 v$ V' l" y
. b8 |$ d1 c' v' k, N5 Z u8day= Cnst_Month_Tbl[u8month - 1]; & _8 V- R) r' m% H
if((u8month== 2) && ((u8year % 4) == 0)) 4 a0 C4 n2 u" u8 n1 ?* y: W
{ . J d2 ~$ m9 S" h
u8day++;
2 X* K: I9 c! f' p( K# _; G } 7 u/ T4 X" ]0 Q; C1 T
return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31
: _" B" s8 s' T3 ~3 V$ y} ) J9 @8 o' b& V. L% W
/** ' ]. d4 I y6 o/ z2 s
****************************************************************************** 0 s0 {3 g0 J, ?0 ]8 [4 D7 p
**\brief RTC根据日期计算周数
3 ~5 m! n1 r" o1 N ** 2 o# V- I& O# t. Z( T
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值 " Y% {: S' a9 ?* a) O/ i
**
0 Q8 K6 q/ e# f& L; P$ M% g **\retval Error 错误,Ok校验正确
4 x7 o9 H# d) ?5 K }! ~ ** ) A1 ~+ v q( z& @, p
******************************************************************************/ / P/ _& g h2 X- ~6 y8 I6 s# @/ \ a
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)
# G- C4 }) n, s1 ]+ M{
% X& X6 B0 L* N% ^ " Y, n3 s) r5 Z0 Z# S" h( T u
if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90) + ~% ~9 X! a. h8 L' O) s1 R
||(u8data > u8limit_max) || (u8data < u8limit_min))
) \5 N: [* T# [: ?. N { 5 Q7 D, [7 @ m1 U0 }
return Error; 9 i/ d; q, g, ~6 N" q5 _6 o) H2 I
} ( x* A9 d" G; a
return Ok;
8 _0 v2 ~4 E* N1 Q8 s4 S} 7 r1 r+ _1 c5 n% h6 i! U ~+ p
/**
; n; b6 j* O0 U1 \) X ****************************************************************************** ' `9 J T/ N9 h6 ] \; C
**\brief RTC时间格式检测
/ `+ ^" @' t8 J0 F ** # \8 m+ s( a! Q/ w2 L+ Q" k7 j& O
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式 " \% \& ~7 Z3 A" r. y
**
3 T- q8 b# {/ O! O; `" z **\retval enRet校验结果 " e4 y/ q4 W- f) j
** * G8 W# p8 _ o3 o& r4 E
******************************************************************************/ 8 A, \ L9 {+ z3 ^( j
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode) 4 N4 ~6 {! a$ a8 f. A' T
{
/ Q3 k3 K# O/ Q" i: L' H! R uint8_t u8i=0; + s& ?1 \7 [9 C8 C% U) t! B5 ?
uint8_t u8mon_max_day = 0x28;
& T4 ]& d4 Q$ V uint8_t u8date[3];
: T/ v1 X3 r& w, q1 z6 U en_result_t enRet;
: F4 _1 K+ r/ @7 D! y3 ~4 E while(u8i<7)
0 U5 |/ H: |) b# P" g* l3 l {
- M: [( T& B5 d+ {1 u, @- Z if(u8Mode&&(1<<u8i))
1 ]. ]2 N1 \% A" b* w {
* e7 ?( r+ s- s/ S [3 p switch(u8i)
" E! |* l/ U# E7 M( { }! O { 1 n" z. _6 c8 o6 A; o+ }1 n
case 0:
) L; g8 q/ X: X* I f% A enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//秒 7 U0 D! M4 t( N
break; " z2 [/ G5 T/ ]( P; C
case 1:
( b a6 c, p$ @. n! g) T d enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//分 . q6 F4 Y; y9 C1 b
break;
) v9 p4 {) }" c$ }/ m case 2:
0 X/ {7 y& M. s if(Rtc12h == M0P_RTC->CR0_f.AMPM)
2 W/ ^( F* v% _. F% _! U7 Y& x enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//时
& ?% [' l8 s& z# \ else ) t6 j+ d, {* O2 ]* ]
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);
2 }$ r) ?/ G- ]1 x" W7 j/ M break; ! p* ^; i# \/ U/ W5 L
case 3:
, g" f# h+ q' l( T5 ~* ^. [ enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06); 5 w" j7 M: |6 m
break; & O' Y! W* S0 M) x
case 4: z' G m( U5 e( S7 Q/ f
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31); 7 h9 m/ x* _8 y& U
u8date[0] = *pu8TimeDate; 8 w7 e' b$ f6 o$ G1 N6 }
break;
, G5 F, P" C; i" c# f, M2 m case 5: 8 C5 A( i( n. U
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12); ' O9 E$ P: s% _' ]3 _: ?
u8date[1] = *pu8TimeDate; 0 @* U+ ~- f! n
break;
. }$ w' O7 }* M$ e case 6: 2 u& d% L) t; ]* G
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99); % o o1 `$ f! Y. p3 g! u
u8date[2] = *pu8TimeDate; 4 Q- _) L5 A; G9 s2 p
break; " A* K! a. Q5 J3 g
} ) P# g1 w2 e4 r7 h% A! D
pu8TimeDate++;
7 M0 `! [; @0 `4 V$ N/ I } 9 N! r8 L6 P& C( P3 d8 w
if(enRet!=Ok) 6 P4 q) a( K! [/ o! E1 L' l8 l
return enRet;
; L& H: U; J; J$ q u8i++;
: p0 ~! s. L" j+ g8 S }
/ z& g8 [5 h, ?" U/ _5 l- p* ] if((u8Mode&0x10)&&(u8Mode&0x20)) 2 {2 o6 s1 I0 h. N- v1 B x
{ ( T8 C. L. X- G
if(u8Mode&0x40) 7 h: }* P8 q7 B
u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2])); ; d1 {* g& p- X/ o4 N5 }0 Q
else
+ q3 ~' A( b% ^3 U; }- f u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1); : ]3 G' n7 w! P, Q8 m
if(u8date[0]>u8mon_max_day)
1 \$ f+ x7 x6 i# I, o$ j) q$ z returnError; ( Y! Y4 }1 b/ I/ ^* e- s' W2 b+ L' [
}
6 I2 e8 \* r8 ?7 ?- u if((u8Mode&0x10)&&(!(u8Mode&0x20)))
, E4 k m/ Z1 [4 t& `. @ {
: h9 k/ V, b( c+ V# Z% k if(u8date[0]>0x28)
1 k) i$ b/ I& x9 A# U) ?* W# M" S$ Q returnError; 5 L' Y- T; ~& R, D& j1 |/ F
}
. ]% K+ m) v' S7 n* d enRet = Ok;
9 T$ I& k6 `- P; y return(enRet);
. v) L* x g6 y, g$ K}
7 ?# D9 w' W" V u9 G7 `8 o/** " i( U( ]& h) @0 K% K
******************************************************************************
2 }( z9 w9 i: l **\brief RTC设置时间函数 5 l4 r% M+ K6 ?; G6 e
** 3 D+ O) k4 f0 |' v* B
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期 8 Q1 t# ~. Z9 i
**
$ y9 H& P; s& k **\retval Ok 设置正常
, P4 K) O3 x1 h% R' X. z# v; K **\retval ErrorTimeout 时间溢出错误
+ D" {3 q; w# [: U, C W ******************************************************************************/ : {" U- v* o4 s3 U6 s1 L# t% C2 n$ g4 S0 Q
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,
7 j% p8 V4 b5 j$ d boolean_t bUpdateDate) # _% X9 p* o% ~
{
6 r3 J8 x O, k U6 ~1 L5 e2 f int32_t u32TimeOut; % g$ Z0 W6 c4 c1 d5 D
u32TimeOut = RTC_TIMEOUT; $ w0 x* t3 a; E( Z# k& W' u! V) G
uint8_t* pu8TimeDate; 2 g$ m3 d$ d& k* c: S' g0 K4 Q
en_result_t enRet = Ok;
m! G2 |0 u' J4 P7 t pu8TimeDate = &pstcTimeDate->u8Second; $ t4 a, C: F3 e' S8 I
ASSERT(NULL != pstcTimeDate); ' g% d. Z8 A+ B, g2 f) I2 K
if(1 == M0P_RTC->CR0_f.START)
) U t) ]( C/ a, d$ M {
$ i2 s1 _+ w/ i/ r1 h$ e A' B, S M0P_RTC->CR1_f.WAIT = 1;
3 b( S; n, g7 t while(--u32TimeOut)
3 \ I/ v Q ^' { {
& m! w9 U& C6 ^: p; {8 I- Y if(M0P_RTC->CR1_f.WAITF)
& F' K6 E5 E, c3 i; ?7 U- V# v {
. w% \& T9 a. D, P, e k+ v! @ break; ! D# \, s- ~# B9 w$ K' A3 }, ?) x
} * Y* j1 F4 n" h
}
: @) j* y2 G7 C* Z if(u32TimeOut==0) # o/ ~; H3 V9 O# T
{
8 K% n9 G% u c, o, y$ [ return ErrorTimeout; K. t5 J5 ~. |/ ~/ B: \
} # q3 |* o) d8 ~5 C, t3 O- @3 D# K1 e) c
}
0 T7 J( C7 a) a7 }5 F7 q2 C- y if(TRUE == bUpdateTime) ( m a( s8 n" o; A: k9 c
{ 9 P3 i: k, T4 A! y# e
enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);
. T6 a1 I* P! a! v if(enRet != Ok)
9 t! P3 v# w4 ?5 M" D' m N return enRet;
# j3 t" c, O9 ]! R$ \ M0P_RTC->SEC = pstcTimeDate->u8Second; 5 @ F% |: Q7 m
M0P_RTC->MIN = pstcTimeDate->u8Minute;
/ K9 p; C' {/ t$ o! l M0P_RTC->HOUR = pstcTimeDate->u8Hour;
. g5 B3 f3 g. D: D# u) Y% E } + S) u G+ f) R+ J
if(TRUE == bUpdateDate) 0 H3 J( H2 d& U$ m* |% I
{ 5 _& I% O' I4 b7 v
enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate); ) X3 l9 I! {; u% W9 u% d. }
if(enRet != Ok)
! c' G$ w6 v9 w" b: d return enRet;
9 s: x* s6 q: k0 @ M0P_RTC->DAY = pstcTimeDate->u8Day; 6 ^ k! ~5 b( a
M0P_RTC->MON = pstcTimeDate->u8Month;
# ^+ `4 e# p* `) n M0P_RTC->YEAR = pstcTimeDate->u8Year; 9 X) z. X* H# L$ d' k, h! g3 R
M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;
; E0 K4 s" @3 X' y/ ~" \ }
: K* ?9 d& R7 N* b. R8 J8 u M0P_RTC->CR1_f.WAIT = 0;
4 \& a$ n7 H/ ^: M7 R+ @+ {& w if(1 == M0P_RTC->CR0_f.START)
2 z# Y& c6 E" |6 k! s- p' J while(M0P_RTC->CR1_f.WAITF); 3 }$ M# ~7 m( t9 q+ {- b
return enRet;
, z8 ]) v q6 Z( x P+ I}
9 k, B0 n* |6 G7 h1 i. K/**
- X8 v: Z$ J' D' c ******************************************************************************
' J, x, ^8 \# H3 ]; O **\brief RTC获取时间函数 : X! s/ ^( T2 i N
**
* b. Y+ @9 ~1 l$ s7 p **\param [in] pstcTimeDate日期时间数据
& z8 R) `- `0 e5 l$ d; m7 e; ~4 f ** / u/ O# O$ q) G2 c# w1 U
**\retval Ok 获取正常 ' h2 S$ }6 }& F4 J. q# y5 f
**\retval ErrorTimeout 时间溢出错误 ; M: m$ O& |& B( A& E
******************************************************************************/ 2 O: r7 p* `9 V/ R
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate) % E+ @7 ]8 K7 H
{ & D0 k. ]1 d* `- D$ D
uint32_t u32TimeOut; ' L) q1 n* L) `4 S* X
uint8_t u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year; ) M. A( D+ e- `- T
4 G8 M% u8 i. ]/ R2 y
ASSERT(NULL != pstcTimeDate);
- e) k6 @4 i: K+ R5 @3 F M$ z- T" y u32TimeOut = RTC_TIMEOUT; 7 H# u- Y+ o. f' n. q& @4 i4 R- l
if(1 == M0P_RTC->CR0_f.START)
5 U* [" B7 m/ _+ ^9 N# t {
6 d2 _* S. y9 P, q, { M0P_RTC->CR1_f.WAIT = 1; - \' o5 S2 U1 p# L' i: [" g
while(u32TimeOut--) 7 b+ z; G) L# U! q
{
+ _( g/ }5 ^% ^! d! a: h+ n# E if(M0P_RTC->CR1_f.WAITF) / c* |6 W+ N& @( U0 z- |. d, [
{
0 M4 C7 a$ X' e7 g& a break;
* j0 Y' Y& h" d- j- r0 K7 ~+ j }
5 _( H E' @3 M0 z }
# ^1 |5 N7 N- V/ U8 a3 | if(u32TimeOut==0) 7 G% }) B3 z" w9 u
{
/ L1 K$ W4 e( E A8 X/ B return ErrorTimeout;
" t# s) z! M8 }/ }6 k4 i* c. | }
7 p, i' e" k% ] } # r6 u# B3 X+ ^
u8BcdSec = M0P_RTC->SEC;
& G- k( G! J" f9 F3 |3 X0 \- v/ y2 _ u8BcdMin = M0P_RTC->MIN;
' C/ L4 t* s. @4 X0 A0 |( H u8BcdHour = M0P_RTC->HOUR; 2 w* j9 A, s1 R
u8Day = M0P_RTC->DAY; ; G. o' U6 t/ ?- S5 f. V( M1 w
u8Month = M0P_RTC->MON;
1 i3 ^; \7 v# j1 Z x u8Year = M0P_RTC->YEAR;
8 a& L. x3 H9 N6 [! ], a$ u0 v( V4 C u8DayOfWeek = M0P_RTC->WEEK;
- o$ ?. G* o( {% [# V ! p. w; c2 A4 ~% L6 k
pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec); 6 x& O4 v, F% y I5 e) H, d ^
pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);
# B1 y0 V; \* s E: Y$ S pstcTimeDate->u8Hour =u8BcdHour;//BcdToDec(u8BcdHour); . g C" W5 v- J+ V$ P
pstcTimeDate->u8Day =u8Day;//BcdToDec(u8Day);
, _4 v) A8 R% r9 k, V2 z pstcTimeDate->u8Month =u8Month;//BcdToDec(u8Month); / E, a1 t' n" [1 A
pstcTimeDate->u8Year =u8Year;//BcdToDec(u8Year); # B0 X( m5 i# p
pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek); 3 y2 U6 _2 A- G7 W2 u0 _
M0P_RTC->CR1_f.WAIT = 0;
2 m5 k) g+ O0 C& _2 ^' z if(1 == M0P_RTC->CR0_f.START) , A$ `8 Y; @& E6 G+ U* q
while(M0P_RTC->CR1_f.WAITF);
, l5 l0 A# F0 j6 [6 l" U* W return Ok;
/ m% a& Y* {. q8 A2 E} 8 j2 R% u7 g4 Y5 _9 y B5 K8 w
/**
% }3 ?6 U/ p: t o( E* ^3 T ******************************************************************************
, V; q' ~ S# H* S **\brief RTC计数or读写状态获取 , k* }: p8 L- L7 {! n
**
1 s* u; G4 F0 c. ]! ^5 G **\param [in] 无 . {) r: d: s& u' P/ m
** 9 b) K; @5 ]# j/ Y Z
**\retval 计数or读写状态 0 ? I% m- ?/ w7 S1 z
**
, ~9 K9 t. Y; |7 t1 N4 l) d: X ******************************************************************************/ 1 j) Y3 i5 o; z. R% G+ Y& F
boolean_t Rtc_RDStatus(void)
$ i7 F/ e) e7 V+ a5 h{ ' A& C" u' ~% K, s
boolean_t bRet; / G% p$ b7 r7 T0 y4 ~1 O1 A* }
bRet = M0P_RTC->CR1_f.WAITF;
* \$ E6 D8 c' l6 A return bRet;
* r6 D6 _" K3 |( L* t}
; w/ ~/ P# L& e# O: m/**
$ V- v' A( W- \ ****************************************************************************** ) V$ X' {; L$ O) q2 X; K
**\brief RTC闹钟中断使能
- ^) M: |7 y) h/ |' q q' N ** 5 t0 L7 V8 o/ h6 M. {
**\param [in] enordis中断使能or禁止 - W U) v) e; H7 F) K& g0 B! M' E
** 3 f* G( Q/ X0 A1 B, I4 n, N& S
**\retval Ok设置成功
( A7 b4 I' \3 r* ?4 e( j2 ^! ?5 ` ** 0 {7 I9 l0 p% i) S. s
******************************************************************************/ & S1 r6 {5 V% o* O: P7 m% \
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)
, [3 w0 M( Q* ~& H{
4 J5 I/ c% J" X en_result_t enRet = Error; 5 q, s3 A5 M0 T: d4 q
M0P_RTC->CR1_f.ALMIE = enIrqEn;
: D/ K) s" `9 j% n, n4 O Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记
* b o! x! a& C9 \- R9 v enRet = Ok; ) M9 V& }) ~) M+ m
return enRet; # j5 q' h: `" A" I1 U# O$ r" v
}
: b1 }0 L' ~. J, a- n n$ U/**
: s. b0 C3 ~. R1 v' ` ****************************************************************************** # w& Z+ U- g: T! h
**\brief RTC中断请求状态获取
) M5 Y: x; m) S% O **
( Q, R6 O- y# r* A; j5 o **\param [in] enIrqSel获取哪种中断请求
* Z) h1 k+ v; a& S **
: T7 @4 f2 u( G0 l; j! W **\retval 中断请求状态 6 U; z: s! G2 j: j }9 t
**
+ Q( N( q- p2 w4 l1 ] ******************************************************************************/
( U' l( N9 V9 O$ _. ]% O( {+ V4 `/ Lboolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel) . s, v* z/ O' t, T
{
* o% U6 N! s+ n3 s boolean_t bRet = FALSE;
1 H1 y2 ^! j$ L H ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
( A7 Y4 i( D. _1 v/ S switch(enIrqSel) , y2 ]6 S$ |2 ~
{
5 i* R* z, ]3 H; z case RtcPrdf: , K- b" r- B6 c! |* }4 n4 S
(M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE); 5 H# J x/ h7 w- M# O( T
break;
x/ D- @# a- r7 ] case RtcAlmf : $ K, X T. U5 W# |" s
(M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE); d1 G5 Y$ o6 {, w6 K ]- J
break;
2 }! I! _* l5 w* s! a, L default: , J0 i( S- A/ |, V" }
break; : o1 X" _$ V9 m% s1 V
}
1 w& A& H7 [" r% r2 S5 ]0 s return bRet;
8 s' b# K g" H. V8 O} * ^+ @5 X: a, `2 F7 r
/** # P% F6 A; m0 ~& ?
****************************************************************************** & F) P% I2 z) a" J, R
**\brief RTC中断请求清除
1 g, V+ n/ o! ~ **
' E" \9 {! t4 _% c8 V) n **\param [in] enIrqSel清除哪种中断请求
6 C' c& z- {/ y$ H+ Q8 d7 ~& a6 [ **
! f6 B' j g% M/ \. c# }& h+ w **\retval Ok 清除成功
. V8 M0 h; a9 m* C( [ **\retval ErrorInvalidParameter 清除失败
& D3 J* q# v( B5 R ******************************************************************************/ - ?% ?9 h& I A6 O4 c9 e e
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel) 7 A# P4 o! S, N* n: M- {$ e; U
{
% C2 |0 S5 ]! C5 p; b+ a/ m2 H ASSERT(IS_VALID_IRQ_SEL(enIrqSel)); j) g( L8 u5 p
switch(enIrqSel)
) L: s. \2 P4 r { 7 \* {* T2 T& L
case RtcPrdf:
2 a+ |6 R7 w2 C7 [3 j, w% i" N+ O M0P_RTC->CR1_f.PRDF = 0;
0 v, e: y1 _' m2 F+ ^* t3 W break; + f6 ^; f0 F9 x u6 W3 i. z( ?
case RtcAlmf:
4 X$ @0 k d( l5 g4 y M0P_RTC->CR1_f.ALMF = 0; # E2 G. L) K5 |2 p
break; $ I9 I3 b% ^8 {- F* p1 O, a& F" L
default: ; K& U" h+ A) _5 Q
return ErrorInvalidParameter;
8 o. R0 H* {. {! @2 G# E } ) p, F* J7 M# u/ ]' x
return Ok;
# z5 K: ?" A: M1 D}
3 n! q& Q5 N8 M( C2 ~% z / Y+ k# U* o' I! v; w
/** 1 z+ X0 c# m& w. [- o
****************************************************************************** / d5 {7 h# t; M* A3 R% u* ]
**\brief RTC中断处理函数接口获取 0 l! a2 L# u( n5 E
**
2 P* d3 L+ N0 g$ K- |# {# a; H **\param [in] 无
. _7 ^3 Q+ T+ F8 |9 x u2 S2 t **
2 N6 {; g. p, u0 v) g **\retval 接口函数地址
- b! u2 E9 O, `6 U ** + V, ~ ~3 r3 K9 [% ~
******************************************************************************/ . @/ ~8 A* \( O% O# H' E3 M6 I5 m5 G
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)
4 P" \, M0 A: S. E; E5 |, ^{ - |: a9 h2 |. o. ^9 m
return &stcRtcIrqCb; $ z: L$ M! Q% Z: u4 W; k y
}
$ U* U5 }2 \1 M, M6 O0 p8 H, j/**
/ p/ o' C5 x, o0 l! \3 ? ****************************************************************************** $ t0 l# J" B1 E' e# x
**\brief RTC总体初始化函数
% W/ R* Z& g ^' |4 a3 q ** 5 {& D/ x1 M! w8 G( u
**\param [in] pstcRtcConfig初始化结构 # B+ u9 n: P$ z& \6 p' c/ b
** $ K$ f$ J g K0 x
**\retval Ok初始化成功 - C: a1 @$ L! Z
**\retval ErrorInvalidParameter 初始化错误
; i, u, W" n0 ^" l& j0 b5 j- @6 C ******************************************************************************/
! S" l8 ~6 q; H5 w0 `en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)
- y7 ]+ \3 p& T5 W! K{
% }: t. E- v, Y z+ B; E. x/ R' v+ ` en_result_t enRet = Error;
/ m5 ` k) r9 v+ E. l* k stc_rtc_intern_cb_t* pstcRtcInternCb; % l1 X" Q4 v& U% A' a
if(NULL == pstcRtcConfig)
" R) ]3 z: }7 Y8 l return Error;
. j7 @+ ?6 ?4 b2 _6 g pstcRtcInternCb = RtcGetInternDataCb();
# ^/ e7 g# f4 o, ? enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);
8 {$ [: ~# y# v$ w enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);
4 X9 ~1 b. M( C) b4 o1 B5 W if(enRet != Ok) 5 t; G$ S- \, \" _2 O% t% A. j
{ - F+ ^0 x! W% b- K2 v3 j; |! c1 t
return enRet;
0 b+ F$ W6 {; r0 U8 a }
1 J% s1 z6 r+ ^7 x: j- G, s/ U6 ~ if(NULL != pstcRtcConfig->pstcCycSel) 2 w) z. G7 S2 }8 L% U" H1 o2 u
{
6 c2 R# R+ }1 W( R8 F. m if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))
! E* p9 h- U/ h5 O0 N/ J return Error; ' G, Q5 I* `5 k; k/ ~
} 6 B2 G! e3 |; ]1 d( x4 N' F6 [; P
if(NULL != pstcRtcConfig->pstcTimeDate) : n: r1 g0 J1 T$ H6 p
{ . U, ]3 H: J) w" V! B1 S
if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE)) - k! t s% ?4 p* C5 @
return Error;
0 n0 a5 I* I! b$ B, Z! S1 R# w; ] }
2 @+ U: o8 e" [! ^7 ^) z if(NULL != pstcRtcConfig->pstcIrqCb)
, [1 |& ^* `) ^1 a$ A7 |" U {
5 W6 I& |5 V$ y pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;
! b5 |* a% z; B1 C+ {/ D+ a' K pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;
, T* o, i' u& W. w2 V- e* C3 z } - A& f$ N3 k& A2 z. `- U
if(TRUE == pstcRtcConfig->bTouchNvic)
4 B$ Z. @" p8 E2 R4 [! g0 o; Z* R { 6 A* s# O- i. h
EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);
/ @3 ?2 z& W- `0 h2 p }
* E3 y% ^0 J% I, I5 X else
: k: N$ m2 u# n% O* l6 v { 7 R+ O) R2 n) ]! ^, r8 a
EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE); 9 }& _0 L/ @3 ?
}
$ R) z) i+ w# @8 `+ p6 O return enRet;
6 q, X! f; S0 j9 o}
7 x, W7 S4 {1 l' p" N1 s/** R3 G* X5 x( P' J) I' N3 M* c
******************************************************************************
: g3 d. X( \. ?8 M **\brief RTC计数禁止函数 ; `( z6 Z4 T1 c4 R& b) t" ~ D
** , k" R/ ~! w5 y4 c* M! w; h e
**\param [in] 无 & _0 Y8 V8 d& G4 w1 o t8 _$ Z
** , Y# i$ L, `4 t& J5 e
**\retval Ok禁止设置成功 $ @& V. j6 K, e% Q8 k% i% W- s
**
6 S- D4 ~- |& v ******************************************************************************/ 9 h u$ ]- z; a9 `/ r/ \9 ^
en_result_t Rtc_DeInit(void)
3 F: }2 v/ s- p. l4 g0 a0 `! T{ & G9 w; s+ L! G( |- j, j
EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE); 2 j" I8 v" w; U1 w0 s
Rtc_DisableFunc(RtcCount);
% h3 W5 N Q S! [5 P/ q- ^5 r; ~ Rtc_DisableFunc(RtcAlarmEn);
" q$ V# H; z7 I2 E% u3 @ Rtc_DisableFunc(Rtc_ComenEn);
9 N! _9 b: L$ x; Y/ s3 s Rtc_DisableFunc(Rtc1HzOutEn); 6 Z, a3 v8 T. ?. r( a; ~& W& v* S2 |# K
return Ok;
k0 f/ _8 ?3 r1 ~5 L; K} 5 Q4 m7 _" H( l& F+ `0 a
/**
/ N( B$ M$ y- h) m5 R- \ ******************************************************************************
7 Z3 K* N- N% O: w4 ^- L0 I **\brief RTC中断处理函数 8 t1 N; F# r; L+ w- W
**
* w; r5 A& w; P+ R; u; ~' g **\param [in] 无
+ n6 ~, O3 X$ \4 W6 z& Z6 [8 g; Q8 R ** 8 Z h2 [; r$ R
**\retval 无 $ w* j) n8 o9 t( Q( E0 b
** / {7 e" s0 Z/ p! \* n9 c9 g+ l
******************************************************************************/ 2 k) f# v0 m) e0 p5 t' c
void Rtc_IRQHandler(void)
( Y; [, ?5 Q3 c% {{ . b; f/ g- U" ^5 g5 {
stc_rtc_intern_cb_t* pstcRtcInternCb; ; g( E4 |8 A |- ]* |# d
pstcRtcInternCb = RtcGetInternDataCb() ; " c" W& ?+ W# M1 O& w- @3 P
if(TRUE == M0P_RTC->CR1_f.ALMF)
) x5 C6 b8 H: w! ^ { - q- p; z1 q! d0 y3 z) _
M0P_RTC->CR1_f.ALMF = 0u;
2 M# o6 _* i: p/ y" [ if(NULL != pstcRtcInternCb->pfnAlarmIrqCb) # L% `3 o' ?. U9 O: g2 f% Y
{ % i f; M7 c7 R1 w
pstcRtcInternCb->pfnAlarmIrqCb(); 2 z" e/ P( i/ | v, O
} 5 F: F+ {) }9 L. k: H
}
9 D5 H8 \3 u$ x/ L) c- S$ o if(TRUE == M0P_RTC->CR1_f.PRDF)
: x M5 F) k8 H* q8 ]: v0 ? { : H; ~ a$ |! S( ]. ~9 }
M0P_RTC->CR1_f.PRDF = 0; % D& E$ h3 x/ ?1 A2 a4 U* x
if(NULL != pstcRtcInternCb->pfnTimerIrqCb) / ]2 g& i" [1 r
{ 5 r' Z. C# n8 U- A: R
pstcRtcInternCb->pfnTimerIrqCb();
: `% }5 q( C. j1 b0 ]7 O } $ W- ]! ^. D: V; n! ~
} % G6 O6 t5 b! p0 h8 E) w3 l; m' C
} ' g! Y1 r( Z4 A% J) W+ K! n8 A8 p
* h u7 V8 Z8 H/ S
0 g- D3 U; D- E7 J. s5 H, @
static void RtcCycCb(void) V5 X. s3 G. e6 x) A' v) m @' b
{ ' ]+ l7 C% m( ~- S( g
cyccnt++; ' f( I5 f' R1 ]1 p1 T6 u, n t
flg = ~flg;
1 m8 `5 l3 U, ~& B) Y9 r+ h( e Gpio_SetIO(3,3,flg);
4 I; A5 W: _$ L4 v} , f: r8 G5 \) v8 S
static void RtcAlarmCb(void)
+ k8 l {. Z) u% y{
! G- [3 p* z. u2 e8 v' B u8Alarmcnt++; & m V& \5 }" |
}
6 P& x. j" i. z- gint32_t main(void) ; b5 ]2 o. ?8 y2 N
{
\! Y% F: G$ ~; q stc_rtc_config_t stcRtcConfig; . c" B. D/ y0 ~ M# Z: }) C5 v
stc_rtc_irq_cb_t stcIrqCb; - _5 F8 a% e5 n3 i$ G7 H4 ]
stc_rtc_time_t stcTime;
5 ^( p* p& ]: }! @1 F stc_rtc_alarmset_t stcAlarm;
" r& a% @; k' _7 \$ \, j. h stc_rtc_cyc_sel_t stcCycSel; 1 S! r- b# j y R( ~. S. n# U
DDL_ZERO_STRUCT(stcRtcConfig); + r6 L) T E$ L* ~
DDL_ZERO_STRUCT(stcIrqCb); 3 J& C) P4 R$ Y3 ~3 r' h
DDL_ZERO_STRUCT(stcAlarm); 9 a% \- H M; k% T) ~# Q6 j
DDL_ZERO_STRUCT(stcTime);
4 n& }5 {, C$ L* Q0 D1 q DDL_ZERO_STRUCT(stcCycSel);
2 f E+ ?% X# a2 o7 x d ; s# r' J" P4 g
Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟
9 e8 X, d& c: P. L h' i ) w9 X# S% h$ |$ Z/ }; b4 ]
2 |/ _! k% _* @8 _6 E. q+ t- c' u
Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口
7 w0 o8 h: u" X Gpio_SetAnalog(1,5,1);
+ r7 D0 S' W) n3 \* j; N" P# H% m Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768 * ?' K4 x% V, U! Z, ?4 L3 I8 u
//Clk_Enable(ClkRCL, TRUE);
* L2 s$ e% M. z2 I" `6 W* r. [ //Clk_Enable(ClkXTH, TRUE); 5 b6 r/ J" |( K- J
Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟 - K$ C: r7 }2 p% m
3 b) L0 _, j, I7 p6 A stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;// 1 s6 p. q0 `; r) `- e; U* H/ T
stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;// # l* q! c# p* S5 u# [$ q3 S1 D; m5 x
) V0 B) o0 U8 Q& |5 d
stcTime.u8Year = 0x17; ( m) |3 Z4 X+ b( |5 U0 p6 r% ~
stcTime.u8Month = 0x06;
! o: y) l! A& R' Z stcTime.u8Day = 0x07; 5 e; N0 x% R( x/ k \
stcTime.u8Hour = 0x12;
$ a& J. O2 ~% S9 N( w, U" Q; D; h stcTime.u8Minute = 0x59; ' _ b) h! d$ m' f+ a' ~# i
stcTime.u8Second = 0x59; 2 m" N% r: M, s" Y* R
stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
4 K1 b1 X" X. S5 Q stcRtcConfig.pstcTimeDate = &stcTime; 6 i0 I, t9 B( r! c9 Y
, e9 r9 i- H$ J! n
stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;
( A* m- \ I# p' K: r5 {/ T( z5 ^ stcIrqCb.pfnTimerIrqCb = RtcCycCb;
0 r& ?4 a ?6 b+ C stcRtcConfig.pstcIrqCb = &stcIrqCb; 4 |6 b( e, v' C9 _
stcRtcConfig.bTouchNvic = FALSE;
: p4 T+ k2 Q2 u! O" j7 w" Y
4 n- _3 [& E* l5 S Rtc_DisableFunc(RtcCount);
$ B. C+ P" `5 T5 @ Rtc_Init(&stcRtcConfig); + {) S- }' Z8 q( j! d5 c& @7 b& M
5 K* V: G* U+ |, D 5 \+ W- u( a( \. ^+ s$ A- H
Rtc_EnableFunc(RtcCount);
2 W0 t7 ~: K* y) a+ R! O# E Rtc_ReadDateTime(&stcReadTime); 5 t4 r2 i, o w: F* _3 W- L: _, i
while (1);
# H6 q" b9 }- y) t4 q* ^# q5 v
1 q+ D$ Q6 B1 U} ' \3 }5 u6 ] J: q6 s
" r2 O e' R1 e8 f9 i3 g% ?" k! D
/****************************************************************************** # w; c+ D' z, r6 @$ ^2 f
*EOF (not truncated) 6 g( ~1 k( d+ b2 K/ k1 k
******************************************************************************/
! |# C7 a0 Y) U; y# q
: s9 ` \% f# Z, t; D |