#include "wirless_uwb_app.h" #define MAXSEARCHSYNCTIMES 300 E_RangProc rangproc; static u16 current_count,start_count,end_count,poll_startcount; static u16 lpcount,last_lpcount; static u16 waketopolltimeus = 3200; #define BASENUM_COMTIME 244 static u32 last_anchor_time; static int32_t error_time; static u32 temptime,delaytime,expect_anctime; static int16_t poll_offsettime=-6900,clockoffset1S; int16_t target_offsettime = 850; static u16 searchsync_times; static u16 stime_time,syncbase_ms,range_ms,stime_lp_difftime;//ͬ²½ÏµÍ³Ê±¼äºÁÃë ΢Ãͬ²½»ùվʱ¼ä£¬²â¾àʱ¼ä¡£ void CalibClockOffset(int16_t clockerror) { if(clockerror<2000&&error_time>-2000) clockoffset1S+=clockerror*0.1; } void SetWkupTimeBaseNow(u16 current_lpcount,u32 delaytime) //Ï´λ½ÐÑʱ¼äºÍµ±Ç°Ê±¼äµÄ²îÖµ¡£ { //tagslotpos = 0; //CalibClockOffset(error_time); delaytime += poll_offsettime+clockoffset1S*delaytime/1000000; lpcount = current_lpcount+delaytime/LPTIMER_LSB; if(lpcount>=32768) { lpcount -=32768; } poll_startcount = lpcount+105;//105=(3200)/LPTIMER_LSB; if(poll_startcount>=32768) { poll_startcount -=32768; } __HAL_LPTIM_COMPARE_SET(&hlptim1, lpcount); last_lpcount = lpcount; return ; } void SetWkupTimeBaseLast(u32 delaytime) //ÏÂÒ»´ÎµÄ»½ÐÑʱ¼ä±ÈÉÏÒ»´ÎµÄ»½ÐÑʱ¼ä²î¶àÉÙ£¬Èç¹ûÊÇ0»òÕßÊÇ1000msÔò²»Óõ÷Óᣠ{ lpcount = last_lpcount+delaytime/LPTIMER_LSB; if(lpcount>=32768) { lpcount -=32768; } poll_startcount = lpcount+105;//105=(3200)/LPTIMER_LSB; if(poll_startcount>=32768) { poll_startcount -=32768; } __HAL_LPTIM_COMPARE_SET(&hlptim1, lpcount); last_lpcount = lpcount; } void WkupUWB(void) { u32 id; u8 error_times; SPIx_CS_GPIO->BRR = SPIx_CS; delay_us(700); SPIx_CS_GPIO->BSRR = SPIx_CS; id = dwt_readdevid() ; while (DWT_DEVICE_ID != id) { id = dwt_readdevid() ; IdleTask(); if(error_times++>20) { printf("DW ID ERROR.\r\n"); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } } } void WaitUntilTargetTime(void) { current_count=HAL_LPTIM_ReadCounter(&hlptim1); while(current_countpoll_startcount+16384) { current_count=HAL_LPTIM_ReadCounter(&hlptim1); if(current_countMAXSEARCHSYNCTIMES) { } } void WaitSyncProc(void) //Õý³£Í¬²½ { WkupUWB(); WaitUntilTargetTime(); dwt_setrxtimeout(1000);//½ÓÊÕ10msÊý¾Ý dwt_rxenable(0);//´ò¿ª½ÓÊÕ while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//²»¶Ï²éѯоƬ״ֱ̬µ½³É¹¦½ÓÊÕ»òÕß·¢Éú´íÎó {} if(status_reg & SYS_STATUS_RXFCG) { dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//Çå³ý±ê־λ frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//»ñµÃ½ÓÊÕÊý¾Ý³¤¶È dwt_readrxdata(rx_buffer, frame_len, 0);//¶ÁÈ¡½ÓÊÕÊý¾Ý }else{ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); } } u32 DelayBetweenTimes(u32 target_time,u32 current_time) { int32_t temp_time; temp_time = target_time-current_time; while(temp_time>1000000) { temp_time -= 1000000; } while(temp_time<=0) { temp_time += 1000000; } return temp_time; } void NealPoll(void) { } void RangingProc(void) { u32 current_lptime; current_lptime = HAL_LPTIM_ReadCounter(&hlptim1)*LPTIMER_LSB; //µÍ¹¦ºÄʱÖÓ»»Ëãʱ¼ä stime_time = current_lptime + stime_lp_difftime; //ͬ²½Ê±¼ä if(DelayBetweenTimes(syncbase_ms*1000,stime_time)>DelayBetweenTimes(range_ms*1000,stime_time)) { rangproc = RANGPROC_NEARPOLL; }else{ rangproc = RANGPROC_WAITSYNC; } }