chen
4 天以前 b30026ab8adb4baa197a90e5fd117a03fd0128d8
初步增加新的lora网关升级功能,但lora功率不对,不可用的测试版
已修改3个文件
351 ■■■■ 文件已修改
keil/include/main/main.c 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keil/include/src/Radio/lora_1268.c 285 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keil/include/src/Radio/lora_1268.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keil/include/main/main.c
@@ -130,6 +130,8 @@
{
    // LOG_INFO(TRACE_MODULE_APP, "Wake up by sleep timer %d\r\n", time);
}
extern uint8_t start_wait_flag;
extern int16_t end_count1;
static void sleep_timer_callback_normal(void *dev, uint32_t time)
{
   if(secondtask_count++%2==0)
@@ -138,7 +140,11 @@
    }else{
        flag_secondtask = 0;
    }
        if(start_wait_flag)//lora升级等待超时标志
        {
        if(end_count1--<=0)
        start_wait_flag=0;
        }
// if(delaysleep_count>0)
//     delaysleep_count--;
}
@@ -375,8 +381,8 @@
//    lora_in_sleep();
//     power_init();
//    mcu_deep_sleep();
    if(gpio_pin_get_val(SLEEP_PIN))
    {
//    if(gpio_pin_get_val(SLEEP_PIN))
//    {
    if(gpio_pin_get_val(MODE_CHANGE_PIN))//记得改回来与正式的相反
    {
        LOG_INFO(TRACE_MODULE_APP,"固件版本:MK_Air_tag模式 V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff);
@@ -491,8 +497,8 @@
        LOG_INFO(TRACE_MODULE_APP,"固件版本:MK_免布线模式 V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff);
        uart0_Init_normal();
        Lora_1268_Init();
//         LOG_INFO(TRACE_MODULE_APP," 切换6\r\n");
        SwitchLoraSettings(478,7,22);
         LOG_INFO(TRACE_MODULE_APP," 切换6\r\n");
//        SwitchLoraSettings(478,7,22);
        Uwb_init();//默认为我们测距配置
        OpenUWB();
        uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback);
@@ -515,29 +521,30 @@
                    //Lora_Tx_Poll();
        }
                Lora_Tx_Poll();    
                if(!gpio_pin_get_val(SLEEP_PIN))
                {
                    delay_ms(300);
                //LOG_INFO(TRACE_MODULE_APP, "进入休眠模式\r\n");//会打断休眠
                //gpio_pin_clr(LORA_NRST);//lora休眠
                //spi_close(SPI_ID0);
                lora_in_sleep();
                 power_init();
                mcu_deep_sleep();
                }
                //LoraUp_Poll();//网关升级
//                if(!gpio_pin_get_val(SLEEP_PIN))
//                {
//                    delay_ms(300);
//                //LOG_INFO(TRACE_MODULE_APP, "进入休眠模式\r\n");//会打断休眠
//                //gpio_pin_clr(LORA_NRST);//lora休眠
//                //spi_close(SPI_ID0);
//                lora_in_sleep();
//                 power_init();
//                mcu_deep_sleep();
//                }
                IdleTask();
                }
    }    
}else{
delay_ms(300);
    //LOG_INFO(TRACE_MODULE_APP, "进入休眠模式\r\n");//会打断休眠
    //gpio_pin_clr(LORA_NRST);//lora休眠
    //spi_close(SPI_ID0);
    lora_in_sleep();
     power_init();
    mcu_deep_sleep();
}
//}else{
//
//delay_ms(300);
//    //LOG_INFO(TRACE_MODULE_APP, "进入休眠模式\r\n");//会打断休眠
//    //gpio_pin_clr(LORA_NRST);//lora休眠
//    //spi_close(SPI_ID0);
//    lora_in_sleep();
//     power_init();
//    mcu_deep_sleep();
//}
}
void app_restore_from_power_down(void)
keil/include/src/Radio/lora_1268.c
@@ -15,6 +15,7 @@
#include "HIDO_TypeDef.h"
#include "PCA9555.h"
#include "mk_misc.h"
#include "mk_flash.h"
/********************************************结构体**************************************************************/
typedef enum
{
@@ -158,6 +159,7 @@
    lora_sendbuffer[HB_LORAPOWER_IDX] = g_com_map[LORA_POWER];//将距离校准改为了TX发射功率设置
    checksum = Checksum_u16(lora_sendbuffer,14);
    memcpy(&lora_sendbuffer[14],&checksum,2);    
    LOG_INFO(TRACE_MODULE_APP, "进入send3\r\n");
    Radio.Send(lora_sendbuffer,16);
        
/*****************************心跳包上传内容*************************************/    
@@ -180,7 +182,7 @@
extern uint16_t REV_RX_NUM;
extern uint16_t REV_POLL_NUM;
extern uint16_t REPLY_POLL_NUM;
uint16_t num[3]={0,0,0};
uint8_t num[3]={1,2,0};
extern uint8_t stationary_flag;
extern uint8_t SOS_KEY_STATE;
uint32_t LORA_POLL_COUNT=0;
@@ -203,13 +205,15 @@
    //  wg_report_freq = REPORT_MANGE_CHANNEL_FRQ;
    //LOG_INFO(TRACE_MODULE_APP," 切换2\r\n");
    //test1++;
    SwitchLoraSettings(wg_report_freq,REPORT_CHANNEL_SF,22);
    if(heatbeat_count++>HEATBEAT_UPDATE_TIME && WG_Connected == wg_state) //如果心跳包到达上传时间,并且网关处于链接状态,就上传心跳包
    {
        heatbeat_count = 0;
        LoraHeartBeartPoll();
        return;
    }
//    LOG_INFO(TRACE_MODULE_APP," 切换9\r\n");
    //SwitchLoraSettings(wg_report_freq,REPORT_CHANNEL_SF,22);
    SwitchLoraSettings(478,7,22);
//    if(heatbeat_count++>HEATBEAT_UPDATE_TIME && WG_Connected == wg_state) //如果心跳包到达上传时间,并且网关处于链接状态,就上传心跳包
//    {
//        heatbeat_count = 0;
//        LoraHeartBeartPoll();
//        return;
//    }
    for(uint16_t i=0; i<report_ancnum-1; i++)
    {
        for(uint16_t j=0; j<report_ancnum-1-i; j++)
@@ -256,9 +260,12 @@
    memcpy(&lora_sendbuffer[ANCID_IDX+report_ancnum*2],report_ancdist,report_ancnum*2);
    checksum = Checksum_u16(lora_sendbuffer,4*report_ancnum+ANCID_IDX);
    memcpy(&lora_sendbuffer[ANCID_IDX+report_ancnum*4],&checksum,2);
    //    test2++;
    Radio.Send(lora_sendbuffer,ANCID_IDX+report_ancnum*4+2);
    //    test2++;   num
//    LOG_INFO(TRACE_MODULE_APP," 切换8\r\n");
    //SwitchLoraSettings(wg_report_freq,REPORT_CHANNEL_SF,22);
   // Radio.Send(lora_sendbuffer,ANCID_IDX+report_ancnum*4+2);
   Radio.Send(num,3);
}
@@ -298,6 +305,7 @@
        checksum = Checksum_u16(lora_sendbuffer,11+data_length);
        memcpy(&lora_sendbuffer[11+data_length],&checksum,2);
//        LORA_3029_SINGLE_SEND(lora_sendbuffer,data_length+13,0);
    LOG_INFO(TRACE_MODULE_APP, "进入send2\r\n");
                Radio.Send(lora_sendbuffer,data_length+13);
          //++;
  //  Delay_Ms(100);
@@ -316,6 +324,7 @@
    memcpy(&lora_sendbuffer[7], &g_com_map[index/2], data_length);
    checksum = Checksum_u16(lora_sendbuffer,9+data_length);
    memcpy(&lora_sendbuffer[9+data_length],&checksum,2);
    LOG_INFO(TRACE_MODULE_APP, "进入send1\r\n");
    Radio.Send(lora_sendbuffer,data_length+11);
LOG_INFO(TRACE_MODULE_APP, "进入回复\r\n");
  //LORA_3029_SINGLE_SEND(lora_sendbuffer,data_length+11,0);
@@ -466,6 +475,214 @@
extern uint16_t set_mk_time;
extern mk_send_message_to_BLE(void);
uint8_t tt4=1;
uint32_t Zhongjian_data[60];
uint8_t send_lora_data[250];
uint16_t rec_wenjian_daxiao;
uint8_t huifushengjibaoerror_num;
uint8_t muqiandeshengjibao;
uint8_t final_bag_num;
uint16_t wangguan_up_id;
uint16_t testflag;
uint16_t current_count1,target_count1,start_count1;
int16_t end_count1;
uint8_t start_wait_flag;
/**
  * @brief  Update CRC16 for input byte
  * @param  CRC input value
  * @param  input byte
  * @retval Updated CRC value
  */
uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte)
{
  uint32_t crc = crcIn;
  uint32_t in = byte|0x100;
  do
  {
    crc <<= 1;
    in <<= 1;
    if(in&0x100)
    {
      ++crc;
    }
    if(crc&0x10000)
    {
      crc ^= 0x1021;
    }
 } while(!(in&0x10000));
 return (crc&0xffffu);
}
/**
  * @brief  Cal CRC16 for YModem Packet
  * @param  data
  * @param  length
  * @retval CRC value
  */
