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