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