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