uint16_t Cal_CRC16(const uint8_t* data, uint32_t size)
{
  uint32_t crc = 0;
  const uint8_t* dataEnd = data+size;
  while(data<dataEnd)
  {
    crc = UpdateCRC16(crc,*data++);
  }
  crc = UpdateCRC16(crc,0);
  crc = UpdateCRC16(crc,0);
  return (crc&0xffffu);
}
void LoraUp_Poll()
{    uint16_t  result ;
    uint16_t crc16;
    if(shengji_flag)
    {
//    memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节
    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;
    Radio.Send(send_lora_data,8);//基站发送升级确认回复
    delay_ms(1000);
LOG_INFO(TRACE_MODULE_APP," 切换7\r\n");
   // SwitchLoraSettings(LORA_UPCHANNEL_FRQ,LORA_UPCHANNEL_SF,22); //切换lora升级频点
    delay_ms(200);
    __disable_irq();
//    FLASH_Read(APP_1OR2_ADRESS,(uint8_t*)&app1_or_app2,2);
    final_bag_num=(rec_wenjian_daxiao/220)+1;//计算一共要请求多少包
        while(1)
        {
            //FLASH_Prepare(APP2_ADRESS, APP_SIZE); //删除上一次app为下次做准备
                        testflag=flash_erase(FLASH_ID0,APP2_ADRESS,APP_SIZE);//删除100kAPP2空间为下面做准备
            delay_ms(500);
            if(testflag==0)
            {break;}
        }
//    FLASH_Write(APP2_ADRESS, (const uint8_t*)&tmp111, 2);
    __enable_irq();
    while(1)
    {
        if(huifushengjibao_flag==1)
        {lora_up_rec_flag=1;
            while(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;
                crc16=Checksum_u16(send_lora_data,7);
                memcpy(&send_lora_data[7],&crc16,2);
                lora_up_rec_flag=0;
                Radio.Send(send_lora_data,9);//基站发送请求第x包
                /*重写超时逻辑
                start_count1=HAL_LPTIM_ReadCounter(&hlptim1);     //等待接收完成直到超时
                end_count1=start_count1+32768/2;//500ms等待
                if(end_count1>=32768)
                {end_count1-=32768;}
                current_count1=HAL_LPTIM_ReadCounter(&hlptim1);
                while(!lora_up_rec_flag)
                {
                    current_count1=HAL_LPTIM_ReadCounter(&hlptim1);
                    if(current_count1>=end_count1&&current_count1<end_count1+15000)
                    {
                    break;
                    }
                    delay_ms(100);
                    if(lora_up_rec_flag)
                    {break;}
                    Radio.Send(send_lora_data,9);
                }
                                 重写超时逻辑 */
                                 start_wait_flag=1;
                                 end_count1=2;
                                  while(!lora_up_rec_flag)
                {
                                    if(start_wait_flag==0)
                                    {
                                    break;
                                    }
                                      delay_ms(100);
                    if(lora_up_rec_flag)
                    {break;}
                    Radio.Send(send_lora_data,9);
                                }
//                while(1);
                if(lora_up_rec_flag)
                {   uint16_t result12;
                    //HAL_IWDG_Refresh(&hiwdg);//未修改喂狗
                     crc16=Cal_CRC16(RX_Buffer,DATA_IDX+ONE_BAG_DAXIAO);
                    __disable_irq();
                     if(muqiandeshengjibao==RX_Buffer[MUQIAN_BAG]&&!memcmp(&crc16,&RX_Buffer[DATA_IDX+ONE_BAG_DAXIAO],2)&&!memcmp(&dev_id,&RX_Buffer[DEST_ID_IDX],2)&& !memcmp(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2))
                     {
                     memcpy(Zhongjian_data,&RX_Buffer[DATA_IDX],ONE_BAG_DAXIAO);
                     result12=flash_write_nbytes(FLASH_ID0,APP2_ADRESS+ONE_BAG_DAXIAO*RX_Buffer[MUQIAN_BAG],(uint8_t*)Zhongjian_data,ONE_BAG_DAXIAO);
                                            // flash_write_nbytes(FLASH_ID0, FLASH_IAP_CTRL_MAP, (const uint8_t*)g_com_map, sizeof(g_com_map));
                     while(result12==0)
                     {
                     result12=flash_write_nbytes(FLASH_ID0,APP2_ADRESS+ONE_BAG_DAXIAO*RX_Buffer[MUQIAN_BAG],(uint8_t*)Zhongjian_data,ONE_BAG_DAXIAO);
                     delay_ms(10);
                     }
                     if(result12)
                     muqiandeshengjibao++;
                     }
                     __enable_irq();
                }
                else
                {
                    //HAL_IWDG_Refresh(&hiwdg);//未修改喂狗
                    huifushengjibaoerror_num++;
                    if(huifushengjibaoerror_num>=20)
                    {
                    huifushengjibaoerror_num=0;
                    muqiandeshengjibao=0;
                    delay_ms(500);
                    //HAL_NVIC_SystemReset();//修改重启
                                        sys_reset(0);
                    break;
                    }
                }
                if(muqiandeshengjibao==final_bag_num)
                {
                uint16_t tmp11 ,result11;
                    tmp11=0XCC;
                                    result11=flash_erase(FLASH_ID0,APP_1OR2_ADRESS,FLASH_SECTOR_SIZE);//删除标志位所在区域
                if(!result11)
                result11 = flash_write_nbytes(FLASH_ID0,APP_1OR2_ADRESS, (const uint8_t*)&tmp11, 2);//更新标志位
                __disable_irq();
                delay_ms(1500);
                //HAL_NVIC_SystemReset();//修改重启
                                        sys_reset(0);
                }
            }
        }
        else
        {
        delay_ms(500);
//        huifushengjibao_flag=0;
        Radio.Send(send_lora_data,8);//基站发送升级确认回复
        huifushengjibaoerror_num++;
            if(huifushengjibaoerror_num>=5)
            {
            huifushengjibaoerror_num=0;
                        delay_ms(500);
                        sys_reset(0);
            break;
            }
        }
    }
  }
}
uint8_t imu_enable;
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
{  
                uint16_t checksum1;
@@ -570,22 +787,22 @@
                                                            break; 
                                                case WGRSP_RWTAG_UPDATE:
                                                rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX];
