| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #include "board.h"
- #include "tdc_tof.h"
- static rtc_run_t *pRtcRun;
- void rtc_init(rtc_run_t *rtc_run)
- {
- PeriClk_MutEnable(PeriClk_Rtc);
- M0P_RTC->CR0 = (1<<14) | // 0:PRDS; 1:PRDX;
- #ifdef RTC_INTERRUPT_TIME_5_S//add by yuewei 20260306
- (9<< 8) | // PRDX, 0:0.5s; 1:1s; 2:1.5s .... 63:32S
- #else
- (1<< 8) | // PRDX, 0:0.5s; 1:1s; 2:1.5s .... 63:32S
- #endif
- (0<< 7) | // start, 0:stop; 1:start;
- (0<< 6) | // HZ1SEL, 0:normal; 1:high precision
- (0<< 5) | // HZ1OE, 0:disable output 1Hz; 1:enable
- (1<< 3) | // AMPM, 0:12-hour; 1:24-hour;
- (0<< 0); // PRDS, 0:disable; 1:0.5s; 2:1s; 3:1m; 4:1h; 5:1d; 6:1m;
- M0P_RTC->CR1 = (0<< 8) | // 0,1:XTL; 2,3:RCL; 4:XTH=4M; 5:XTH=8M; 6:XTH=16M; 7:XTH=32M;
- (0<< 7) | // ALMEN, 0:disable alarm function; 1:enable
- (0<< 6); // ALMIE, 0:disable alarm interrupt; 1:enable
- pRtcRun = rtc_run;
- M0P_RTC->SEC = OctToBcd(rtc_run->second); // BCD
- M0P_RTC->MIN = OctToBcd(rtc_run->minute); // BCD
- M0P_RTC->HOUR = OctToBcd(rtc_run->hour); // BCD
- M0P_RTC->DAY = OctToBcd(rtc_run->day); // BCD
- M0P_RTC->WEEK = OctToBcd(rtc_run->week); // DEC 0~6
- M0P_RTC->MON = OctToBcd(rtc_run->month); // BCD
- M0P_RTC->YEAR = OctToBcd(rtc_run->year); // BCD
- M0P_RTC->CR0_f.START = 1;
- // enable interrupt at NVIC side
- IRQMutEnable(RTC_IRQn, NVIC_PRIO_0);
- }
- //add by yuewei 20260519
- /**
- * @brief 设置RTC:多少秒钟进入一次中断
- * @param time:0.5s, 1.0s, 1.5s, 2.0s...
- * @retval 无
- */
- void set_rtc_interrupt_time(float time)
- {
- uint8_t prdx_val = (uint8_t)(time * 2 - 1); // 公式:cycle = (prdx_val + 1) * 0.5s
- M0P_RTC->CR0 = (1<<14) | // 0:PRDS; 1:PRDX;
- (prdx_val << 8) | // PRDX, 0:0.5s; 1:1s; 2:1.5s .... 63:32S
- (1<< 7) | // start, 0:stop; 1:start;
- (0<< 6) | // HZ1SEL, 0:normal; 1:high precision
- (0<< 5) | // HZ1OE, 0:disable output 1Hz; 1:enable
- (1<< 3) | // AMPM, 0:12-hour; 1:24-hour;
- (0<< 0); // PRDS, 0:disable; 1:0.5s; 2:1s; 3:1m; 4:1h; 5:1d; 6:1m;
- }
- /**********************************************************************
- * 函数名:RTC_GetIrqSeconds
- * 功能 :
- * 返回 :
- **********************************************************************/
- /**
- * @brief 从 RTC->CR0 读取 PRDX 值,返回中断间隔秒数
- * @param 无
- * @retval float 类型,多少秒产生一次中断
- */
- float get_rtc_interrupt_time(void)
- {
- // 从 CR0 寄存器取出 [13:8] 位的 PRDX 值
- uint8_t prdx_val = (M0P_RTC->CR0 >> 8) & 0x3F; // 0x3F = 6位掩码
-
- // 按规则计算秒数
- float seconds = (prdx_val + 1) * 0.5f;
-
- return seconds;
- }
- void update_rtc_run(void)
- {
- rtc_run_t *rr = pRtcRun;
- if (rr->second != BcdToOct(M0P_RTC->SEC)) {
- rr->flag_1s = 1;
- rr->second = BcdToOct(M0P_RTC->SEC);
- }
- if (rr->minute != BcdToOct(M0P_RTC->MIN)) {
- rr->flag_1m = 1;
- rr->minute = BcdToOct(M0P_RTC->MIN);
- }
- rr->hour = BcdToOct(M0P_RTC->HOUR);
- rr->day = BcdToOct(M0P_RTC->DAY);
- rr->month = BcdToOct(M0P_RTC->MON);
- rr->year = BcdToOct(M0P_RTC->YEAR);
- rr->week = BcdToOct(M0P_RTC->WEEK);
- }
- void set_rtc_date(uint8_t year, uint8_t month, uint8_t day) {
- M0P_RTC->YEAR = year;
- M0P_RTC->MON = month;
- M0P_RTC->DAY = day;
- }
- void get_rtc_date(uint8_t *year, uint8_t *month, uint8_t *day) {
- *year = M0P_RTC->YEAR;
- *month = M0P_RTC->MON;
- *day = M0P_RTC->DAY;
- }
- void set_rtc_time(uint8_t hour, uint8_t min, uint8_t sec) {
- M0P_RTC->HOUR = hour;
- M0P_RTC->MIN = min;
- M0P_RTC->SEC = sec;
- }
- void get_rtc_time(uint8_t *hour, uint8_t *min, uint8_t *sec) {
- *hour = M0P_RTC->HOUR;
- *min = M0P_RTC->MIN;
- *sec = M0P_RTC->SEC;
- }
- uint32_t RTC_CntInt;
- uint32_t get_rtc_cnt_int(void) {
- return RTC_CntInt;
- }
- void set_rtc_cnt_int(uint32_t cnt_int) {
- RTC_CntInt = cnt_int;
- }
- static uint32_t TdcRwErrCnt = 0;
- uint32_t get_tdc_rw_err_cnt(void) {
- return TdcRwErrCnt;
- }
- uint32_t GetChIdx(uint32_t cnt) {
- if (pTdcItf->ch_num == 1) {
- return 0;
- } else if (pTdcItf->ch_num == 2) {
- return (cnt & 0x00000001);
- } else if (pTdcItf->ch_num == 4) {
- return (cnt & 0x00000003);
- }
- return 0;
- }
- static uint32_t MUX_SwitchInt = 0;
- void RTC_IRQHandler(void)
- {
- uint32_t ISR;
-
- ISR = M0P_RTC->CR1;
- M0P_RTC->CR1 = ISR & (~0x18u);
- //if(NB_RUN_UPDATE_FLAG == 1)return; //2026-4-8 wuxiaolin
- //add by yuewei 20260309 to deal hongwai long data
- if(HONGWAI_LONG_RX_FLAG == 1)return;
- //LOG("---------------------------------0\n");
- //return;
- //us_delay(2000);//!!!!!do not modify!!!!!
- //rt_thread_delay(5);//!!!!!do not modify!!!!!
-
- // get_internal_time();
- if (ISR & 0x08u)
- {
- rt_sem_release(&rtc_isr_sem);
- }
- }
- void rtc_interrupt_deal_tdc(void)
- {
- uint32_t Tu32;
-
- update_rtc_run();
- if (tof_state&(TOF_ST_METER | TOF_ST_CALIB | TOF_ST_VOID))
- {
- if (pTdcItf->mux_switch && ((RTC_CntInt & 0x00000001u) == 0) && pTdcItf->ch_num > 1)
- {
- uint32_t idx = GetChIdx(MUX_SwitchInt);
- set_mux_ch(pTdcItf->mux_ch_no[idx]);
- MUX_SwitchInt++;
- us_delay(50);
- }
- //LOG("---------------------------------1\n");
- RTC_CntInt++;
- }
- if (pTdcItf->blank_flag == pTdcItf->ch_bit_map)
- {
- if (tof_state&TOF_ST_METER)
- {
- tof_state = TOF_ST_VOID;
- }
- }
- else
- {
- if (tof_state&TOF_ST_VOID)
- {
- tof_state = TOF_ST_METER;
- }
- }
- if ((tof_state&(TOF_ST_METER|TOF_ST_CALIB)) || (tof_state&TOF_ST_VOID))
- {
- tof_flag &= ~TOF_FLAG_BLANK_PIPE;
- if (TdcIntStep!=0xFFu)
- {
- tof_flag |= TOF_FLAG_TDC_FAULT;
- }
- TdcIntStep = 0;
- Tu32 = (RTC_CntInt&0x00000001u) ? TDC_CFG_FIRE_DOWN : TDC_CFG_FIRE_UP;
- tdc_start_tof(TDC_CFG_DO_CKENA | TDC_CFG_DO_CKDIS | TDC_CFG_DO_WREG | Tu32);
-
-
- //LOG("---------------------------------2\n");
- }
- }
|