rtc_isr.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #include "board.h"
  2. #include "tdc_tof.h"
  3. static rtc_run_t *pRtcRun;
  4. void rtc_init(rtc_run_t *rtc_run)
  5. {
  6. PeriClk_MutEnable(PeriClk_Rtc);
  7. M0P_RTC->CR0 = (1<<14) | // 0:PRDS; 1:PRDX;
  8. #ifdef RTC_INTERRUPT_TIME_5_S//add by yuewei 20260306
  9. (9<< 8) | // PRDX, 0:0.5s; 1:1s; 2:1.5s .... 63:32S
  10. #else
  11. (1<< 8) | // PRDX, 0:0.5s; 1:1s; 2:1.5s .... 63:32S
  12. #endif
  13. (0<< 7) | // start, 0:stop; 1:start;
  14. (0<< 6) | // HZ1SEL, 0:normal; 1:high precision
  15. (0<< 5) | // HZ1OE, 0:disable output 1Hz; 1:enable
  16. (1<< 3) | // AMPM, 0:12-hour; 1:24-hour;
  17. (0<< 0); // PRDS, 0:disable; 1:0.5s; 2:1s; 3:1m; 4:1h; 5:1d; 6:1m;
  18. M0P_RTC->CR1 = (0<< 8) | // 0,1:XTL; 2,3:RCL; 4:XTH=4M; 5:XTH=8M; 6:XTH=16M; 7:XTH=32M;
  19. (0<< 7) | // ALMEN, 0:disable alarm function; 1:enable
  20. (0<< 6); // ALMIE, 0:disable alarm interrupt; 1:enable
  21. pRtcRun = rtc_run;
  22. M0P_RTC->SEC = OctToBcd(rtc_run->second); // BCD
  23. M0P_RTC->MIN = OctToBcd(rtc_run->minute); // BCD
  24. M0P_RTC->HOUR = OctToBcd(rtc_run->hour); // BCD
  25. M0P_RTC->DAY = OctToBcd(rtc_run->day); // BCD
  26. M0P_RTC->WEEK = OctToBcd(rtc_run->week); // DEC 0~6
  27. M0P_RTC->MON = OctToBcd(rtc_run->month); // BCD
  28. M0P_RTC->YEAR = OctToBcd(rtc_run->year); // BCD
  29. M0P_RTC->CR0_f.START = 1;
  30. // enable interrupt at NVIC side
  31. IRQMutEnable(RTC_IRQn, NVIC_PRIO_0);
  32. }
  33. //add by yuewei 20260519
  34. /**
  35. * @brief 设置RTC:多少秒钟进入一次中断
  36. * @param time:0.5s, 1.0s, 1.5s, 2.0s...
  37. * @retval 无
  38. */
  39. void set_rtc_interrupt_time(float time)
  40. {
  41. uint8_t prdx_val = (uint8_t)(time * 2 - 1); // 公式:cycle = (prdx_val + 1) * 0.5s
  42. M0P_RTC->CR0 = (1<<14) | // 0:PRDS; 1:PRDX;
  43. (prdx_val << 8) | // PRDX, 0:0.5s; 1:1s; 2:1.5s .... 63:32S
  44. (1<< 7) | // start, 0:stop; 1:start;
  45. (0<< 6) | // HZ1SEL, 0:normal; 1:high precision
  46. (0<< 5) | // HZ1OE, 0:disable output 1Hz; 1:enable
  47. (1<< 3) | // AMPM, 0:12-hour; 1:24-hour;
  48. (0<< 0); // PRDS, 0:disable; 1:0.5s; 2:1s; 3:1m; 4:1h; 5:1d; 6:1m;
  49. }
  50. /**********************************************************************
  51. * 函数名:RTC_GetIrqSeconds
  52. * 功能 :
  53. * 返回 :
  54. **********************************************************************/
  55. /**
  56. * @brief 从 RTC->CR0 读取 PRDX 值,返回中断间隔秒数
  57. * @param 无
  58. * @retval float 类型,多少秒产生一次中断
  59. */
  60. float get_rtc_interrupt_time(void)
  61. {
  62. // 从 CR0 寄存器取出 [13:8] 位的 PRDX 值
  63. uint8_t prdx_val = (M0P_RTC->CR0 >> 8) & 0x3F; // 0x3F = 6位掩码
  64. // 按规则计算秒数
  65. float seconds = (prdx_val + 1) * 0.5f;
  66. return seconds;
  67. }
  68. void update_rtc_run(void)
  69. {
  70. rtc_run_t *rr = pRtcRun;
  71. if (rr->second != BcdToOct(M0P_RTC->SEC)) {
  72. rr->flag_1s = 1;
  73. rr->second = BcdToOct(M0P_RTC->SEC);
  74. }
  75. if (rr->minute != BcdToOct(M0P_RTC->MIN)) {
  76. rr->flag_1m = 1;
  77. rr->minute = BcdToOct(M0P_RTC->MIN);
  78. }
  79. rr->hour = BcdToOct(M0P_RTC->HOUR);
  80. rr->day = BcdToOct(M0P_RTC->DAY);
  81. rr->month = BcdToOct(M0P_RTC->MON);
  82. rr->year = BcdToOct(M0P_RTC->YEAR);
  83. rr->week = BcdToOct(M0P_RTC->WEEK);
  84. }
  85. void set_rtc_date(uint8_t year, uint8_t month, uint8_t day) {
  86. M0P_RTC->YEAR = year;
  87. M0P_RTC->MON = month;
  88. M0P_RTC->DAY = day;
  89. }
  90. void get_rtc_date(uint8_t *year, uint8_t *month, uint8_t *day) {
  91. *year = M0P_RTC->YEAR;
  92. *month = M0P_RTC->MON;
  93. *day = M0P_RTC->DAY;
  94. }
  95. void set_rtc_time(uint8_t hour, uint8_t min, uint8_t sec) {
  96. M0P_RTC->HOUR = hour;
  97. M0P_RTC->MIN = min;
  98. M0P_RTC->SEC = sec;
  99. }
  100. void get_rtc_time(uint8_t *hour, uint8_t *min, uint8_t *sec) {
  101. *hour = M0P_RTC->HOUR;
  102. *min = M0P_RTC->MIN;
  103. *sec = M0P_RTC->SEC;
  104. }
  105. uint32_t RTC_CntInt;
  106. uint32_t get_rtc_cnt_int(void) {
  107. return RTC_CntInt;
  108. }
  109. void set_rtc_cnt_int(uint32_t cnt_int) {
  110. RTC_CntInt = cnt_int;
  111. }
  112. static uint32_t TdcRwErrCnt = 0;
  113. uint32_t get_tdc_rw_err_cnt(void) {
  114. return TdcRwErrCnt;
  115. }
  116. uint32_t GetChIdx(uint32_t cnt) {
  117. if (pTdcItf->ch_num == 1) {
  118. return 0;
  119. } else if (pTdcItf->ch_num == 2) {
  120. return (cnt & 0x00000001);
  121. } else if (pTdcItf->ch_num == 4) {
  122. return (cnt & 0x00000003);
  123. }
  124. return 0;
  125. }
  126. static uint32_t MUX_SwitchInt = 0;
  127. void RTC_IRQHandler(void)
  128. {
  129. uint32_t ISR;
  130. ISR = M0P_RTC->CR1;
  131. M0P_RTC->CR1 = ISR & (~0x18u);
  132. //if(NB_RUN_UPDATE_FLAG == 1)return; //2026-4-8 wuxiaolin
  133. //add by yuewei 20260309 to deal hongwai long data
  134. if(HONGWAI_LONG_RX_FLAG == 1)return;
  135. //LOG("---------------------------------0\n");
  136. //return;
  137. //us_delay(2000);//!!!!!do not modify!!!!!
  138. //rt_thread_delay(5);//!!!!!do not modify!!!!!
  139. // get_internal_time();
  140. if (ISR & 0x08u)
  141. {
  142. rt_sem_release(&rtc_isr_sem);
  143. }
  144. }
  145. void rtc_interrupt_deal_tdc(void)
  146. {
  147. uint32_t Tu32;
  148. update_rtc_run();
  149. if (tof_state&(TOF_ST_METER | TOF_ST_CALIB | TOF_ST_VOID))
  150. {
  151. if (pTdcItf->mux_switch && ((RTC_CntInt & 0x00000001u) == 0) && pTdcItf->ch_num > 1)
  152. {
  153. uint32_t idx = GetChIdx(MUX_SwitchInt);
  154. set_mux_ch(pTdcItf->mux_ch_no[idx]);
  155. MUX_SwitchInt++;
  156. us_delay(50);
  157. }
  158. //LOG("---------------------------------1\n");
  159. RTC_CntInt++;
  160. }
  161. if (pTdcItf->blank_flag == pTdcItf->ch_bit_map)
  162. {
  163. if (tof_state&TOF_ST_METER)
  164. {
  165. tof_state = TOF_ST_VOID;
  166. }
  167. }
  168. else
  169. {
  170. if (tof_state&TOF_ST_VOID)
  171. {
  172. tof_state = TOF_ST_METER;
  173. }
  174. }
  175. if ((tof_state&(TOF_ST_METER|TOF_ST_CALIB)) || (tof_state&TOF_ST_VOID))
  176. {
  177. tof_flag &= ~TOF_FLAG_BLANK_PIPE;
  178. if (TdcIntStep!=0xFFu)
  179. {
  180. tof_flag |= TOF_FLAG_TDC_FAULT;
  181. }
  182. TdcIntStep = 0;
  183. Tu32 = (RTC_CntInt&0x00000001u) ? TDC_CFG_FIRE_DOWN : TDC_CFG_FIRE_UP;
  184. tdc_start_tof(TDC_CFG_DO_CKENA | TDC_CFG_DO_CKDIS | TDC_CFG_DO_WREG | Tu32);
  185. //LOG("---------------------------------2\n");
  186. }
  187. }