From d67d922c6345042cb3dfaedd621a2120fe808b70 Mon Sep 17 00:00:00 2001
From: yincheng.zhong <634916154@qq.com>
Date: 星期五, 08 三月 2024 10:21:12 +0800
Subject: [PATCH] v1.9 增加蜂鸣,测试1标签对10基站稳定

---
 Src/application/dw_app.c |  662 ++++--------------------------------------------------
 1 files changed, 59 insertions(+), 603 deletions(-)

diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c
index 560a5e4..9c7f9cb 100644
--- a/Src/application/dw_app.c
+++ b/Src/application/dw_app.c
@@ -3,7 +3,7 @@
  *  @file    main.c
  *  @brief   Double-sided two-way ranging (DS TWR) initiator example code
  *
- *         
+ *
  *
  * @attention
  *
@@ -44,23 +44,23 @@
  * 1 uus = 512 / 499.2 祍 and 1 祍 = 499.2 * 128 dtu. */
 #define UUS_TO_DWT_TIME 65536
 
-/* Delay between frames, in UWB microseconds. See NOTE 4 below. */
-/* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */
-#define POLL_TX_TO_RESP_RX_DLY_UUS 150
-/* This is the delay from Frame RX timestamp to TX reply timestamp used for calculating/setting the DW1000's delayed TX function. This includes the
- * frame length of approximately 2.66 ms with above configuration. */
-#define RESP_RX_TO_FINAL_TX_DLY_UUS 410
+///* Delay between frames, in UWB microseconds. See NOTE 4 below. */
+///* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */
+//#define POLL_TX_TO_RESP_RX_DLY_UUS 150
+///* This is the delay from Frame RX timestamp to TX reply timestamp used for calculating/setting the DW1000's delayed TX function. This includes the
+// * frame length of approximately 2.66 ms with above configuration. */
+//#define RESP_RX_TO_FINAL_TX_DLY_UUS 410
 
-/* Receive response timeout. See NOTE 5 below. */
-#define RESP_RX_TIMEOUT_UUS 600
+///* Receive response timeout. See NOTE 5 below. */
+//#define RESP_RX_TIMEOUT_UUS 600
 
-#define DELAY_BETWEEN_TWO_FRAME_UUS 400
+//#define DELAY_BETWEEN_TWO_FRAME_UUS 400
 
-#define POLL_RX_TO_RESP_TX_DLY_UUS 470
-/* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */
-#define RESP_TX_TO_FINAL_RX_DLY_UUS 200
-/* Receive final timeout. See NOTE 5 below. */
-#define FINAL_RX_TIMEOUT_UUS 4300
+////#define POLL_RX_TO_RESP_TX_DLY_UUS 470
+///* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */
+//#define RESP_TX_TO_FINAL_RX_DLY_UUS 200
+///* Receive final timeout. See NOTE 5 below. */
+//#define FINAL_RX_TIMEOUT_UUS 4300
 
 
 #define SPEED_OF_LIGHT 299702547
@@ -71,141 +71,54 @@
 #define FINAL_MSG_FINAL_TX_TS_IDX 18
 #define FINAL_MSG_TS_LEN 4
 
+//#define _UWB_4G
 
-enum enumtagstate
-{
-	DISCPOLL,
-	GETNEARMSG,
-	NEARPOLL,
-}tag_state=NEARPOLL;
 static dwt_config_t config = {
-	5,               /* Channel number. */
-	DWT_PRF_64M,     /* Pulse repetition frequency. */
-	DWT_PLEN_128,    /* Preamble length. */
-	DWT_PAC8,        /* Preamble acquisition chunk size. Used in RX only. */
-	9,               /* TX preamble code. Used in TX only. */
-	9,               /* RX preamble code. Used in RX only. */
-	1,               /* Use non-standard SFD (Boolean) */
-	DWT_BR_6M8,      /* Data rate. */
-	DWT_PHRMODE_STD, /* PHY header mode. */
-	(129 + 8 - 8)    /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
+#ifdef _UWB_4G
+    2,               /* Channel number. */
+#else
+    5,
+#endif
+    DWT_PRF_64M,     /* Pulse repetition frequency. */
+    DWT_PLEN_128,    /* Preamble length. */
+    DWT_PAC8,        /* Preamble acquisition chunk size. Used in RX only. */
+    9,               /* TX preamble code. Used in TX only. */
+    9,               /* RX preamble code. Used in RX only. */
+    1,               /* Use non-standard SFD (Boolean) */
+    DWT_BR_6M8,      /* Data rate. */
+    DWT_PHRMODE_STD, /* PHY header mode. */
+    (129 + 8 - 8)    /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
 };