//                                                switch(rec_index)
//                                                {
//                                                        case 0xaa:  //升级下发
//                                                        memcpy(&rec_wenjian_daxiao,&RX_Buffer[WRITEPARA_VALUE_IDX],2);//文件大小
//                                                        if(rec_wenjian_daxiao>0XAC00||rec_wenjian_daxiao==0)
//                                                        {}//文件过大,超出范围
//                                                        else
//                                                        {
//                                                                memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节
//                                                                shengji_flag=1;
//                                                                LoraUp_flag=1;
                                                switch(rec_index)
                                                {
                                                        case 0xaa:  //升级下发
                                                        memcpy(&rec_wenjian_daxiao,&RX_Buffer[WRITEPARA_VALUE_IDX],2);//文件大小
                                                        if(rec_wenjian_daxiao>0XAC00||rec_wenjian_daxiao==0)
                                                        {}//文件过大,超出范围
                                                        else
                                                        {
                                                                memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节
                                                                shengji_flag=1;
                                                                LoraUp_flag=1;
//                                                                imu_enable=0;                            
//                                                        }
////                              LoraUp_Poll();
//                                                                break;
//                                                }
                                                        }
//                              LoraUp_Poll();
                                                                break;
                                                }
                                                        break; 
                                        }
                                    }
