CH57x_clk.c 19 KB

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