-static uint8_t tx_poll_msg[20] = {0};
-static uint8_t tx_sync_msg[14] = {0};
-static uint8_t tx_final_msg[60] = {0};
-static uint8_t tx_resp_msg[22] = {0};
- uint8_t tx_near_msg[80] = {0};
 
-static uint32_t frame_seq_nb = 0;	
-static uint32_t status_reg = 0;
-static uint8_t rx_buffer[100];
-static uint64_t poll_tx_ts;
-static uint64_t resp_rx_ts;
-static uint64_t final_tx_ts;
-static uint64_t poll_rx_ts;
-static uint64_t resp_tx_ts;
-static uint64_t final_rx_ts;
-static double tof;
-int32_t anchor_dist_last_frm[TAG_NUM_IN_SYS],his_dist[TAG_NUM_IN_SYS];	;	
-uint32_t tag_id = 0;
-uint32_t tag_id_recv = 0;
-uint32_t anc_id_recv = 0;
-uint8_t random_delay_tim = 0;
-double distance, dist_no_bias, dist_cm;
-uint32_t g_UWB_com_interval = 0; 
-float dis_after_filter;				//当前距离值
-LPFilter_Frac* p_Dis_Filter;		//测距用的低通滤波器
-
-
-
-static uint64_t get_tx_timestamp_u64(void)
-{
-    uint8_t ts_tab[5];
-    uint64_t ts = 0;
-    int i;
-    dwt_readtxtimestamp(ts_tab);
-    for (i = 4; i >= 0; i--)
-    {
-        ts <<= 8;
-        ts |= ts_tab[i];
-    }
-    return ts;
-}
-
-static uint64_t get_rx_timestamp_u64(void)
-{
-    uint8_t ts_tab[5];
-    uint64_t ts = 0;
-    int i;
-    dwt_readrxtimestamp(ts_tab);
-    for (i = 4; i >= 0; i--)
-    {
-        ts <<= 8;
-        ts |= ts_tab[i];
-    }
-    return ts;
-}
-
-static void final_msg_set_ts(uint8_t *ts_field, uint64_t ts)
-{
-    int i;
-    for (i = 0; i < FINAL_MSG_TS_LEN; i++)
-    {
-        ts_field[i] = (uint8_t) ts;
-        ts >>= 8;
-    }
-}
-
-static void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts)
-{
-    int i;
-    *ts = 0;
-    for (i = 0; i < FINAL_MSG_TS_LEN; i++)
-    {
-        *ts += ts_field[i] << (i * 8);
-    }
-}
-
+uint32_t uwbid=0;
 void Dw1000_Init(void)
 {
-	/* Reset and initialise DW1000.
+    /* Reset and initialise DW1000.
      * For initialisation, DW1000 clocks must be temporarily set to crystal speed. After initialisation SPI rate can be increased for optimum
      * performance. */
     Reset_DW1000();//重启DW1000 /* Target specific drive of RSTn line into DW1000 low for a period. */
-	Spi_ChangePrescaler(SPIx_PRESCALER_SLOW);	//设置为快速模式
+    Spi_ChangePrescaler(SPIx_PRESCALER_SLOW);	//设置为快速模式
     dwt_initialise(DWT_LOADUCODE);//初始化DW1000
-	Spi_ChangePrescaler(SPIx_PRESCALER_FAST);	//设置为快速模式
+    Spi_ChangePrescaler(SPIx_PRESCALER_FAST);	//设置为快速模式
 
     /* Configure DW1000. See NOTE 6 below. */
     dwt_configure(&config);//配置DW1000
-	
 
-	
+//	 dwt_setinterrupt(  DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+
+
     /* Apply default antenna delay value. See NOTE 1 below. */
     dwt_setrxantennadelay(RX_ANT_DLY);		//设置接收天线延迟
     dwt_settxantennadelay(TX_ANT_DLY);		//设置发射天线延迟
 
+//    dwt_setrxtimeout(1000);//设定接收超时时间,0位没有超时时间
+//	dwt_rxenable(0);//打开接收
+//    uwbid=dwt_readdevid();
     /* Set expected response's delay and timeout. See NOTE 4 and 5 below.
      * As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */
-				//设置接收超时时间
+    //设置接收超时时间
 }
