[LOOK] LOOK_RTC例程及星期算法的各种实现

[复制链接]
3523|10
 楼主| hotpower 发表于 2011-7-22 20:31 | 显示全部楼层 |阅读模式
RTC, se, ui, TE, ck
本帖最后由 hotpower 于 2011-7-23 13:25 编辑

1.LOOK的核

2.LOOK_RTC例程工程包

3.例程运行网页串口调试图示


4.LOOK_RTC.CPP程序片段

  1. #include "LOOK_RTC.h"
  2. #define LOOK_H 1
  3. /*---------------------------------------------------------
  4. 0.红杏
  5. 1.老师
  6. 2.暴力
  7. ----------------------------------------------------------*/
  8. #define WEEK_M 6
  9. /*---------------------------------------------------------
  10. 0.世纪内星期算法        0  3536 3524
  11. 1.菜农星期表格         12 3548 3536
  12. 2.菜农星期公式         20 3556 3544
  13. 3.菜农星期第二公式      20 3556 3544
  14. 4.基姆拉尔森星期公式        36 3572 3560
  15. 5.蔡勒完整星期公式         36 3572 3560
  16. 6.蔡勒星期公式(无越界校验)  28 3564 3552 (此公式不能在计算机实战)
  17. ----------------------------------------------------------*/
  18. #if LOOK_H == 0
  19. #include "NUC1xx.h"
  20. #include "NUC1xxM051Seriescfg.h"
  21. #else
  22. #include <nuc120re3an.h>
  23. using namespace nuvoton;
  24. #endif
  25. sem_t sem = 0;
  26. class rtc_t : public interrupt_t {
  27. public:
  28. __INLINE__ rtc_t();
  29. bool Init();
  30. char* GetRTCString();
  31. void OutSendSecond();
  32. protected:
  33. bool isr(int vector);
  34. void dsr(int vector, uintptr_t count);
  35. private:
  36. bool RtcInit();
  37. bool WriteEnable();
  38. void SetTickMode(uint32_t ucMode);
  39. void SetTickInt();
  40. void SetCalender();
  41. void SetHourMode(uint32_t ClockDisplay);
  42. void SetDate(uint32_t Year, uint32_t Month, uint32_t Day);
  43. void SetTime(uint32_t Hour, uint32_t Minute, uint32_t Second);
  44. void SetWeek(uint32_t Year, uint32_t Month, uint32_t Day);
  45. void GetCalender();
  46. char* GetDateWeekString();
  47. char* GetTimeString();
  48. private:
  49. uint32_t Year;
  50. uint32_t Month;
  51. uint32_t Day;
  52. uint32_t DayOfWeek;
  53. uint32_t Hour;
  54. uint32_t Minute;
  55. uint32_t Second;
  56. uint32_t ClockDisplay;
  57. char Buffers[256];
  58. };

  59. // rtc_t构造函数
  60. __INLINE__ rtc_t::rtc_t()
  61. {
  62. attach(RTC_IRQn);
  63. vector_t::enable(RTC_IRQn);
  64. // Init();
  65. }
  66. bool rtc_t::Init()
  67. {
  68. if (RtcInit())
  69. {
  70.   SetCalender();
  71.   SetTickInt();
  72.   return true;
  73. }
  74. return false;
  75. }
  76. void rtc_t::SetTickInt()
  77. {
  78. #if LOOK_H == 0
  79. RTCs.RIER.Bits.TIER = 1;
  80. #else
  81. RTC.RIER().TIER = 1;
  82. #endif
  83. }
  84. void rtc_t::SetCalender()
  85. {
  86. if (WriteEnable())
  87. {
  88.   SetHourMode(1);//DRVRTC_CLOCK_24
  89.   SetDate(2011, 7, 15);
  90.   SetTime(23, 59, 0);
  91.   SetWeek(2011, 7, 15);
  92.   SetTickMode(0);
  93. }
  94. }
  95. void rtc_t::SetTickMode(uint32_t ucMode)
  96. {
  97. if (WriteEnable())
  98. {
  99. #if LOOK_H == 0
  100.   RTCs.TTR.Bits.TTR = ucMode;  
  101. #else
  102.   RTC.TTR().TTR = ucMode;  
  103. #endif
  104. }
  105. }
  106. bool rtc_t::RtcInit()
  107. {
  108. #if LOOK_H == 0
  109. RTCs.INIR.Regs = 0xa5eb1357;
  110. delay(1);
  111. return RTCs.INIR.Regs == 1;
  112. #else
  113. RTC.INIR = 0xa5eb1357;
  114. delay(1);
  115. return RTC.INIR().ACTIVE;
  116. // return RTCs.INIR == 1;
  117. #endif
  118. }
  119. bool rtc_t::WriteEnable()
  120. {
  121. bool result;
  122. uint32_t count = 0;
  123. #if LOOK_H == 0
  124. do{
  125.   RTCs.AER.Bits.AER = 0xA965;
  126. }
  127. while ((++count < 2500) && (RTCs.AER.Bits.ENF != 1));
  128. #else
  129. do{
  130.   RTC.AER().AER = 0xA965;
  131. }
  132. while ((++count < 2500) && RTC.AER().ENF != 1);
  133. #endif
  134. result = (count < 2500) ? true : false;
  135. return result;
  136. }
  137. void rtc_t::SetHourMode(uint32_t ClockDisplay)
  138. {
  139. if (WriteEnable())
  140. {
  141. #if LOOK_H == 0
  142.    RTCs.TSSR.Bits.HR24 = ClockDisplay;
  143. #else
  144.    RTC.TSSR().HR24 = ClockDisplay;
  145. #endif
  146. }
  147. rtc_t::ClockDisplay = ClockDisplay;
  148. }
  149. void rtc_t::SetWeek(uint32_t Year, uint32_t Month, uint32_t Day)
  150. {
  151. uint32_t DayOfWeek;
  152. #if WEEK_M == 1
  153. //月表=(13*Month+8)/5
  154. static const char WeekTable[]="\x2\x5\x0\x3\x5\x1\x4\x6\x2\x0";
  155. #endif
  156. if (WriteEnable())
  157. {
  158.   if (Month < 2)
  159.   {
  160. //去年
  161.    if (Year > 0) Year --;//2000.3~2099.12
  162.    else Year = 9999;
  163. //今年的1月2月是去年的13月14月
  164. //   Month += 12;
  165. //今年的1月2月是去年的5月6月
  166.    Month += 4;
  167.   }
  168. #if WEEK_M == 0
  169. //世纪内星期算法
  170. //工程编译长度合计3480个字节
  171.      DayOfWeek = ((Year%100)+((Year%100)>>2)+(13*Month+8)/5+Day)%7;
  172. #else
  173.   #if  WEEK_M == 1
  174. //菜农星期表格=((百年%4)*5+年+年/4+月表+日)%7
  175. //月表=(13*Month+8)/5
  176. //工程编译长度合计3492个字节
  177.      DayOfWeek = (((Year/100)&3)*5+(Year%100)+((Year%100)>>2)+WeekTable[Month-3]+Day)%7;
  178.   #else
  179.     #if WEEK_M == 2
  180. //菜农星期公式=((百年&3)*5+年+(年>>2)+(13*月+8)/5+日)%7
  181. //工程编译长度合计3500个字节
  182.      DayOfWeek = (((Year/100)&3)*5+(Year%100)+((Year%100)>>2)+(13*Month+8)/5+Day)%7;
  183. #else
  184.       #if WEEK_M == 3
  185. //菜农星期公式2=((百年*5)%20+年+(年>>2)+(13*月+8)/5+日)%7
  186. //工程编译长度合计3492个字节
  187.      DayOfWeek = (((Year/100)*5)%20+(Year%100)+((Year%100)>>2)+(13*Month+8)/5+Day)%7;
  188.    #else
  189.         #if WEEK_M == 4
  190. //基姆拉尔森星期公式=(百年/4+百年*5+年+年/4+(13*月+8)/5+日)%7
  191. //工程编译长度合计3516个字节
  192.      DayOfWeek = (Year/400+(Year/100)*5+(Year%100)+((Year%100)>>2)+(13*Month+8)/5+Day)%7;
  193.    #else
  194.      #if WEEK_M == 5
  195. //蔡勒完整星期公式=(203+百年/4-2*百年+年+年/4+(13*月+3)/5+日+1)%7
  196. //工程编译长度合计3516个字节
  197.      DayOfWeek = (203+Year/400-(Year/100)*2+(Year%100)+((Year%100)>>2)+(13*Month+8)/5+Day)%7;
  198.   #else //WEEK_M == 6
  199. //蔡勒星期公式=(百年/4-2*百年+年+年/4+(13*月+3)/5+日+1)%7 (此公式不能在计算机实战)
  200. //工程编译长度合计3508个字节
  201.      DayOfWeek = (Year/400-(Year/100)*2+(Year%100)+((Year%100)>>2)+(13*Month+8)/5+Day)%7;
  202.     #endif
  203.         #endif
  204.       #endif
  205.     #endif
  206.   #endif
  207. #endif
  208. #if LOOK_H == 0
  209.   RTCs.DWR.Bits.DWR = DayOfWeek;
  210. #else
  211.   RTC.DWR().DWR = DayOfWeek;
  212. #endif
  213.   rtc_t::DayOfWeek = DayOfWeek;
  214. }
  215. }
  216. void rtc_t::SetDate(uint32_t Year, uint32_t Month, uint32_t Day)
  217. {
  218. if (WriteEnable())
  219. {
  220. #if LOOK_H == 0
  221. /*
  222.   RTCs.CLR.Bits.YEAR10 = (Year % 100) / 10;
  223.   RTCs.CLR.Bits.YEAR1 = (Year % 100) % 10;
  224.   RTCs.CLR.Bits.MON10 = Month / 10;
  225.   RTCs.CLR.Bits.MON1 = Month % 10;
  226.   RTCs.CLR.Bits.DAY10 = Day / 10;
  227.   RTCs.CLR.Bits.DAY1 = Day % 10;
  228. */
  229.   RTCs.CLR.Regs = (((Year % 100) / 10) << RTC_CLR_YEAR10)
  230.                 | (((Year % 100) % 10) << RTC_CLR_YEAR1)
  231.                 | ((Month / 10) << RTC_CLR_MON10)
  232.                 | ((Month % 10) << RTC_CLR_MON1)
  233.                 | ((Day / 10) << RTC_CLR_DAY10)
  234.                 | ((Day % 10) << RTC_CLR_DAY1);
  235. //
  236. #else
  237.   RTC.CLR(0)
  238.      .YEAR10((Year % 100) / 10, false)
  239.      .YEAR1((Year % 100) % 10, false)
  240.      .MON10(Month / 10, false)
  241.      .MON1(Month % 10, false)
  242.      .DAY10(Day / 10, false)
  243.      .DAY1(Day % 10, false);
  244. #endif
  245.   rtc_t::Year = Year;
  246.   rtc_t::Month = Month;
  247.   rtc_t::Day = Day;
  248. }
  249. }
  250. void rtc_t::SetTime(uint32_t Hour, uint32_t Minute, uint32_t Second)
  251. {
  252. if (WriteEnable())
  253. {
  254. #if LOOK_H == 0
  255. /*
  256.   RTCs.TLR.Bits.HR10 = Hour / 10;
  257.   RTCs.TLR.Bits.HR1 = Hour % 10;
  258.   RTCs.TLR.Bits.MIN10 = Minute / 10;
  259.   RTCs.TLR.Bits.MIN1 = Minute % 10;
  260.   RTCs.TLR.Bits.SEC10 = Second / 10;
  261.   RTCs.TLR.Bits.SEC1 = Second % 10;
  262. */
  263. //
  264.   RTCs.TLR.Regs = ((Hour / 10) << RTC_TLR_HR10)
  265.                 | ((Hour % 10) << RTC_TLR_HR1)
  266.        | ((Minute / 10) << RTC_TLR_MIN10)
  267.                 | ((Minute % 10) << RTC_TLR_MIN1)
  268.        | ((Second / 10) << RTC_TLR_SEC10)
  269.                 | ((Second % 10) << RTC_TLR_SEC1);
  270. //
  271. #else
  272.   RTC.TLR(0)
  273.      .HR10(Hour / 10, false)
  274.      .HR1(Hour % 10, false)
  275.      .MIN10(Minute / 10, false)
  276.      .MIN1(Minute % 10, false)
  277.      .SEC10(Second / 10, false)
  278.      .SEC1(Second % 10, false);
  279. #endif
  280.   rtc_t::Hour = Hour;
  281.   rtc_t::Minute = Minute;
  282.   rtc_t::Second = Second;
  283. }
  284. }
  285. void rtc_t::GetCalender()
  286. {
  287. #if LOOK_H == 0
  288. Year = 2000 + RTCs.CLR.Bits.YEAR10 * 10 + RTCs.CLR.Bits.YEAR1;
  289. Month = RTCs.CLR.Bits.MON10 * 10 + RTCs.CLR.Bits.MON1;
  290. Day = RTCs.CLR.Bits.DAY10 * 10 + RTCs.CLR.Bits.DAY1;
  291. Hour = RTCs.TLR.Bits.HR10 * 10 + RTCs.TLR.Bits.HR1;
  292. Minute = RTCs.TLR.Bits.MIN10 * 10 + RTCs.TLR.Bits.MIN1;
  293. Second = RTCs.TLR.Bits.SEC10 * 10 + RTCs.TLR.Bits.SEC1;
  294. DayOfWeek = RTCs.DWR.Bits.DWR;
  295.   ClockDisplay = RTCs.TSSR.Bits.HR24;
  296. #else
  297.   #if LOOK_H == 1
  298. auto clr = RTC.CLR();
  299. Year = 2000 + clr.YEAR10 * 10 + clr.YEAR1;
  300. Month = clr.MON10 * 10 + clr.MON1;
  301. Day = clr.DAY10 * 10 + clr.DAY1;
  302. DayOfWeek = RTC.DWR().DWR;
  303. auto tlr = RTC.TLR();
  304. Hour = tlr.HR10 * 10 + tlr.HR1;
  305. Minute = tlr.MIN10 * 10 + tlr.MIN1;
  306. Second = tlr.SEC10 * 10 + tlr.SEC1;
  307.   ClockDisplay = RTC.TSSR().HR24;
  308.   #else
  309. RTC.CLR()
  310. .YEAR10.lambda([&Year](uint32_t y){Year = 2000 + y * 10; return y; })
  311. .YEAR1.lambda([&Year](uint32_t y){ Year += y; return y; })
  312. .MON10.lambda([&Month](uint32_t m){Month = m * 10; return m; })
  313. .MON1.lambda([&Month](uint32_t m){ Month += m; return m; })
  314. .DAY10.lambda([&Day](uint32_t d){Day = d * 10; return d; })
  315. .DAY1.lambda([&Day](uint32_t d){ Day += d; return d; });
  316. DayOfWeek = RTC.DWR().DWR;
  317. RTC.TLR()
  318. .HR10.lambda([&Hour](uint32_t h){Hour = h * 10; return h; })
  319. .HR1.lambda([&Hour](uint32_t h){ Hour += h; return h; })
  320. .MIN10.lambda([&Minute](uint32_t m){Minute = m * 10; return m; })
  321. .MIN1.lambda([&Minute](uint32_t m){ Minute += m; return m; })
  322. .SEC10.lambda([&Second](uint32_t s){Second = s * 10; return s; })
  323. .SEC1.lambda([&Second](uint32_t s){ Second += s; return s; });
  324.   ClockDisplay = RTC.TSSR().HR24;
  325.   #endif
  326. #endif
  327. }
  328. char* rtc_t::GetRTCString()
  329. {
  330. GetDateWeekString();
  331. GetTimeString();
  332. Buffers[14] = ' ';
  333. Buffers[15] = ' ';
  334. return &Buffers[0];
  335. }
  336. char* rtc_t::GetDateWeekString()
  337. {
  338. char *str;
  339. str = &Buffers[0];
  340. *str++ = (Year / 1000) + '0';
  341. *str++ = ((Year / 100) % 10) + '0';
  342. *str++ = ((Year / 10) % 10) + '0';
  343. *str++ = (Year % 10) + '0';
  344. *str++ = '.';
  345. *str++ = ((Month / 10) % 10) + '0';
  346. *str++ = (Month % 10) + '0';
  347. *str++ = '.';
  348. *str++ = ((Day / 10) % 10) + '0';
  349. *str++ = (Day % 10) + '0';
  350. *str++ = ' ';
  351. *str++ = '[';
  352. *str++ = (DayOfWeek % 10) + '0';
  353. *str++ = ']';
  354. *str++ = '\n';
  355. *str++ = 0;
  356. str = &Buffers[0];
  357. return str;
  358. }
  359. char* rtc_t::GetTimeString()
  360. {
  361. char *str;
  362. str = &Buffers[16];
  363. *str++ = ((Hour / 10) % 10) + '0';
  364. *str++ = (Hour % 10) + '0';
  365. *str++ = ':';
  366. *str++ = ((Minute / 10) % 10) + '0';
  367. *str++ = (Minute % 10) + '0';
  368. *str++ = ':';
  369. *str++ = ((Second / 10) % 10) + '0';
  370. *str++ = (Second % 10) + '0';
  371. *str++ = ' ';
  372. *str++ = '(';
  373. *str++ = (ClockDisplay & 1) + '0';
  374. *str++ = ')';
  375. *str++ = '\n';
  376. *str++ = 0;
  377. str = &Buffers[16];
  378. return str;
  379. }
  380. void rtc_t::OutSendSecond()
  381. {
  382. #if LOOK_H == 0
  383. GPIOAs.DMASK.Regs = ~0b111100;
  384. GPIOAs.DOUT.Regs =  (~Second) << 2;
  385. #else
  386. GPIOA.DMASK(-1)
  387.    .DMASK5(0)
  388.    .DMASK4(0)
  389.    .DMASK3(0)
  390.    .DMASK2(0);
  391. GPIOA.DOUT = (~Second) << 2;
  392. #endif
  393. }

  394. // rtc_t中断服务例程
  395. bool rtc_t::isr(int vector)
  396. {
  397. #if LOOK_H == 0
  398. RTCs.RIIR.Bits.TI = 1;
  399. #else
  400. RTC.RIIR().TI = 1;
  401. #endif
  402. return true;
  403. }
  404. void rtc_t::dsr(int vector, uintptr_t count)
  405. {
  406. GetCalender();
  407. sem.do_post();
  408. }
  409. rtc_t rtc;    // 创建rtc对象

  410. // uart0_t 类为应用层提供了简单的 uart 同步输出功能。
  411. class uart0_t : public interrupt_t {
  412. public:
  413. __INLINE__ uart0_t();
  414. void puts(const char* str);
  415. protected:
  416. bool isr(int vector);
  417. void dsr(int vector, uintptr_t count);
  418. private:
  419. void fillfifo(const char* str);
  420. private:
  421. const char* buffer;    // 输出缓冲区
  422. task_t* task;     // 正在输出的任务
  423. };
  424. // uart0 构造函数
  425. __INLINE__ uart0_t::uart0_t()
  426. {
  427. attach(UART0_IRQn);
  428. vector_t::enable(UART0_IRQn);
  429. #if LOOK_H == 0
  430. SYSs.IPRSTC2.Bits.UART0_RST = 1;
  431. SYSs.IPRSTC2.Bits.UART0_RST = 0;
  432. UART0s.FCR.Regs |= (1 << UART_FCR_TFR) | (1 << UART_FCR_RFR);
  433. UART0s.LCR.Regs = 3 << UART_LCR_WLS;      // 8bits
  434. UART0s.BAUD.Regs = (0x66 << UART_BAUD_BRD)
  435.       | (1 << UART_BAUD_DIV_X_ONE)
  436.       | (1 << UART_BAUD_DIV_X_EN);   // 115200
  437. #else
  438. SYS.IPRSTC2()
  439.     .UART0_RST(1);
  440. SYS.IPRSTC2()
  441.     .UART0_RST(0);
  442. UART0.FCR()
  443.       .TFR(1)
  444.    .RFR(1);
  445. UART0.LCR(0)
  446.       .WLS(3);      // 8bits
  447. UART0.BAUD(0)
  448.       .BRD(0x66)
  449.    .DIV_X_ONE(1)
  450.    .DIV_X_EN(1);   // 115200
  451. #endif
  452. }
  453. // uart0 输出
  454. void uart0_t::puts(const char* str)
  455. {
  456. fillfifo(str);     // 填充 fifo
  457. #if LOOK_H == 0
  458. UART0s.IER.Bits.THRE_IEN = 1; // 允许发送中断
  459. #else
  460. UART0.IER()
  461.       .THRE_IEN(1); // 允许发送中断
  462. #endif
  463. task = &scheduler.get_current_task();
  464. delay();      // 阻塞任务
  465. }
  466. // uart0 中断服务例程
  467. bool uart0_t::isr(int vector)
  468. {
  469. const char* str = buffer;
  470. if (str == 0) {      // 无数据
  471. #if LOOK_H == 0
  472.   UART0s.IER.Bits.THRE_IEN = 0; // 禁止发送中断
  473. #else
  474.   UART0.IER()
  475.        .THRE_IEN(0); // 禁止发送中断
  476. #endif
  477.   return true;
  478. }
  479. fillfifo(str);      // 填充 fifo
  480. return false;
  481. }
  482. // uart0 中断滞后服务例程
  483. // 所有数据发送完成后,dsr() 被调用
  484. void uart0_t::dsr(int vector, uintptr_t count)
  485. {
  486. task->do_wakeup();    // 唤醒任务
  487. }
  488. // uart0 填充 fifo
  489. void uart0_t::fillfifo(const char* str)
  490. {
  491. #if LOOK_H == 0
  492. do {
  493.   char ch;
  494.   ch = *str++;
  495.   if (ch == 0) {
  496.    str = 0;
  497.    break;
  498.   }
  499.   UART0s.DATA.Regs = ch;
  500. } while (!UART0s.FSR.Bits.TX_FULL);
  501. #else
  502. do {
  503.   char ch;
  504.   ch = *str++;
  505.   if (ch == 0) {
  506.    str = 0;
  507.    break;
  508.   }
  509.   UART0.DATA = ch;
  510. } while (!UART0.FSR().TX_FULL);
  511. #endif
  512. buffer = str;
  513. }
  514. uart0_t uart0;    // 创建 uart0 对象
  515. // 任务类 task_LOOK_RTC_t 的例程
  516. void task_LOOK_RTC_t::routine()
  517. {
  518. // TODO: 在此编写 task_LOOK_RTC_t 例程的内容
  519. uint_fast8_t n = 8;
  520. do {
  521.   if (rtc.Init())
  522.    break;
  523. } while (--n);
  524. // uart0.putchar(n + '0');
  525. if (n == 0) {
  526.   uart0.puts("rtc error\n");
  527.   while (true)
  528.    delay();
  529. }
  530. while (true) {
  531.   // TODO: 在此编写 task_LOOK_RTC_t 例程的内容
  532.   if (sem.wait())
  533.   {
  534.    uart0.puts(rtc.GetRTCString());//串口显示
  535.    rtc.OutSendSecond();//LED显示
  536.   }
  537. }
  538. }
  539. #ifdef LOOK_SCHEDULING_PRIORITY
  540. instantiate::task<task_LOOK_RTC_t, LOOK_STACK_SIZE> task_LOOK_RTC(0);
  541. #else
  542. instantiate::task<task_LOOK_RTC_t, LOOK_STACK_SIZE> task_LOOK_RTC;
  543. #endif

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
jutyy 发表于 2011-7-22 20:33 | 显示全部楼层
支持!
wang0225 发表于 2011-7-22 20:42 | 显示全部楼层
老鱼探戈 发表于 2011-7-22 20:43 | 显示全部楼层
板凳!
859419016 发表于 2011-7-22 22:20 | 显示全部楼层
:victory:
乡村男孩 发表于 2011-7-22 22:35 | 显示全部楼层
大叔精彩
stepme 发表于 2011-7-22 22:55 | 显示全部楼层
头回来
 楼主| hotpower 发表于 2011-7-23 10:22 | 显示全部楼层
现在look已经经历了gpio,iic,spi,pdma,uart,adc,rtc这些模块的考验通过。老师的头文件昨晚应该是俺最满意的!
zxs2000 发表于 2011-7-23 11:32 | 显示全部楼层
c51avr 发表于 2011-7-23 11:38 | 显示全部楼层
:victory:顶大叔啊
 楼主| hotpower 发表于 2011-7-25 00:01 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1460

主题

21617

帖子

508

粉丝
快速回复 在线客服 返回列表 返回顶部