1 /********************************** (C) COPYRIGHT *******************************
2 * File Name : CH57x_clk.c
3 * Author : WCH
4 * Version : V1.0
5 * Date : 2018/12/15
6 * Description
7 *******************************************************************************/
8
9 #include "CH57x_common.h"
10
11 /*******************************************************************************
12 * Function Name : SystemInit
13 * Description : 系统时钟默认初始化
14 * Input : None
15 * Return : None
16 *******************************************************************************/
SystemInit(void)17 void SystemInit(void)
18 {
19 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
20 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
21 R16_CLK_SYS_CFG = (2<<6)|0x08; // 32M -> Fsys
22 *((PUINT16V)0x40001048) |= 4;
23 R8_SAFE_ACCESS_SIG = 0;
24
25 mDelayuS(10);
26 /* 开启电压监控 */
27 PowerMonitor( ENABLE );
28 }
29
30 /*******************************************************************************
31 * Function Name : SetSysClock
32 * Description : 重设系统运行时钟
33 * Input : sc: 系统时钟源选择
34 refer to SYS_CLKTypeDef
35 * Return : None
36 *******************************************************************************/
SetSysClock(SYS_CLKTypeDef sc)37 void SetSysClock( SYS_CLKTypeDef sc)
38 {
39 switch( sc )
40 {
41 case CLK_SOURCE_LSI:
42 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
43 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
44 R8_CK32K_CONFIG &= ~RB_CLK_OSC32K_XT;
45 R16_CLK_SYS_CFG = (3<<6)|0x08;
46 break;
47 case CLK_SOURCE_LSE:
48 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
49 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
50 R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT;
51 R16_CLK_SYS_CFG = (3<<6)|0x08;
52 break;
53 case CLK_SOURCE_HSE_32MHz:
54 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
55 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
56 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(2<<6)|0x08;
57 break;
58 case CLK_SOURCE_HSE_16MHz:
59 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
60 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
61 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(0<<6)|0x02;
62 break;
63 case CLK_SOURCE_HSE_8MHz:
64 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
65 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
66 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(0<<6)|0x04;
67 break;
68 case CLK_SOURCE_HSI_32MHz:
69 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
70 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
71 R16_CLK_SYS_CFG = (2<<6)|0x08;
72 break;
73 case CLK_SOURCE_HSI_16MHz:
74 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
75 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
76 R16_CLK_SYS_CFG = (0<<6)|0x02;
77 break;
78 case CLK_SOURCE_HSI_8MHz:
79 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
80 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
81 R16_CLK_SYS_CFG = (0<<6)|0x04;
82 break;
83 case CLK_SOURCE_PLL_40MHz:
84 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
85 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
86 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(1<<6)|12;
87 break;
88 case CLK_SOURCE_PLL_32MHz:
89 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
90 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
91 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(1<<6)|15;
92 break;
93 case CLK_SOURCE_PLL_24MHz:
94 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
95 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
96 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(1<<6)|20;
97 break;
98 case CLK_SOURCE_PLL_20MHz:
99 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
100 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
101 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(1<<6)|24;
102 break;
103 case CLK_SOURCE_PLL_16MHz:
104 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
105 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
106 R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(1<<6)|30;
107 break;
108 default :
109 break;
110 }
111 R8_SAFE_ACCESS_SIG = 0;
112 }
113
114 /*******************************************************************************
115 * Function Name : GetSysClock
116 * Description : 获取当前系统时钟
117 * Input : None
118 * Return : Hz
119 *******************************************************************************/
GetSysClock(void)120 UINT32 GetSysClock( void )
121 {
122 UINT16 rev;
123
124 rev = R16_CLK_SYS_CFG & 0xff;
125 if( (rev & RB_CLK_SYS_MOD) == (2<<6) ){ // 32M做主频
126 return (32000000);
127 }
128 else if( (rev & RB_CLK_SYS_MOD) == (1<<6) ){ // PLL进行分频
129 return (480000000/(rev&0x1f));
130 }
131 else if( (rev & RB_CLK_SYS_MOD) == (0<<6) ){ // 32M进行分频
132 return (32000000/(rev&0x1f));
133 }
134 else { // 32K做主频
135 return (32000);
136 }
137 }
138
139 /*******************************************************************************
140 * Function Name : HClk32M_Select
141 * Description : 32M 高频时钟来源
142 * Input : hc:
143 Clk32M_HSI - 选择内部32M
144 Clk32M_HSE - 选择外部32M
145 * Return : None
146 *******************************************************************************/
HClk32M_Select(HClk32MTypeDef hc)147 void HClk32M_Select( HClk32MTypeDef hc)
148 {
149 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
150 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
151 if( hc == Clk32M_HSI)
152 R16_CLK_SYS_CFG &= ~RB_CLK_OSC32M_XT;
153 else
154 R16_CLK_SYS_CFG |= RB_CLK_OSC32M_XT;
155 R8_SAFE_ACCESS_SIG = 0;
156 }
157
158 /*******************************************************************************
159 * Function Name : LClk32K_Select
160 * Description : 32K 低频时钟来源
161 * Input : hc:
162 Clk32K_LSI - 选择内部32K
163 Clk32K_LSE - 选择外部32K
164 * Return : None
165 *******************************************************************************/
LClk32K_Select(LClk32KTypeDef hc)166 void LClk32K_Select( LClk32KTypeDef hc)
167 {
168 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
169 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
170 if( hc == Clk32K_LSI)
171 R8_CK32K_CONFIG &= ~RB_CLK_OSC32K_XT;
172 else
173 R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT;
174 R8_SAFE_ACCESS_SIG = 0;
175 }
176
177
178 /*******************************************************************************
179 * Function Name : HSECFG_Current
180 * Description : HSE晶体 偏置电流配置
181 * Input : c: 75%,100%,125%,150%
182 * Return : None
183 *******************************************************************************/
HSECFG_Current(HSECurrentTypeDef c)184 void HSECFG_Current( HSECurrentTypeDef c )
185 {
186 UINT8 x32M_c;
187
188 x32M_c = R8_XT32M_TUNE;
189 x32M_c = (x32M_c&0xfc)|(c&0x03);
190
191 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
192 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
193 R8_XT32M_TUNE = x32M_c;
194 R8_SAFE_ACCESS_SIG = 0;
195 }
196
197 /*******************************************************************************
198 * Function Name : HSECFG_Capacitance
199 * Description : HSE晶体 负载电容配置
200 * Input : c: refer to HSECapTypeDef
201 * Return : None
202 *******************************************************************************/
HSECFG_Capacitance(HSECapTypeDef c)203 void HSECFG_Capacitance( HSECapTypeDef c )
204 {
205 UINT8 x32M_c;
206
207 x32M_c = R8_XT32M_TUNE;
208 x32M_c = (x32M_c&0x8f)|(c<<4);
209
210 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
211 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
212 R8_XT32M_TUNE = x32M_c;
213 R8_SAFE_ACCESS_SIG = 0;
214 }
215
216 /*******************************************************************************
217 * Function Name : LSECFG_Current
218 * Description : LSE晶体 偏置电流配置
219 * Input : c: 70%,100%,140%,200%
220 * Return : None
221 *******************************************************************************/
LSECFG_Current(LSECurrentTypeDef c)222 void LSECFG_Current( LSECurrentTypeDef c )
223 {
224 UINT8 x32K_c;
225
226 x32K_c = R8_XT32K_TUNE;
227 x32K_c = (x32K_c&0xfc)|(c&0x03);
228
229 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
230 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
231 R8_XT32K_TUNE = x32K_c;
232 R8_SAFE_ACCESS_SIG = 0;
233 }
234
235 /*******************************************************************************
236 * Function Name : LSECFG_Capacitance
237 * Description : LSE晶体 负载电容配置
238 * Input : c: refer to LSECapTypeDef
239 * Return : None
240 *******************************************************************************/
LSECFG_Capacitance(LSECapTypeDef c)241 void LSECFG_Capacitance( LSECapTypeDef c )
242 {
243 UINT8 x32K_c;
244
245 x32K_c = R8_XT32K_TUNE;
246 x32K_c = (x32K_c&0x0f)|(c<<4);
247
248 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
249 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
250 R8_XT32K_TUNE = x32K_c;
251 R8_SAFE_ACCESS_SIG = 0;
252 }
253 /*******************************************************************************
254 * Function Name : Calibration_LSI
255 * Description : 校准内部32K时钟
256 * Input : None
257 * Return : 误差:千分之(单位)
258 *******************************************************************************/
259 // 0-26030Hz 1023-44220Hz
Calibration_LSI(void)260 UINT16 Calibration_LSI( void )
261 {
262 UINT16 rev, basev;
263 UINT32 calv;
264 UINT16 i;
265 UINT16 loc, loc_t;
266 signed short CNT_STEP_K;
267 signed short diff_1, diff_2, diffc;
268 UINT8 k=0;
269
270 /* 根据当前时钟获取标称值和斜率(T-step) */
271 rev = R16_CLK_SYS_CFG & 0xff;
272 // CNT_STEP_K=Fsys*5*(1/26030 - 1/44220)/1023;
273 if( (rev & RB_CLK_SYS_MOD) == (2<<6) ){ // 32M做主频
274 calv = ((5*32000000+(CAB_LSIFQ>>1))/CAB_LSIFQ);
275 CNT_STEP_K = -3;
276 }
277 else if( (rev & RB_CLK_SYS_MOD) == (1<<6) ){ // PLL进行分频
278 calv = (((UINT32)5*480000000/(rev&0x1f)+(CAB_LSIFQ>>1))/CAB_LSIFQ);
279 CNT_STEP_K =( -37-((rev&0x1f)-1))/(rev&0x1f);
280 }
281 else if( (rev & RB_CLK_SYS_MOD) == (0<<6) ){ // 32M进行分频
282 calv = ((5*32000000/(rev&0x1f)+(CAB_LSIFQ>>1))/CAB_LSIFQ);
283 CNT_STEP_K = ( -3-((rev&0x1f)-1))/(rev&0x1f);
284 }
285 else { // 32K做主频
286 calv = (5);
287 CNT_STEP_K = 0;
288 }
289
290 /* 校准 */
291 basev = ( calv &0xfff ); // 获取校准标称值
292 // loc = 1023*(f-26030)/f/((44220-26030)/44220) 经验曲线
293 loc = R16_INT32K_TUNE;
294 diff_2 = 0;
295 diffc = 0;
296
297 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
298 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
299 R8_OSC_CAL_CTRL = RB_OSC_CNT_EN;
300 do
301 {
302 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
303 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
304 R16_INT32K_TUNE = loc;
305 R8_SAFE_ACCESS_SIG = 0;
306
307 /* 读取当前值 */
308 while(!(R8_OSC_CAL_CTRL&RB_OSC_CNT_HALT));
309 i = R16_OSC_CAL_CNT; // 用于丢弃
310 while(R8_OSC_CAL_CTRL&RB_OSC_CNT_HALT);
311 while(!(R8_OSC_CAL_CTRL&RB_OSC_CNT_HALT));
312 i = R16_OSC_CAL_CNT; // 实时校准后采样值
313 k++;
314
315 diff_1 = i-basev;
316
317 if( diff_1 == 0 ){
318 return 0; // 校准正好
319 }
320 else if((diff_1*diff_2)<0){ // 处于两点之间
321 if((diffc == 1) || (diffc == -1) || (diffc == 0))
322 {
323 // 都变成正数
324 if( diff_2<0 ) diff_2 = ~(diff_2-1);
325 else diff_1 = ~(diff_1-1);
326
327 if(diff_1>diff_2){
328 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
329 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
330 R16_INT32K_TUNE = loc_t;
331 R8_SAFE_ACCESS_SIG = 0;
332
333 return (diff_2*1000/basev); // 返回误差值,千分之
334 }
335 else return(diff_1*1000/basev);
336 }
337 }
338
339 // 保存上一次值
340 diff_2 = diff_1;
341 loc_t = loc;
342 diffc = diff_1/CNT_STEP_K;
343 loc = loc - diffc;
344 if( loc == loc_t )
345 {
346 if( diff_1 > 0 ) loc = loc+1; // 当前频率偏小
347 else loc = loc-1; // 当前频率偏大
348 }
349 }while( k<20 );
350
351 return(0xff);
352 }
353
354
355 /*******************************************************************************
356 * Function Name : RTCInitTime
357 * Description : RTC时钟初始化当前时间
358 * Input : y: 配置时间 - 年
359 MAX_Y = BEGYEAR + 44
360 mon: 配置时间 - 月
361 MAX_MON = 12
362 d: 配置时间 - 日
363 MAX_D = 31
364
365 h: 配置时间 - 小时
366 MAX_H = 23
367 m: 配置时间 - 分钟
368 MAX_M = 59
369 s: 配置时间 - 秒
370 MAX_S = 59
371 * Return : None
372 *******************************************************************************/
RTC_InitTime(UINT16 y,UINT16 mon,UINT16 d,UINT16 h,UINT16 m,UINT16 s)373 void RTC_InitTime( UINT16 y, UINT16 mon, UINT16 d, UINT16 h, UINT16 m, UINT16 s )
374 {
375 UINT32 t;
376 UINT16 year, month, day, sec2, t32k;
377 UINT8V clk_pin;
378
379 year = y;
380 month = mon;
381 day = 0;
382 while ( year > BEGYEAR )
383 {
384 day += YearLength( year-1 );
385 year--;
386 }
387 while ( month > 1 )
388 {
389 day += monthLength( IsLeapYear( y ), month-2 );
390 month--;
391 }
392
393 day += d-1;
394 sec2 = (h%24)*1800+m*30+s/2;
395 t32k = (s&1)?(0x8000):(0);
396 t = sec2;
397 t = t<<16 | t32k;
398
399 do{
400 clk_pin = (R8_CK32K_CONFIG&RB_32K_CLK_PIN);
401 }while( (clk_pin != (R8_CK32K_CONFIG&RB_32K_CLK_PIN)) || (!clk_pin) );
402
403
404 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
405 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
406 R32_RTC_TRIG = day;
407 R8_RTC_MODE_CTRL |= RB_RTC_LOAD_HI;
408 R32_RTC_TRIG = t;
409 R8_RTC_MODE_CTRL |= RB_RTC_LOAD_LO;
410 R8_SAFE_ACCESS_SIG = 0;
411 }
412
413 /*******************************************************************************
414 * Function Name : RTC_GetTime
415 * Description : 获取当前时间
416 * Input : y: 获取到的时间 - 年
417 MAX_Y = BEGYEAR + 44
418 mon: 获取到的时间 - 月
419 MAX_MON = 12
420 d: 获取到的时间 - 日
421 MAX_D = 31
422 ph: 获取到的时间 - 小时
423 MAX_H = 23
424 pm: 获取到的时间 - 分钟
425 MAX_M = 59
426 ps: 获取到的时间 - 秒
427 MAX_S = 59
428 * Return : None
429 *******************************************************************************/
RTC_GetTime(PUINT16 py,PUINT16 pmon,PUINT16 pd,PUINT16 ph,PUINT16 pm,PUINT16 ps)430 void RTC_GetTime( PUINT16 py, PUINT16 pmon, PUINT16 pd, PUINT16 ph, PUINT16 pm, PUINT16 ps )
431 {
432 UINT32 t;
433 UINT16 day, sec2, t32k;
434
435 day = R32_RTC_CNT_DAY & 0x3FFF;
436 sec2 = R16_RTC_CNT_2S;
437 t32k = R16_RTC_CNT_32K;
438
439 t = sec2*2 + ((t32k<0x8000)?0:1);
440
441 *py = BEGYEAR;
442 while ( day >= YearLength( *py ) )
443 {
444 day -= YearLength( *py );
445 (*py)++;
446 }
447
448 *pmon = 0;
449 while ( day >= monthLength( IsLeapYear( *py ), *pmon ) )
450 {
451 day -= monthLength( IsLeapYear( *py ), *pmon );
452 (*pmon)++;
453 }
454 (*pmon) ++;
455 *pd = day+1;
456 *ph = t/3600;
457 *pm = t%3600/60;
458 *ps = t%60;
459 }
460
461 /*******************************************************************************
462 * Function Name : RTC_SetCycle32k
463 * Description : 基于LSE/LSI时钟,配置当前RTC 周期数
464 * Input : cyc: 配置周期计数初值 - cycle
465 MAX_CYC = 0xA8BFFFFF = 2831155199
466 * Return : None
467 *******************************************************************************/
RTC_SetCycle32k(UINT32 cyc)468 void RTC_SetCycle32k( UINT32 cyc )
469 {
470 UINT8V clk_pin;
471
472 do{
473 clk_pin = (R8_CK32K_CONFIG&RB_32K_CLK_PIN);
474 }while( (clk_pin != (R8_CK32K_CONFIG&RB_32K_CLK_PIN)) || (!clk_pin) );
475
476 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
477 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
478 R32_RTC_TRIG = cyc;
479 R8_RTC_MODE_CTRL |= RB_RTC_LOAD_LO;
480 R8_SAFE_ACCESS_SIG = 0;
481 }
482
483 /*******************************************************************************
484 * Function Name : RTC_GetCycle32k
485 * Description : 基于LSE/LSI时钟,获取当前RTC 周期数
486 * Input : None
487 * Return : 返回当前周期数,MAX_CYC = 0xA8BFFFFF = 2831155199
488 *******************************************************************************/
RTC_GetCycle32k(void)489 UINT32 RTC_GetCycle32k( void )
490 {
491 UINT32 i;
492
493 do{
494 i = R32_RTC_CNT_32K;
495 }while( i != R32_RTC_CNT_32K );
496
497 return (i);
498 }
499
500 /*******************************************************************************
501 * Function Name : RTC_TMRFunCfg
502 * Description : RTC定时模式配置
503 * Input : t:
504 refer to RTC_TMRCycTypeDef
505 * Return : None
506 *******************************************************************************/
RTC_TMRFunCfg(RTC_TMRCycTypeDef t)507 void RTC_TMRFunCfg( RTC_TMRCycTypeDef t )
508 {
509 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
510 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
511 R8_RTC_MODE_CTRL &= ~(RB_RTC_TMR_EN|RB_RTC_TMR_MODE);
512 R8_RTC_MODE_CTRL |= RB_RTC_TMR_EN | (t);
513 R8_SAFE_ACCESS_SIG = 0;
514 }
515
516 /*******************************************************************************
517 * Function Name : RTC_TRIGFunCfg
518 * Description : RTC时间触发模式配置
519 * Input : cyc: 相对当前时间的触发间隔时间,基于LSE/LSI时钟周期数
520 * Return : None
521 *******************************************************************************/
RTC_TRIGFunCfg(UINT32 cyc)522 void RTC_TRIGFunCfg( UINT32 cyc )
523 {
524 UINT32 t;
525
526 t = RTC_GetCycle32k() + cyc;
527 if( t>0xA8C00000) t -= 0xA8C00000;
528 if( t&0xFFFF ) t = t+0x10000;
529
530 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
531 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
532 R32_RTC_TRIG = t;
533 R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN;
534 R8_SAFE_ACCESS_SIG = 0;
535 }
536
537 /*******************************************************************************
538 * Function Name : RTC_ModeFunDisable
539 * Description : RTC 模式功能关闭
540 * Input : m: 需要关闭的当前模式
541 * Return : None
542 *******************************************************************************/
RTC_ModeFunDisable(RTC_MODETypeDef m)543 void RTC_ModeFunDisable( RTC_MODETypeDef m )
544 {
545 UINT8 i=0;
546
547 if( m == RTC_TRIG_MODE ) i |= RB_RTC_TRIG_EN;
548 else if( m == RTC_TMR_MODE ) i |= RB_RTC_TMR_EN;
549
550 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
551 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
552 R8_RTC_MODE_CTRL &= ~(i);
553 R8_SAFE_ACCESS_SIG = 0;
554 }
555
556 /*******************************************************************************
557 * Function Name : RTC_GetITFlag
558 * Description : 获取RTC中断标志
559 * Input : f:
560 refer to RTC_EVENTTypeDef
561 * Return : 中断标志状态:
562 0 - 未发生事件
563 (!0) - 发生事件
564 *******************************************************************************/
RTC_GetITFlag(RTC_EVENTTypeDef f)565 UINT8 RTC_GetITFlag( RTC_EVENTTypeDef f )
566 {
567 if( f == RTC_TRIG_EVENT )
568 return ( R8_RTC_FLAG_CTRL & RB_RTC_TRIG_FLAG );
569 else
570 return ( R8_RTC_FLAG_CTRL & RB_RTC_TMR_FLAG );
571 }
572
573 /*******************************************************************************
574 * Function Name : RTC_ClearITFlag
575 * Description : 清除RTC中断标志
576 * Input : f:
577 refer to RTC_EVENTTypeDef
578 * Return : None
579 *******************************************************************************/
RTC_ClearITFlag(RTC_EVENTTypeDef f)580 void RTC_ClearITFlag( RTC_EVENTTypeDef f )
581 {
582 switch( f )
583 {
584 case RTC_TRIG_EVENT:
585 R8_RTC_FLAG_CTRL = RB_RTC_TRIG_CLR;
586 break;
587 case RTC_TMR_EVENT:
588 R8_RTC_FLAG_CTRL = RB_RTC_TMR_CLR;
589 break;
590 default :
591 break;
592 }
593 }
594
595
596