@@ -596,8 +813,8 @@
    if(!no_rx_flag)
    {
        if(lora_jianting_flag&&LoraUp_flag==0)
        {    //LOG_INFO(TRACE_MODULE_APP," 切换2\r\n");
            SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
        {    LOG_INFO(TRACE_MODULE_APP," 切换2\r\n");
//            SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
            Radio.Rx(0);
        }
    }
@@ -609,8 +826,8 @@
    Radio.Standby();
    if(lora_jianting_flag)
    {
            //LOG_INFO(TRACE_MODULE_APP," 切换3\r\n");
        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
            LOG_INFO(TRACE_MODULE_APP," 切换3\r\n");
       // SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
        Radio.Rx(0);
    }
}
@@ -621,8 +838,8 @@
    
    if(lora_jianting_flag)
    {
            //LOG_INFO(TRACE_MODULE_APP," 切换4\r\n");
        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
            LOG_INFO(TRACE_MODULE_APP," 切换4\r\n");
//        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
        Radio.Rx(0);
    }
}
@@ -634,8 +851,8 @@
    Radio.Standby();
    if(lora_jianting_flag)
    {
            //LOG_INFO(TRACE_MODULE_APP," 切换5\r\n");
        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
            LOG_INFO(TRACE_MODULE_APP," 切换5\r\n");
    //    SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
        Radio.Rx(0);
    }
}
keil/include/src/Radio/lora_1268.h
@@ -184,9 +184,12 @@
typedef enum{    WG_Lost, //上报丢失    失去和网关通讯
                WG_Connected,// 上报中       和网关通讯正常
}wg_state_enum;
#define MUQIAN_BAG 6
#define DATA_IDX 7
#define ONE_BAG_DAXIAO 220
#define APP2_ADRESS 0x402f000
#define APP_SIZE 0x19000
#define APP_1OR2_ADRESS 0x48000