From 5631933750eb6d2b1c6d04b7495f88df6a2ec85e Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期五, 25 七月 2025 14:42:04 +0800 Subject: [PATCH] 1.4,加入被升级功能 --- keil/uwb_tag.c | 401 +++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 306 insertions(+), 95 deletions(-) diff --git a/keil/uwb_tag.c b/keil/uwb_tag.c index b32f674..b692897 100644 --- a/keil/uwb_tag.c +++ b/keil/uwb_tag.c @@ -10,6 +10,9 @@ #include "mk_calib.h" #include <serial_at_cmd_app.h> #include <global_param.h> +#include <global_param.h> +#include "mk_flash.h" + extern int TagRange(void); extern Operation_step UWB_work_state; @@ -76,23 +79,6 @@ .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ }; -///* Default communication configuration. */ -//static struct mk_uwb_configure config = { -// .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), -// .phy_cfg.ch_num = 5, /* Channel number. */ -// .phy_cfg.code_index = 3, /* TX preamble code. */ -// .phy_cfg.mean_prf = MEAN_PRF_16M, /* Data rate 6.8M */ -// .phy_cfg.data_bit_rate = DATA_BR_110K, /* data rate 6.8M. */ -// .phy_cfg.sync_sym = PREAM_LEN_1024, /* Preamble duration, length of preamble 128 */ -// .phy_cfg.sfd_sym = NSFD_64, /* Identifier for SFD sequence */ -// .phy_cfg.ranging_bit = 1, /* ranging bit set. */ -// .phy_cfg.trx_mode = TRX_MODE_15_4A, /* IEEE802.15.4z - BPRF mode */ -// .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ -// .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ -// .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ -// .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ -//}; -/* Buffer to store received frame */ static uint8_t rx_buf[150]; static uint8_t uwb_sendbuffer[150]; /* Frames used in the ranging process @@ -286,6 +272,28 @@ temp_flag=1; } } + +#ifdef _UWB_1HZ +uint16_t time111=1000; +void SetLPTimer(uint16_t time) +{ + sleep_timer_stop(); + if(time==0) + { + time111=1000; + sleep_timer_start(__MS_TO_32K_CNT(time111)); + } + else + { + time111=time111+time; + if(time111>1100) + { + time111=1000; + } + sleep_timer_start(__MS_TO_32K_CNT(time111));//测试 + } +} +#else uint16_t time111=5000; void SetLPTimer(uint16_t time) { @@ -305,30 +313,8 @@ sleep_timer_start(__MS_TO_32K_CNT(time111));//测试 } } +#endif -////注意:因为新注册的标签并不知道基站已经收到了,所以要在下一包立刻将新的标签ID发出,否则标签会一直抢占基站的poll包。 -////方法是将新注册的标签添加到下次发送的标签列表头部,其他标签依次向后挪动。 -//uint16_t AddNewTagIntoList(uint16_t tagid) -//{ -// uint16_t newindex_cal = taglist_current_index+25;//当前索引+25,为下次索引要发出的值的最大值,如果总数小于这个值,即可放到最后面。 -// if(newindex_cal>=taglist_total_num) //如果当前索引是最后一包,那么就加到总索引的后面,如果不是就加到下一次起始索引位置。 -// { -// newindex_cal = taglist_total_num; -// -// }else{ -// for(uint16_t i=taglist_total_num;i>newindex_cal;i--) //从后往前挪地方??就是插入 -// { -// taglist_id[i]=taglist_id[i-1]; -// taglist_dist[i]=taglist_dist[i-1]; -// taglist_keeptime[i]=taglist_keeptime[i-1]; -// } -// } -// taglist_total_num++; -// taglist_id[newindex_cal] = tagid; -// taglist_dist[newindex_cal] = 0; -// taglist_keeptime[newindex_cal] = TAG_KEEPTIMES; -// return newindex_cal; -//} uint8_t FindNearBasePos(uint16_t baseid)//寻找当前列表中的基站返回索引 { uint8_t i; @@ -341,55 +327,6 @@ return nearbase_num; } -//void AnchorListUpdate(void) -//{ -// next_nearbase_num = 0; -// int j=0; -// for(int i=0;i<nearbase_num;i++) -// { -// if(exsistbase_list[i]>0) -// { -// exsistbase_list[i]--; -// next_nearbase_num++; -// true_exsistbase_list[j]=exsistbase_list[i]; -// true_nearbase_idlist[j]=nearbaseid_list[i]; -// true_nearbase_distlist[j++]=nearbase_distlist[i]; -// -// } -// nearbase_num = next_nearbase_num;//更新现存基站数 -// last_nearbase_num = next_nearbase_num;//更新当前基站数 -// } -//} - -//void Rank_ANchor_list_by_dis(void)//按照目前的基站距离进行冒泡排序用临时数组方式将最近的放到最前面,最远的放到最后面 -//{ -//for(int i=0;i<last_nearbase_num-1;i++) -// { -// for(int j=0;j<last_nearbase_num-1;j++) -// { -// if(true_nearbase_distlist[j]>true_nearbase_distlist[j+1]) -// { -// uint32_t temp_dist,temp_id,temp_exsis; -// temp_dist=true_nearbase_distlist[j]; -// temp_id = true_nearbase_idlist[j]; -// temp_exsis=true_exsistbase_list[j]; -// 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; -// } -// } -// } -// for (int i=0;i<last_nearbase_num;i++) -// { -// nearbaseid_list[i]=true_nearbase_idlist[i]; -// nearbase_distlist[i]=true_nearbase_distlist[i]; -// exsistbase_list[i] = true_exsistbase_list[i]; -// } -//} static uint16_t CmpTagInList(uint16_t tagid)//找这个新一包的基站在不在现存的taglist中在的话对应位置更新存活时间,不在就增加(确保有效数量小于最大设置数) { uint16_t temp; @@ -559,6 +496,79 @@ } } uint8_t ggggg; +uint8_t xiaobiaoqian_flag; +uint8_t readgcom_flag; +uint16_t wg_report_id; +int rand_temp; +static uint16_t source_id; +uint8_t rec_index,rec_secdelay; +uint16_t rec_value; +uint8_t readgcom_flag; +uint16_t rec_wenjian_daxiao; +uint16_t wangguan_up_id; +uint8_t shengji_flag,time=5; +uint8_t LoraUp_flag; +extern uint16_t final_bag_num; +uint16_t checksum1; +void Uwb_Update(void) +{ + + checksum1=Checksum_u16(rx_buf,rx_length-2); + if(!memcmp(&checksum1,&rx_buf[rx_length-2],2)) + if(!memcmp(&dev_id,&rx_buf[4],2)) + { + memcpy(&source_id,&rx_buf[2],2); +// if(wg_state==WG_Lost) +// { +// wg_state = WG_Connected; + wg_report_id = source_id; +// } +// if(!memcmp(&wg_report_id,&rx_buf[SOURCE_ID_IDX],2)) +// { +// wg_lost_count = 0; +// loraled=GREEN; + switch(rx_buf[9]) + { + case WGRSP_RWTAG_READ: + readgcom_flag = 1; +// LoraSendComMap(WGRSP_RWTAG_READ); + break; + case WGRSP_RWTAG_WRITE: + rec_index = rx_buf[PWTAG_WRITE_IDX_IDX]; + if(rec_index<=DEV_ID) + {break;} + memcpy(&rec_value,&rx_buf[PWTAG_WRITE_VALUE_IDX],2); + if(g_com_map[rec_index/2]==rec_value) + {break;} + g_com_map[rec_index/2] = rec_value; + save_com_map_to_flash(); + delay_us(60000); + NVIC_SystemReset(); + break; + case WGRSP_RWTAG_UPDATE: + rec_index = rx_buf[PWTAG_WRITE_IDX_IDX]; + switch(rec_index) + { + case 0xaa: //升级下发 + memcpy(&rec_wenjian_daxiao,&rx_buf[11],2);//文件大小 + if(rec_wenjian_daxiao>APP_SIZE/100||rec_wenjian_daxiao==0) + {}//文件过大,超出范围 + else + { + final_bag_num=rec_wenjian_daxiao; + memcpy(&wangguan_up_id,&rx_buf[SOURCE_ID_IDX],2);//网关ID 占用2个字节 + shengji_flag=1; + LoraUp_flag=1; + LOG_INFO(TRACE_MODULE_APP, "进入升级模式,需要接收的文件包数%d\r\n",rec_wenjian_daxiao); + } + break; + } + break; + } +// } + } +} +uint8_t readgcom_flag1; void DiscPoll2(void) { uint32_t temp1,temp2,dw_systime,mindist_slavebaseid,mindist; @@ -566,10 +576,38 @@ uint32_t final_tx_time; uint32_t start_poll; uint8_t i,j,getsync_flag=0,timeout,get_newdist; - + xiaobiaoqian_flag=0; tag_succ_times = 0; salvebase_mindist=999999; get_newdist = 0; + if(readgcom_flag) + { + readgcom_flag=0; + readgcom_flag1=1; + phy_timer_open(1, IRQ_PRIORITY_HIGH); + mac_register_process_handler(tx_int_callback, rx_int_callback); + uint8_t data_length = 0x50; + uint16_t checksum = 0; + tx_near_msg[0] = 0x39; + tx_near_msg[1] = data_length+11; + memcpy(&tx_near_msg[2],&g_com_map[DEV_ID],2); + memcpy(&tx_near_msg[4],&wg_report_id,2); + tx_near_msg[6] = 2; + tx_near_msg[7] = 2; + tx_near_msg[8] = data_length; + memcpy(&tx_near_msg[9], &g_com_map[1], data_length); + checksum = Checksum_u16(tx_near_msg,11+data_length); + memcpy(&tx_near_msg[11+data_length],&checksum,2); +// Radio.Send(uwb_sendbuffer,data_length+13); + // Delay_Ms(100); + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(tx_near_msg,data_length+13,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 +// temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 + } + else + { if(next_nearbase_num>=MAX_NEARBASE_NUM) { next_nearbase_num = MAX_NEARBASE_NUM-1; @@ -579,9 +617,11 @@ phy_timer_open(1, IRQ_PRIORITY_HIGH); mac_register_process_handler(tx_int_callback, rx_int_callback); tx_near_msg[BATTARY_IDX] = bat_percent; - tx_near_msg[BUTTON_IDX] = 0/*userkey_state|stationary_flag<<1|gotosleep_flag<<2|motor_flag<<5*/; +// tx_near_msg[BUTTON_IDX] = 0/*userkey_state|stationary_flag<<1|gotosleep_flag<<2|motor_flag<<5*/; tx_near_msg[SEQUENCE_IDX] = frame_seq_nb; - tx_near_msg[SEQUENCEH_IDX] = (frame_seq_nb++)>>8; +// tx_near_msg[SEQUENCEH_IDX] = (frame_seq_nb++)>>8; + memcpy(&tx_near_msg[7],&g_com_map[VERSION],2); + memcpy(&tx_near_msg[5],&g_com_map[DEV_ID],2); tx_near_msg[NEARBASENUM_INDEX] = nearbase_num; memcpy(&tx_near_msg[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2); memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*2],&nearbase_distlist,nearbase_num*4+4); @@ -643,8 +683,15 @@ SetANCTimestap(rec_nearbasepos,&rx_buf[RESP_MSG_POLL_RX_TS_IDX],&rx_buf[RESP_MSG_RESP_TX_TS_IDX],(uint32_t)resp_rx_ts_i64,&rx_buf[RESP_MSG_ANC_DISTOFFSET],test2,(uint32_t)poll_tx_ts_i64);//这个是改过的参数 exsistbase_list[rec_nearbasepos]=KEEP_TIMES; temp_dist = nearbase_distlist[rec_nearbasepos]; + if(rx_buf[0]==0xff) + {xiaobiaoqian_flag=1;} tempflag=uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 - }else + } + else if(rx_buf[MSG_TYPE_IDX]==LORA_MSGTYPE_WGRESPTAG) + { + Uwb_Update(); + } + else { if(recbase_num!=nearbase_num+1) { @@ -664,7 +711,11 @@ } delay_us(1); uwb_rx_force_off(1); +// if(readgcom_flag1==0) +// { CalculateDists(poll_tx_ts_i64); //计算距离并更新距离表 +// } +// readgcom_flag1=0; // AnchorListUpdate();//更新存活基站列表 // Rank_ANchor_list_by_dis();//冒泡排序重新按距离重新排列基站列表最小距离存货基站放到最前面 for(i=0; i<11; i++) @@ -676,11 +727,12 @@ } } - if(mindist!=0x1ffff) + if(mindist!=0x1ffff&&xiaobiaoqian_flag==0) { mainbase_id = mindist_slavebaseid; try_reg_times = 0; tag_state = REGPOLL; + } } } @@ -1047,4 +1099,163 @@ memcpy(&tx_sync_msg[ANCHOR_ID_IDX], &g_com_map[DEV_ID], 2); memcpy(&tx_near_msg[ANCHOR_ID_IDX], &g_com_map[DEV_ID], 2); memcpy(&tx_near_msg[TAG_ID_IDX], &g_com_map[DEV_ID], 2); -} \ No newline at end of file +} + +extern uint8_t send_lora_data[250]; +uint16_t muqiandeshengjibao; +static uint16_t current_count1,target_count1,end_count1,start_count1; +uint8_t huifushengjibaoerror_num; +extern uint16_t final_bag_num; +uint16_t testflag; +uint32_t Zhongjian_data[60]; +uint8_t shengji_flag; +uint16_t wangguan_up_id; +uint8_t huifushengjibao_flag; +uint8_t LoraUp_flag; +uint16_t rec_wenjian_daxiao; +uint8_t lora_up_rec_flag; +uint16_t flash_shuju; +static uint32_t status_reg; +static uint32_t frame_len; +void LoraUp_Poll(void) +{ uint16_t result ; + uint16_t crc16; + uint8_t jindu; + if(shengji_flag) + { + uwb_rx_force_off(1); + Uwb_init(); + phy_timer_open(1, IRQ_PRIORITY_HIGH); + mac_register_process_handler(tx_int_callback, rx_int_callback); + + send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATE_CONFIRM; + memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 + memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 +// send_lora_data[MUQIAN_BAG]=0xFF; + crc16=Checksum_u16(send_lora_data,6); + memcpy(&send_lora_data[6],&crc16,2); + huifushengjibao_flag=0; + LoraUp_flag=1; + + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(send_lora_data,8+2,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 +// temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 + + __disable_irq(); + result=flash_open(FLASH_ID0,NULL); + flash_read(FLASH_ID0, APP2_ADRESS, (uint8_t*)&flash_shuju, 2); + if(flash_shuju!=0xffff/*&&flash_shuju!=0x0000*/) + { + while(1) + { + flash_erase(FLASH_ID0,APP2_ADRESS,APP_SIZE); + delay_ms(500); + flash_read(FLASH_ID0, APP2_ADRESS, (uint8_t*)&flash_shuju, 2); + if(flash_shuju==0xffff/*&&flash_shuju!=0x0000*/) + {break;} + } + } + __enable_irq(); + while(1) + { + uwb_rx_force_off(1); + send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATEFILE_REQUEST; + memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 + memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 +// send_lora_data[MUQIAN_BAG]=muqiandeshengjibao; + memcpy(&send_lora_data[MUQIAN_BAG],&muqiandeshengjibao,2); + crc16=Checksum_u16(send_lora_data,8); + memcpy(&send_lora_data[8],&crc16,2); + lora_up_rec_flag=0; +// LOG_INFO(TRACE_MODULE_APP, "正在请求第%d包\r\n",muqiandeshengjibao); + jindu=(muqiandeshengjibao*100)/final_bag_num; + LOG_INFO(TRACE_MODULE_APP, "升级进度%d\r\n",jindu); +// wdt_ping(WDT_ID0);//喂狗 + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(send_lora_data,10+2,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 +// temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 +// temp_count2=phy_timer_count_get(); + resp_rx_en_start_u32 = poll_tx_en_start_u32+ US_TO_PHY_TIMER_COUNT(POLL_TX_TO_RESP_RX_DLY_US);//设置发送多少s后接收按target独立时间起点算+ US_TO_PHY_TIMER_COUNT(POLL_TX_TO_RESP_RX_DLY_US为发送后要多久开启接收时间 + temp_resp=resp_rx_en_start_u32; + tempflag=uwb_rx(0,0, 50000); + + while(mac_is_busy()) + {} + if(receive_flag==1)//成功接收数据 + { uint16_t result12; + + __disable_irq(); + crc16=Cal_CRC16(rx_buf,DATA_IDX+ONE_BAG_DAXIAO); + + if(!memcmp(&muqiandeshengjibao,&rx_buf[MUQIAN_BAG],2)&&!memcmp(&crc16,&rx_buf[DATA_IDX+ONE_BAG_DAXIAO],2)&&!memcmp(&dev_id,&rx_buf[DEST_ID_IDX],2)&& !memcmp(&wangguan_up_id,&rx_buf[SOURCE_ID_IDX],2)) + { + result=flash_open(FLASH_ID0,NULL); + memcpy(Zhongjian_data,&rx_buf[DATA_IDX],ONE_BAG_DAXIAO); + result12=flash_write_nbytes(FLASH_ID0, APP2_ADRESS+ONE_BAG_DAXIAO*muqiandeshengjibao, (uint8_t*)Zhongjian_data, ONE_BAG_DAXIAO); + while(!result12==0) + { + result12=flash_write_nbytes(FLASH_ID0, APP2_ADRESS+ONE_BAG_DAXIAO*muqiandeshengjibao, (uint8_t*)Zhongjian_data, ONE_BAG_DAXIAO); + delay_ms(10); + } + if(result12==0) + { +// if(muqiandeshengjibao==650) +// { +// delay_ms(10); +// } + muqiandeshengjibao++; + huifushengjibaoerror_num=0; + delay_ms(10); + } + } + __enable_irq(); + } + else + { + delay_ms(500); + huifushengjibaoerror_num++; + if(huifushengjibaoerror_num>=20) + { + huifushengjibaoerror_num=0; + muqiandeshengjibao=0; + delay_ms(500); + NVIC_SystemReset(); + break; + } + uwb_rx_force_off(1); + } + if(muqiandeshengjibao==final_bag_num) + { + send_lora_data[MSG_TYPE_IDX]=0x99; + memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 + memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 + crc16=Checksum_u16(send_lora_data,6); + memcpy(&send_lora_data[6],&crc16,2); + huifushengjibao_flag=0; + LoraUp_flag=1; + LOG_INFO(TRACE_MODULE_APP, "正在发送最后一包\r\n"); + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(send_lora_data,8+2,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 +// temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 + + uint16_t tmp11 ,result11; + tmp11=0XDDDD; + result=flash_open(FLASH_ID0,NULL); + result11=flash_erase(FLASH_ID0,APP_1OR2_ADRESS,0x1000); + if(result11==0) + flash_write_nbytes(FLASH_ID0, APP_1OR2_ADRESS, (uint8_t*)&tmp11, 2); + __disable_irq(); + delay_ms(500); + NVIC_SystemReset(); + } + } + uwb_rx_force_off(1); + } +} + -- Gitblit v1.9.3