-void Dw1000_App_Init(void)
-{
-//g_com_map[DEV_ID] = 0x0b;
-	//tag_state=DISCPOLL;
-	tx_poll_msg[MESSAGE_TYPE_IDX]=POLL;
-	tx_resp_msg[MESSAGE_TYPE_IDX]=RESPONSE;
-	tx_final_msg[MESSAGE_TYPE_IDX]=FINAL;
-	tx_sync_msg[MESSAGE_TYPE_IDX]=SYNC;
-	
-	memcpy(&tx_poll_msg[TAG_ID_IDX], &dev_id, 2);
-	memcpy(&tx_final_msg[TAG_ID_IDX], &dev_id, 2);
-	memcpy(&tx_resp_msg[ANCHOR_ID_IDX], &dev_id, 2);
-	memcpy(&tx_sync_msg[ANCHOR_ID_IDX], &dev_id, 2);
-	memcpy(&tx_near_msg[ANCHOR_ID_IDX], &dev_id, 2);
-	memcpy(&tx_near_msg[TAG_ID_IDX], &dev_id, 2);
-}	
-uint16_t Checksum_u16(uint8_t* pdata, uint32_t len) 
+uint16_t Checksum_u16(uint8_t* pdata, uint32_t len)
 {
     uint16_t sum = 0;
     uint32_t i;
@@ -216,487 +129,30 @@
 }
 
 u16 tag_time_recv[TAG_NUM_IN_SYS];
