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