-u8 usart_send[25];
+u8 usart_send[100];
 u8 battary,button;
 extern uint8_t g_pairstart;
 void tag_sleep_configuraion(void)
 {
-	dwt_configuresleep(0x940, 0x7);
-	dwt_entersleep();
-}
-extern uint8_t g_start_send_flag;
-
-uint16_t g_Resttimer;
-uint8_t result;
-u8 tag_succ_times=0;
-int32_t hex_dist;
-u16 checksum;
-int8_t tag_delaytime;
-extern uint16_t sync_timer;
-u16 tmp_time;
-int32_t temp_dist;
-u16 tagslotpos;
-
-u16 anclist_num=0,anclist_pos; //list 总数量和当前位置
-u16 ancid_list[TAG_NUM_IN_SYS];
-u8 nearbase_num;
-u16 mainbase_id;
-int32_t mainbase_dist;
-uint8_t trygetnearmsg_times;
-u16 nearbaseid_list[MAX_NEARBASE_NUM],mainbase_id,true_nearbase_idlist[MAX_NEARBASE_NUM];
-u8 FindNearBasePos(u16 baseid)
-{
-	u8 i;
-	for(i=0;i<nearbase_num;i++)
-	{
-		if(baseid==nearbaseid_list[i])
-			return i;
-	}
-}
-u8 recbase_num=0;
-#define CHANGE_BASE_THRESHOLD  5
-uint8_t GetRandomValue(void)
-{
-	uint8_t random_value=0,temp_adc,i;
-	for(i=0;i<8;i++)
-	{
-		temp_adc=Get_ADC_Value();
-		random_value=random_value|((temp_adc&0x01)<<i);
-	}
-	return random_value;
-}
-u8 GetRandomSlotPos(uint32_t emptyslot)
-{
-	u8 i,temp_value;
-	temp_value = HAL_LPTIM_ReadCounter(&hlptim1);//GetRandomValue();
-	for(i=temp_value%32;i<max_slotpos;i++)
-	{
-		if(((emptyslot>>i)&0x1)==0)
-		{
-			return i;
-		}
-	}
-	
-		for(i=1;i<max_slotpos;i++)
-	{
-		if(((emptyslot>>i)&0x1)==0)
-		{
-			return i;
-		}
-	}
-return max_slotpos-1;
-}
-
-int32_t mainbase_dist,nearbase_distlist[MAX_NEARBASE_NUM],true_nearbase_distlist[MAX_NEARBASE_NUM],true_exsistbase_list[MAX_NEARBASE_NUM],ancsync_time,nextpoll_delaytime,offsettimeus;
-u8 anclost_times=0 , mainbase_lost_count=0;
-u8 exsistbase_list[MAX_NEARBASE_NUM],report_num,get_newbase=0;
-u8 flag_finalsend,flag_getresponse,flag_rxon;
-uint16_t current_count,start_count,end_count,lastsync_timer;
-
-u8 nearbase_num=0,last_nearbase_num,next_nearbase_num,last_slotnum, para_update,para_len,stationary_flag=0;
-u32 rec_tagpos_binary;
-int16_t offset=2700;
-u8 motor_state,rec_remotepara_state,rec_remotepara[80];
-extern u16 last_lpcount;
-void NearPoll(void)
-{
-	
-	uint32_t temp1,temp2,dw_systime;
-	uint32_t frame_len;
-	uint32_t final_tx_time;
-	u32 start_poll;
-	u8 i,j,getsync_flag=0,timeout,flag_ancreadpara=0;
-    dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);			//设置发送后开启接收,并设定延迟时间
-    dwt_setrxtimeout(10000);		
-	tag_succ_times = 0;
-		//GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);
-	if(next_nearbase_num>=MAX_NEARBASE_NUM)
-	{
-		next_nearbase_num = MAX_NEARBASE_NUM-1;
-	}
-	HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_SET);
-	last_nearbase_num=next_nearbase_num;
-	nearbase_num=next_nearbase_num;
-	recbase_num=0;
-//	motor_state=0;
-	tx_near_msg[GROUP_ID_IDX] = group_id;
-	tx_near_msg[BATTARY_IDX] = bat_percent;
-	tx_near_msg[BUTTON_IDX] = !GET_USERKEY|stationary_flag<<1;
-	tx_near_msg[SEQUENCE_IDX] = frame_seq_nb++;
-	tx_near_msg[NEARBASENUM_INDEX] = nearbase_num;
-	memcpy(&tx_near_msg[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2);
-	tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_POLL;	
-	memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2);	
-	dwt_writetxdata(13+2*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
-	dwt_writetxfctrl(13+2*nearbase_num, 0);//设置超宽带发送数据长度
-	dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置
-	
-	tx_near_msg[TAGCONFIGSUCCESS_INDEX] =0;
-	para_update = 0;
-	flag_finalsend=0;
-	flag_rxon=1;
-	flag_getresponse=0;
-	start_count=HAL_LPTIM_ReadCounter(&hlptim1);
-	recbase_num=0;
-	timeout=nearbase_num*SLOT_SCALE+4;
-	end_count=start_count+(timeout<<5);
-	if(end_count>=32768)
-	{end_count-=32768;}
-	mainbase_dist=100000;
-	mainbase_lost_count++;
-	current_count=HAL_LPTIM_ReadCounter(&hlptim1);
-			while(current_count<end_count||current_count>end_count+15000)
-			{
-				current_count=HAL_LPTIM_ReadCounter(&hlptim1);
-					while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误
-					{
-						if(flag_finalsend)
-						{
-							dw_systime=dwt_readsystimestamphi32();
-							if(dw_systime>temp1&&dw_systime<temp2)
-							{
-								
-								dwt_forcetrxoff();
-								flag_rxon=0;
-                                if(flag_ancreadpara)
-                                {
-                                    u16 calCRC;
-                                  tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_PRAAREPLY;  
-                                  memcpy(&tx_near_msg[MESSAGE_PARAREPLY_IDX],g_com_map,SENDANCPARA_LEN);
-                                  calCRC = CRC_Compute((uint8_t*)g_com_map,SENDANCPARA_LEN);
-                                  memcpy(&tx_near_msg[MESSAGE_PARAREPLY_IDX+SENDANCPARA_LEN],&calCRC,2);
-                                  dwt_writetxdata(14+SENDANCPARA_LEN, tx_near_msg, 0);//将发送数据写入DW1000
-                                  dwt_writetxfctrl(14+SENDANCPARA_LEN, 0);//设定发送数据长度
-                                }
-								dwt_setdelayedtrxtime(final_tx_time);
-								result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送	
-								flag_finalsend=0;
-								break;
-							}
-						}
-							current_count=HAL_LPTIM_ReadCounter(&hlptim1);
-						 if(current_count>=end_count&&current_count<end_count+15000)
-								break;
-					};
-					if(status_reg==0xffffffff)
-					{
-						NVIC_SystemReset();
-					}
-					if (status_reg & SYS_STATUS_RXFCG)//如果成功接收
-						{
-							dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位
-							frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;	//获得接收到的数据长度
-							dwt_readrxdata(rx_buffer, frame_len, 0);   //读取接收数据
-							dwt_setrxtimeout(0);//DELAY_BETWEEN_TWO_FRAME_UUS*(nearbase_num+1-recbase_num)+10);//设定接收超时时间,0位没有超时时间
-							dwt_rxenable(0);//打开接收
-							if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)&&rx_buffer[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据
-							{	u16 rec_nearbaseid,rec_nearbasepos;
-								poll_tx_ts = get_tx_timestamp_u64();										//获得POLL发送时间T1
-								resp_rx_ts = get_rx_timestamp_u64();										//获得RESPONSE接收时间T4	
-								recbase_num++;
-								memcpy(&rec_nearbaseid,&rx_buffer[ANCHOR_ID_IDX],2);
-                                rec_remotepara_state = rx_buffer[MOTORSTATE_INDEX]>>4;
-                                if(rec_remotepara_state != 0)
-                                {   
-                                    para_update = rec_remotepara_state;
-                                    memcpy(rec_remotepara,&rx_buffer[REMOTEPARA_INDEX],7);
-                                    if(para_update==2)
-                                    {
-                                        flag_ancreadpara = 1;                                     
-                                    }
-                                }
-								if(last_nearbase_num==0)
-								{
-									get_newbase=1;
-									nearbaseid_list[0]=rec_nearbaseid;
-									nearbase_num=1;
-									memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2);
-								}
-								if(rec_nearbaseid==nearbaseid_list[0])
-								{
-									//////////////////////////////////时间同步
-									memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2);
-									memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2);
-									current_count=HAL_LPTIM_ReadCounter(&hlptim1);
-//									memcpy(&tagslotpos,&rx_buffer[TAGSLOTPOS],2);		
-									tmp_time=tmp_time+450;
-									if(tmp_time>999)
-									{
-										tmp_time-=999;
-										sync_timer++;
-										if(sync_timer>=1010)
-											{sync_timer=0;}
-									}
-								//	TIM3->CNT=tmp_time;
-//									if(tagslotpos>max_slotpos)
-//										tagslotpos=tagslotpos%(max_slotpos+1);
-//										tyncpoll_time=(tagslotpos-1)*slottime;
-									////////////////////////////
-									rec_nearbasepos=0;
-									exsistbase_list[rec_nearbasepos]=KEEP_TIMES;
-									memcpy(&temp_dist,&rx_buffer[DIST_IDX],4);
-									nearbase_distlist[rec_nearbasepos]=temp_dist;
-									if((rx_buffer[MOTORSTATE_INDEX]&0xf)!=3)
-										motor_state=rx_buffer[MOTORSTATE_INDEX]&0xf;
-									
-									
-									mainbase_lost_count=0;
-									flag_finalsend=1;
-									memcpy(&mainbase_dist,&rx_buffer[DIST_IDX],4);
-									final_tx_time = (resp_rx_ts + ((RESP_RX_TO_FINAL_TX_DLY_UUS+DELAY_BETWEEN_TWO_FRAME_UUS*nearbase_num+500) * UUS_TO_DWT_TIME)) >> 8;
-									temp1=final_tx_time-((850*UUS_TO_DWT_TIME)>>8);
-									temp2=final_tx_time+((100*UUS_TO_DWT_TIME)>>8);
-								//	dwt_setdelayedtrxtime(final_tx_time);//设置final包发送时间T5
-									final_tx_ts = (((uint64_t)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包实际发送时间是计算时间加上发送天线delay
-									final_msg_set_ts(&tx_near_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据
-									final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX], resp_rx_ts);
-									final_msg_set_ts(&tx_near_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts);
-									tx_near_msg[MESSAGE_TYPE_IDX]=NEAR_FINAL;
-                                    tx_near_msg[GROUP_ID_IDX] = group_id;
-									
-									dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 0);//将发送数据写入DW1000
-									dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
-									flag_getresponse=1;
-									memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
-									
-								
-									//时间同步
-									ancsync_time=((sync_timer)*1000+tmp_time);	
-									last_slotnum=current_slotnum;
-									current_slotnum=((float)sync_timer/g_com_map[COM_INTERVAL])+1;
-									if(current_slotnum==last_slotnum-1)
-									{flag_getresponse=1;}
-									lastsync_timer=sync_timer;
-									offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset;
-//									SetNextPollTime(tyncpoll_time);
-//									if(rec_remotepara_state==1)
-//									{
-//                             			memcpy(rec_remotepara,&rx_buffer[REMOTEPARA_INDEX],REMOTEPARA_LEN);
-//										memcpy(&g_com_map[COM_INTERVAL],&rec_remotepara[0],8);
-//										memcpy(&g_com_map[POWER],&rec_remotepara[8],10);
-//                                        if(g_com_map[COM_INTERVAL]>0&&g_com_map[COM_INTERVAL]<1000&&g_com_map[POWER]<67&&g_com_map[POWER]>0)
-//										{save_com_map_to_flash();
-//										delay_ms(100);										
-//                                        }
-//                                        NVIC_SystemReset();
-//									} 
-								}else{
-									rec_nearbasepos=FindNearBasePos(rec_nearbaseid);
-									
-										if(rec_nearbasepos>=last_nearbase_num)          //发现新的基站
-									{
-										get_newbase=1;
-										nearbase_num++;
-										nearbaseid_list[rec_nearbasepos] = rec_nearbaseid;
-										memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2);
-									}
-									
-									exsistbase_list[rec_nearbasepos]=KEEP_TIMES;
-									memcpy(&temp_dist,&rx_buffer[DIST_IDX],4);
-									nearbase_distlist[rec_nearbasepos]=temp_dist;
-									
-									if(motor_state<(rx_buffer[MOTORSTATE_INDEX]&0xf)&&(rx_buffer[MOTORSTATE_INDEX]&0xf)!=3)
-									{
-											motor_state=rx_buffer[MOTORSTATE_INDEX];
-									}
-									final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts);		
-               
-									dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 0);//将发送数据写入DW1000
-									dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
-								
-
-									//dwt_setdelayedtrxtime(final_tx_time);//设置final包发送时间T5
-								//	result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送			
-									//dwt_writetxdata(4,&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos+1)*4], FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos+1)*4);//将发送数据写入DW1000
-								}								
-							}
-						}else{
-						dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR);
-						if(flag_rxon)
-							{dwt_rxenable(0);	
-							}								
-						}			
-					//	dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR);
-			}
-			if(mainbase_lost_count>tag_frequency*BASELOST_STOPMOTOR_TIME)
-			{motor_state=0; }
-            dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR);
-            nearbase_num=recbase_num;
-		//	tyncpoll_time=0;
-			next_nearbase_num=0;
-            j = 0;
-			for(i=0;i<last_nearbase_num+get_newbase;i++)
-			{
-				if(exsistbase_list[i]>0)
-				{		
-					next_nearbase_num++;
-					true_exsistbase_list[j]=exsistbase_list[i];
-					true_nearbase_idlist[j]=nearbaseid_list[i];			
-					true_nearbase_distlist[j++]=nearbase_distlist[i];
-					exsistbase_list[i]--;
-				}
-			}
-            if(mainbase_lost_count>1&&exsistbase_list[0] != 0)
-			{
-                last_lpcount+= HAL_LPTIM_ReadCounter(&hlptim1)%(g_com_map[COM_INTERVAL]*16);
-			}
-            last_nearbase_num = next_nearbase_num;
-			for(i=0;i<last_nearbase_num-1;i++)
-			{
-				for(j=0;j<last_nearbase_num-1;j++)
-				{
-					if(true_nearbase_distlist[j]>true_nearbase_distlist[j+1])
-					{
-						u32 temp_dist,temp_id,temp_exsis;
-						temp_dist=true_nearbase_distlist[j];
-						temp_id = true_nearbase_idlist[j];
-						temp_exsis=true_exsistbase_list[i];
-						true_nearbase_distlist[j]=true_nearbase_distlist[j+1];
-						true_nearbase_idlist[j]=true_nearbase_idlist[j+1];
-						true_exsistbase_list[j]=true_exsistbase_list[j+1];
-						
-						true_nearbase_distlist[j+1]=temp_dist;
-						true_nearbase_idlist[j+1]=temp_id;
-						true_exsistbase_list[j+1]=temp_exsis;
-					}			
-				}
-			}
-			
-			report_num=0;
-	for (i=0;i<last_nearbase_num;i++)
-			{
-				nearbaseid_list[i]=true_nearbase_idlist[i];
-				nearbase_distlist[i]=true_nearbase_distlist[i];
-				if(nearbase_distlist[i]!=0x1ffff&&true_exsistbase_list[i]==KEEP_TIMES)
-				{
-					memcpy(&usart_send[4+6*report_num],&nearbaseid_list[i],2);
-					memcpy(&usart_send[6+6*report_num],&nearbase_distlist[i],4);
-					report_num++;
-				}
-			}
-            #ifdef USART_INTEGRATE_OUTPUT	
-                usart_send[0] = 0x55;     
-                usart_send[1] = 0xAA;              
-				usart_send[2] = 4;//正常模式
-				usart_send[3] = report_num*6+2;//正常模式
-				checksum = Checksum_u16(&usart_send[2],report_num*6+2);
-				memcpy(&usart_send[4+report_num*6],&checksum,2);
-				USART_puts(usart_send,6+report_num*6);
-			#endif
-            
-			for(i=0;i<MAX_NEARBASE_NUM;i++)
-			{
-				nearbase_distlist[i]=0x1ffff;
-			}
-	dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
-//HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_RESET);
-if(para_update==1)
-    {   
-        uint16_t calCRC;
-        calCRC = CRC_Compute(rec_remotepara,5);
-        if(memcmp(&calCRC,&rec_remotepara[5],2)==0)
-        {   uint8_t pack_msgtype,pack_index,pack_length;
-            pack_msgtype = rec_remotepara[0];
-            pack_index = rec_remotepara[1];
-            pack_length = rec_remotepara[2];
-            if(pack_msgtype==2)
-            {
-                if( pack_index == 1)//MOTOR_ONTIME_INDEX)
-                {
-               
-               //     motor_keeptime = rec_remotepara[3];
-                }else{
-                    if(pack_index<200)
-                    {
-                        memcpy((uint8_t*)&g_com_map + pack_index, &rec_remotepara[3], pack_length);
-                        //返回一个error状态
-                        //SendComMap(pack_datalen,pack_index);
-                        save_com_map_to_flash();
-                        delay_ms(100);
-                        NVIC_SystemReset();
-                    }
-                }
-            }
-        }
-    }
-}
-u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32];
-void GetNearMsg(void)
-{
-	u32 start_poll,frame_len;
-if(nearmsg_mainbase)
-	{nearmsg_mainbase=0;
-	}else{
-	nearmsg_mainbase=1;
-	}
-	memcpy(&tx_near_msg[ANCHOR_ID_IDX],&nearmsg_mainbase,2);
-	memcpy(&tx_near_msg[TAG_ID_IDX],&dev_id,2);
-    tx_near_msg[GROUP_ID_IDX] = group_id;
-	tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG;
-	
-	dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);			//设置发送后开启接收,并设定延迟时间
-  dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);	
-	dwt_writetxdata(12, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
-	dwt_writetxfctrl(12, 0);//设置超宽带发送数据长度
-	dwt_starttx(DWT_START_TX_IMMEDIATE| DWT_RESPONSE_EXPECTED);
-
-	/* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
-	while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误
-	{
-	};
-	if(status_reg==0xffffffff)
-	{
-		NVIC_SystemReset();
-	}
-	if (status_reg & SYS_STATUS_RXFCG)//如果成功接收
-	{
-		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位
-		frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;	//获得接收到的数据长度
-		dwt_readrxdata(rx_buffer, frame_len, 0);   //读取接收数据
-		if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_MSG&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据
-		{
-			nearbase_num=rx_buffer[NEARBASENUM_INDEX];
-			memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
-			tagslotpos=GetRandomSlotPos(rec_tagpos_binary);
-			//tagslotpos=rx_buffer[TAGSLOTPOS];
-			memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],nearbase_num*2);
-			//slottime=ceil((nearbase_num+2)*0.3)+1;
-			tyncpoll_time=tagslotpos*slottime;
-			tag_state=NEARPOLL;
-		}
-	}else{
-			tyncpoll_time = (tagslotpos--%max_slotpos)*slottime;
-	}
+    dwt_configuresleep(0x940, 0x7);
+    dwt_entersleep();
 }
 u32 id;
-void Tag_App(void)//发送模式(TAG标签)
+void UWB_Wkup(void)
 {
-	
-	//LED0_ON;
-	id =  dwt_readdevid() ;
-	    while (DWT_DEVICE_ID != id) 
+
+    SPIx_CS_GPIO->BRR = SPIx_CS;
+    delay_us(600);
+    SPIx_CS_GPIO->BSRR = SPIx_CS;
+    id =  dwt_readdevid() ;
+    while (0xDECA0130!=id)
     {
-			id =  dwt_readdevid() ;
+        u8 iderror_count = 0;
+        id =  dwt_readdevid() ;
+        if(iderror_count++>100)
+        {
+            printf("UWB芯片ID错误\r\n");
+            break;
+        }
     }
-
-	g_Resttimer=0;
-//	tag_state=DISCPOLL;
-	switch(tag_state)
-	{
-		case DISCPOLL:
-		//	Poll();
-			break;
-		case GETNEARMSG:
-
-				GetNearMsg();
-	 
-			break;
-		case NEARPOLL:
-			//GPIO_WriteBit(EU_TX_GPIO, EU_RX_PIN, Bit_SET);
-			NearPoll();
-			//GPIO_WriteBit(EU_TX_GPIO, EU_RX_PIN, Bit_RESET);
-			break;
-	}
-	dwt_entersleep();
-    bat_percent=Get_VDDVlotage();
 }

--
Gitblit v1.9.3