Kaynağa Gözat

增加了美顺保护板升级,及修改了升级的bug
增加了debug信息打印,但未做上传
maintask空间申请大了一些

CHENJIE-PC\QiXiang_CHENJIE 3 yıl önce
ebeveyn
işleme
1f9a3f7b62
10 değiştirilmiş dosya ile 1023 ekleme ve 53 silme
  1. 1 1
      inc/MainTask.h
  2. 18 0
      inc/TcpTask.h
  3. 35 0
      inc/UartTask.h
  4. 1 1
      inc/app.h
  5. 8 0
      inc/hal_module_adapter.h
  6. 9 21
      src/MainTask.c
  7. 69 11
      src/TcpTask.c
  8. 767 12
      src/UartTask.c
  9. 8 2
      src/bsp_custom.c
  10. 107 5
      src/hal_module_adapter.c

+ 1 - 1
inc/MainTask.h

@@ -13,7 +13,7 @@ extern volatile BOOL Sleep_flag;//睡眠标志位
 extern AppNVMDataType AppNVMData;
 extern AppDataBody AppDataInfo;
 /*---------------------------------------------------------------------------*/
-#define PROC_MAIN_TASK_STACK_SIZE           (1024)
+#define PROC_MAIN_TASK_STACK_SIZE           (1024+512)
 typedef enum
 {
     PROCESS_STATE_IDLE = 0,

+ 18 - 0
inc/TcpTask.h

@@ -50,6 +50,7 @@ extern UINT32 TcpService;
 #define GPSMSG				0x82
 #define STATESMSG			0x85
 #define VERSIONMSG			0x86
+#define DEBUGMSG			0x8C
 
 typedef struct BattInfoType
 {	
@@ -141,6 +142,23 @@ typedef struct VersionMsgtoTcpType
 	VerInfoType VerInfo;	
 	UINT8	CRC;
 }VersionMsgtoTcpType;
+typedef struct _DebugInfoType
+{
+	UINT8	sendTimeUTC[6];
+	UINT8	msgMark;
+	CHAR   DataBuffer[5];
+}DebugInfoType;
+typedef struct DebugMsgtoTcp_Type
+{
+	UINT8 	startSymbol[2];
+	UINT8	cmdSymbol;
+	UINT8	ansSymbol;
+	UINT8	SN[BATT_SN_LEN];
+	UINT8	encryptMethod;
+	UINT8	dataLength[2];		
+	DebugInfoType DebugInfo;
+	UINT8	CRC;
+}DebugMsgtoTcpType;
 /*---------------------------------------------------------------------------*/
 typedef enum
 {

+ 35 - 0
inc/UartTask.h

@@ -103,6 +103,41 @@ typedef struct BMS_Update_Recv_Msg_Type
         UINT8 checkSum;
         UINT8 endFlag;
 }BMS_Update_Recv_Msg_Type;
+typedef enum
+{        
+        MS_UPDATE_STEP_SEND_FIRMWARE_UPDATE_REQUEST_AND_JUMP_TO_BOOTLOADER = 1,
+        MS_UPDATE_STEP_FIRMWARE_UPDATE_REQUEST_ANSWER, 
+        MS_UPDATE_STEP_SEND_FIRMWARE_INFO,       
+        MS_UPDATE_STEP_FIRMWARE_INFO_CHECK_AND_UPDATE_REQEST_ANSWER,
+        MS_UPDATE_STEP_EREASE_APP_FLASH_REQUEST,
+        MS_UPDATE_STEP_EREASE_FLASH_ANSWER,        
+        MS_UPDATE_STEP_SEND_UPDATE_DATA,
+        MS_UPDATE_STEP_UPDATE_DATA_WRITE_ANSWER,
+        MS_UPDATE_STEP_SEND_UPDATE_DATA_END_AND_JUMP_TO_APP,
+        MS_UPDATE_STEP_JUMP_TO_APP_ANSWER,
+        MS_UPDATE_STEP_READ_CURRENT_RUNNING_MODE,
+        MS_UPDATE_STEP_CURRENT_RUNNING_MODE_ANSWER,
+        MS_UPDATE_STEP_END,
+        MS_UPDATE_STEP_ERROR
+}UpdateStep_MS_BMS;
+
+typedef enum
+{
+	updateOK                 	= 0,         ///< update successfully.
+	updateErrorTimeout			= 1,         ///< update failed after try 3 times, so time out
+	updateErrorBMSPowerLow        	= 2,         ///update failed, because of bmp power low
+	updateErrorBMSWarningProtect           	= 3,         ///update failed, because there are some warning in bms which not allowed to update
+	updateErrorBMSNotSurport          	= 4,         ///update failed, because of bms not surpport
+	updateErrorBMSWorkState           	= 5,         ///update failed, because bms is charging or discharging
+	updateErrorFirmwareInfoError                	= 6, //update failed, the firmware info error
+	updateErrorFirmwareSizeError          	= 7,  ///update failed, the firmware size in firmware info is to large
+	updateErrorAppErease = 8,			///update failed, erease app flash failed
+	updateErrorPackageCRC = 9,			///the crc of some package is wrong
+	updateErrorPackageWrite = 10,		///package write in failed
+	updateErrorPackageNo = 11,			///package number is not right or not continues
+	updateErrorCheckSumError,			// checksum != checksumcal
+	updateFailed = 0xFF					///					
+}updateBMSStatus;
 void UartTaskInit(void* arg);
 void UartTaskDeInit(void* arg);
 UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout);

+ 1 - 1
inc/app.h

@@ -16,7 +16,7 @@ extern "C" {
 #define BMS_MANUFACTURE (2) //BMS制造商表示1-超力源,2-美顺
 #define DATA_MODULE_TYPE (1) //1表示NB模块,2表示4G cat1
 #define BMS_INFO  (1)       //1-1表示超力源4830,1-2表示超力源6060,2-1表示美顺6455
-#define EOLSTATE (0) //1标识下线检测跳过,使用默认值
+#define EOLSTATE (1) //1标识下线检测跳过,使用默认值
 
 #if  BMS_MANUFACTURE==1
     #if BMS_INFO==1

+ 8 - 0
inc/hal_module_adapter.h

@@ -9,6 +9,8 @@ extern "C" {
 #include "can.h"
 
 #define USING_PRINTF
+#define DEBUGLOG
+
 #define GPS_DATA_RECV_BUFFER_SIZE     						(1024)
 
 #define I2C_INT1_REQ_BITMAP    								 (0x1)
@@ -185,6 +187,12 @@ INT8 HAL_Can_Transmit(CAN_Msg_Type Can_TxMsg);
 void  HAL_Can_Receive(CAN_Msg_Type* CanRxMsgBuffer);
 void UTCToBeijing(UTC8TimeType* UTC8Time,unsigned int UTCyear,unsigned char UTCmonth,unsigned char UTCday,unsigned int UTChour,unsigned char UTCminute,unsigned char UTCsecond);
 BOOL NB_ADC_Get(UINT32* adcValue, ADC_CHANNEL_TYPE adcChannel);
+
+#ifdef DEBUGLOG
+void Debug_Del_Logfile(void);
+void Debug_Read_Logfile(void);
+void Debug_printf(const UINT8 *format, ...);
+#endif
 #ifdef BL_FILE_LOG
 void bluejoy_printf(BlLogLevel level, const UINT8 *format, ...);
 void bluejoy_read_logfile(void);

+ 9 - 21
src/MainTask.c

@@ -106,8 +106,11 @@ static void MainTask(void* arg)
     TimerHandle_t work_timer = NULL;
     slpManWakeSrc_e Wakeup_source;
     Wakeup_source =  slpManGetWakeupSrc();//获取唤醒源
-    #ifdef USING_PRINTF
+    #ifdef USING_PRINTF1
         printf("Wakeup_source:%d \n",Wakeup_source);
+    #endif
+    #ifdef DEBUGLOG
+    Debug_printf("Wakeup_source:%d \n",Wakeup_source);
     #endif
 	appGetNVMSavedData();
     LoadAppDataInfo();
@@ -184,9 +187,6 @@ static void MainTask(void* arg)
                 osDelay(1000);
                 if(Work_timer_end)
                 {
-                    #ifdef USING_PRINTF
-                    printf("Main Task,Work_timer_end!\n");
-                    #endif
                     xTimerStop(montior_timer, 0);
                     PROC_MAIN_STATE_SWITCH(PROCESS_STATE_SLEEP);
                     break;
@@ -198,36 +198,21 @@ static void MainTask(void* arg)
                         case FAST_CHARGE_TEMP:
                          NB_ADC_Get(&adcValue,FAST_CHARGE_TEMP);
                          fastChargeTemp = LookUpRTtable(adcValue);
-                            #ifdef USING_PRINTF
-                                printf("FAST_CHARGE_TEMP:%d!\n",fastChargeTemp);
-                            #endif
                         break;
                         case NORMAL_CHARGE_TEMP:
                             NB_ADC_Get(&adcValue,NORMAL_CHARGE_TEMP);
                             normalChargeTemp = LookUpRTtable(adcValue);
-                            #ifdef USING_PRINTF
-                                printf("NORMAL_CHARGE_TEMP:%d!\n",normalChargeTemp);
-                            #endif
                         break;
                         case OTHER_TEMP_1:
                             NB_ADC_Get(&adcValue,OTHER_TEMP_1);
-                            heatTemp1 = LookUpRTtable(adcValue);
-                            #ifdef USING_PRINTF
-                                printf("OTHER_TEMP_1:%d!\n",heatTemp1);
-                            #endif                        
+                            heatTemp1 = LookUpRTtable(adcValue);                      
                         break;
                         case OTHER_TEMP_2:
                             NB_ADC_Get(&adcValue,OTHER_TEMP_2);
-                            heatTemp2 = LookUpRTtable(adcValue);
-                            #ifdef USING_PRINTF
-                                printf("OTHER_TEMP_2:%d!\n",heatTemp2);
-                            #endif                        
+                            heatTemp2 = LookUpRTtable(adcValue);                       
                         break;
                         case  VBAT:
                             NB_ADC_Get(&adcValue,VBAT);                        
-                            #ifdef USING_PRINTF
-                                printf("VBAT:%d!\n",adcValue);
-                            #endif
                             i = 0;
                         break;
                         default:
@@ -289,6 +274,9 @@ static void MainTask(void* arg)
                 #ifdef USING_PRINTF
                     printf("which slpstate can go now :%d \n",slpstate);
                 #endif
+                #ifdef DEBUGLOG
+                    Debug_printf("slpstate :%d \n",slpstate);
+                #endif
                 slpManDeepSlpTimerStart(deepslpTimerID, AppNVMData.sleepTime*1000*60);
                 UINT8 sleeptime_count=0;
                 while(1)

+ 69 - 11
src/TcpTask.c

@@ -75,6 +75,7 @@ static void TcpTask(void* arg)
     appSetEDRXSettingSync(0,5,1800000);
     appSetPSMSettingSync(1,3*60*60,10);
     appSetCFUN(1);
+    UINT8 Error_count=0;
     psEventQueueHandle = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(eventCallbackMessage_t*));
     PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
     if (psEventQueueHandle == NULL)
@@ -134,6 +135,16 @@ static void TcpTask(void* arg)
                     }
                     break;
                 case QMSG_ID_NW_IP_NOREACHABLE:
+                    if(Error_count>=10)
+                    {
+                        Error_count = 0;
+                        #ifdef DEBUGLOG
+                            Debug_printf("Tcp Connect failed , systerm restart !\n");
+                        #endif
+                        appSetCFUN(0);
+                        osDelay(1000);
+                        EC_SystemReset();
+                    }
                     break;
                 case QMSG_ID_SOCK_SENDPKG:
                     if (socContext.id >= 0 && socContext.status == APP_SOCKET_CONNECTION_CONNECTED)
@@ -142,6 +153,7 @@ static void TcpTask(void* arg)
                     }
                     else
                     {
+                        Error_count++;
                         sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
                         #ifdef USING_PRINTF
                             printf("connection %u or status invalid", socContext.id, socContext.status);
@@ -222,9 +234,9 @@ void TcpTaskDeInit(void *arg)
 /*------------------------------函数区域----------------------------------------------------------------------------------------------*/
 static void TcpDataInfoAssembleSend()
 {   static UINT32 send_counter = 0;
-    BattMsgtoTcpType BattToTcpInfo;
-    GPSMsgtoTcpType GpsToTcpInfo;
-    VersionMsgtoTcpType VerMsgToTcpInfo;
+    
+    
+    
     OsaUtcTimeTValue TimeStracture;
     UINT8 csq=0;
     INT8 snr=0;
@@ -239,7 +251,7 @@ static void TcpDataInfoAssembleSend()
     UINT8 WorkState=0;
 
     UINT16 year;
-    UINT8 month,day,hour,minite,sec;
+    UINT8 month,day,hour,minute,sec;
     UTC8TimeType UTC8TimeTcp;
     static UINT8 WorkFlag=0;
 	int i = 0;
@@ -282,15 +294,16 @@ static void TcpDataInfoAssembleSend()
     }    
     if(send_counter%BattSendFreq==0)
     {
+        BattMsgtoTcpType BattToTcpInfo;
         //osStatus_t result = osMutexAcquire(UartMutex, osWaitForever);
         appGetSystemTimeUtcSync(&TimeStracture);
         year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
         month=(TimeStracture.UTCtimer1&0xff00)>>8;
         day=TimeStracture.UTCtimer1&0xff;
         hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
-        minite=(TimeStracture.UTCtimer2&0xff0000)>>16;
+        minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
         sec=(TimeStracture.UTCtimer2&0xff00)>>8;
-        UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minite,sec);
+        UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
 
         appGetSignalInfoSync(&csq,&snr,&rsnr);
         DataLen= (UINT16)sizeof(BattToTcpInfo.battInfo);
@@ -375,15 +388,16 @@ static void TcpDataInfoAssembleSend()
     }
     if(send_counter%GpsSendFreq==0)
     {
+        GPSMsgtoTcpType GpsToTcpInfo;
         osStatus_t result = osMutexAcquire(GpsMutex, osWaitForever);
         appGetSystemTimeUtcSync(&TimeStracture);
         year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
         month=(TimeStracture.UTCtimer1&0xff00)>>8;
         day=TimeStracture.UTCtimer1&0xff;
         hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
-        minite=(TimeStracture.UTCtimer2&0xff0000)>>16;
+        minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
         sec=(TimeStracture.UTCtimer2&0xff00)>>8;
-        UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minite,sec);
+        UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
 
         DataLen= (UINT16)sizeof(GpsToTcpInfo.gpsInfo);
         GpsToTcpInfo.startSymbol[0] = TCP_START_SYM1;
@@ -424,8 +438,9 @@ static void TcpDataInfoAssembleSend()
             }
         }
     }
-    if(send_counter==0)
+    if(send_counter==1)//版本信息上报
     {
+        VersionMsgtoTcpType VerMsgToTcpInfo;
         CHAR iccid[20];
         CHAR imei[15];
         appGetIccidNumSync(iccid);
@@ -435,7 +450,7 @@ static void TcpDataInfoAssembleSend()
         month=(TimeStracture.UTCtimer1&0xff00)>>8;
         day=TimeStracture.UTCtimer1&0xff;
         hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
-        minite=(TimeStracture.UTCtimer2&0xff0000)>>16;
+        minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
         sec=(TimeStracture.UTCtimer2&0xff00)>>8;
         DataLen= (UINT16)sizeof(VerMsgToTcpInfo.VerInfo);
         VerMsgToTcpInfo.startSymbol[0] = TCP_START_SYM1;
@@ -502,9 +517,52 @@ static void TcpDataInfoAssembleSend()
         }
         else
         {
-            send_counter = 0;
+            send_counter = 1;
             return;
         }
+         #ifdef USING_PRINTF
+            printf("Version report! BmsSoftversion:%d.%d\n",bmsSwVersion/10,bmsSwVersion%10);
+        #endif
+    }
+    if(send_counter==0)//发送本次文件中的调试信息
+    {
+        Debug_Read_Logfile();
+        DebugMsgtoTcpType DebugMsgInfo;
+        appGetSystemTimeUtcSync(&TimeStracture);
+        year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
+        month=(TimeStracture.UTCtimer1&0xff00)>>8;
+        day=TimeStracture.UTCtimer1&0xff;
+        hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
+        minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
+        sec=(TimeStracture.UTCtimer2&0xff00)>>8;
+        UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
+        DataLen= (UINT16)sizeof(DebugMsgInfo.DebugInfo);
+        DebugMsgInfo.startSymbol[0] = TCP_START_SYM1;
+	    DebugMsgInfo.startSymbol[1] = TCP_START_SYM2;
+	    DebugMsgInfo.cmdSymbol = TCP_CMD_SYM;
+	    DebugMsgInfo.ansSymbol = TCP_ANS_SYM;
+        memcpy(DebugMsgInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
+        DebugMsgInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
+	    DebugMsgInfo.dataLength[0] = (DataLen>>8) & 0xFF;
+	    DebugMsgInfo.dataLength[1] = DataLen & 0xFF;
+        DebugMsgInfo.DebugInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF;	//year
+        DebugMsgInfo.DebugInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF;								//month
+        DebugMsgInfo.DebugInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF;									//day
+        DebugMsgInfo.DebugInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF;  						    //hour
+        DebugMsgInfo.DebugInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF;						    //mins
+        DebugMsgInfo.DebugInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF;							//sec
+        DebugMsgInfo.DebugInfo.msgMark = DEBUGMSG;
+        strcpy(DebugMsgInfo.DebugInfo.DataBuffer, "hello");
+        DebugMsgInfo.CRC = bcc_chk((UINT8 *)&DebugMsgInfo, sizeof(DebugMsgInfo)-1 );
+        //len = tcpipConnectionSend(socContext.id, (UINT8 *)&DebugMsgInfo, sizeof(DebugMsgInfo), 0, 0, 0);
+        #ifdef USING_PRINTF
+            printf("size of debugmsginfo = %d\n",sizeof(DebugMsgInfo));
+            printf("DebugMsgInfo!\n");
+            UINT8* p = (UINT8 *)&DebugMsgInfo;
+            for(i =0 ;i<sizeof(DebugMsgInfo);i++)
+                printf("%x ",*(p+i));
+        #endif
+        Debug_Del_Logfile();
     }
     if(send_counter>0xffff)
     {

+ 767 - 12
src/UartTask.c

@@ -42,6 +42,9 @@ extern AppDataBody AppDataInfo;
 BOOL UartBattInfoRecvFlag  = false;
 QueueHandle_t UartWriteCmdHandle = NULL;
 UINT8 BattChrgEndFlag;
+
+UINT8 Lockstatus;
+
 //
 
 extern ARM_DRIVER_USART Driver_USART1;
@@ -78,6 +81,9 @@ UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len);
 void SP_BMS_Update_Service();
 UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout);
 
+updateBMSStatus MS_BMS_Update_Service();
+UINT16 MS_BMS_Update_CRC16(UINT8* pSendData,UINT16 len);
+UINT8 MS_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout);
 //Uart线程任务区
 static void UartTask(void* arg)
 {
@@ -128,7 +134,7 @@ static void UartTask(void* arg)
                 }
                 else if(Timer_count%10==0)
                 {
-                    #ifdef USING_PRINTF
+                    #ifdef USING_PRINTF1
                         printf("[%d]Uart Timer 5s:%d,Header:%x\n",__LINE__,Timer_count,UartReadMsg.Header[2]);
                     #endif
                     if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK)
@@ -169,6 +175,16 @@ static void UartTask(void* arg)
 					// }
 				}
 				currentTimerCount = Timer_count;
+
+				//------------
+				if(Lockstatus)
+				{
+					BMS_Fota_update_flag = true;
+				}
+
+				//-----------
+
+
 				if(BMS_Fota_update_flag)
 				{
 					PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_UPDATE);
@@ -241,7 +257,14 @@ static void UartTask(void* arg)
                 break;
             }
 			case PROCESS_UART_STATE_UPDATE:
-				SP_BMS_Update_Service();
+				#if  BMS_MANUFACTURE==1
+				{
+					SP_BMS_Update_Service();
+				}		
+				#elif BMS_MANUFACTURE==2
+					MS_BMS_Update_Service();
+				#endif
+
 				PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
 				BMS_Fota_update_flag = FALSE;
 				break;
@@ -285,9 +308,6 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
    	packTemp = dataPtr[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+1)*2+1];
     
     Batt_current = (dataPtr[(0x02+BATT_CELL_VOL_NUM)*2]<<8)|(dataPtr[(0x02+BATT_CELL_VOL_NUM)*2+1]);
-    #ifdef USING_PRINTF
-		printf("Batt_current = %x\n",Batt_current);
-	#endif
     //原始数据:充电为负,放电为正
 	if(battWorkState==0x02&&Batt_current>0x8000)
 	{
@@ -311,9 +331,6 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
         //Batt_current = Batt_current;
     }
     battI = Batt_current;
-	#ifdef USING_PRINTF
-		printf("battI = %x\n",battI);
-	#endif
     //bit0 ~ bit31 represent cell0 ~ cell31
     battBalanceoInfo  = dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1] | (dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<8) + (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]<<16) | (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<24);
 
@@ -447,7 +464,7 @@ UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
         }
     }
     USARTdrv->Send((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg));
-    #ifdef USING_PRINTF
+    #ifdef USING_PRINTF1
         printf("Uart_Send_buffer:  ");
         for(int i=0;i<sizeof(Uart_Write_Msg);i++)
         {
@@ -505,7 +522,7 @@ UINT8 Uart_DataRecv_func(UINT8* Uart_Read_Msg,UINT8* Uart_Recv_Buffer)
     *(Uart_Read_Msg+6) = CRC_chk_buffer;
     *(Uart_Read_Msg+7)  = CRC_chk_buffer>>8;
     USARTdrv->Send(Uart_Read_Msg,8);
-    #ifdef USING_PRINTF
+    #ifdef USING_PRINTF1
         printf("Uart_Send_buffer:  ");
         for(int i=0;i<8;i++)
         {
@@ -1948,8 +1965,6 @@ UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 read
 			return 1;
 	}
 }
-
-
 UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len)
 {
 	UINT8 ret = 0;
@@ -1959,4 +1974,744 @@ UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len)
 			ret +=*(pSendData+i);
 	}
 	return ret&0xFF;
+}
+//________________________________________________________________________________
+updateBMSStatus MS_BMS_Update_Service() //美顺BMS升级服务
+{
+	#ifdef USING_PRINTF
+		UINT8 ii = 0;
+	#endif
+	
+	UINT8 errorCount = 0;	
+	UINT16 currentPackage = 0;	
+	UINT32 updateDataTotalByteLen = 0;
+	UINT16 updateDataPackageCount = 0;
+	UINT8  ReadNVMTemp[64];
+	UpdateStep_MS_BMS updateStep = MS_UPDATE_STEP_SEND_FIRMWARE_UPDATE_REQUEST_AND_JUMP_TO_BOOTLOADER;	
+	
+	
+	UINT16 i,j=0;
+	UINT8 dataLen = 0;
+	UINT8 ret0 = 0;
+	updateBMSStatus ret = updateFailed;
+		
+	UINT8 pUpdateMsgSend[80];
+	UINT32 updateMsgSendLen = 0;
+	UINT32 updateMsgReadLen = 0;
+	
+	BOOL bmsUpdateFlag = TRUE;
+	UINT8 bmsAnswerMsg[8];
+	
+	//static UpdateStep step = UPDATE_STEP_CHECK_VERSION;
+	UINT8 Cycle_conut = 0;
+	UINT16 CRCtemp = 0;
+	UINT8 headerLen = 5;
+
+	UINT8 checkSum = 0x00;
+	UINT8 checkSumCal = 0x00;
+	UINT8 tempLen = 0x00;	
+
+	BSP_QSPI_Read_Safe(&checkSum,FLASH_BMS_FOTA_START_ADDR,1);
+
+	memset(ReadNVMTemp, 0, 64);
+	BSP_QSPI_Read_Safe(ReadNVMTemp, FLASH_BMS_FOTA_START_ADDR+1, 4);  //data
+
+	updateDataTotalByteLen = ((ReadNVMTemp[0]<<24)&0xFF000000) | ((ReadNVMTemp[1]<<16)&0xFF0000) | ((ReadNVMTemp[2]<<8)&0xFF00) | (ReadNVMTemp[3]&0xFF) ;
+	updateDataPackageCount = (updateDataTotalByteLen+(64-1))/64;  //进一法 e = (a+(b-1))/b	
+
+	for(i=0; i<((updateDataTotalByteLen+4)+(64-1))/64;i++)
+	{
+		memset(ReadNVMTemp, 0, 64);
+		if((i+1)*64 < (updateDataTotalByteLen+4))
+		{	
+			tempLen = 64;
+			BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+1+i*64,64);
+		}
+		else
+		{
+			tempLen = (updateDataTotalByteLen+4) - i*64;
+			BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+1+i*64,tempLen);
+		}
+		
+		for(j = 0; j< tempLen; j++)
+		{
+			checkSumCal = (checkSumCal + ReadNVMTemp[j]) & 0xFF;
+		}
+		//osDelay(10);
+	}
+	if(checkSum != checkSumCal)
+	{
+		#ifdef USING_PRINTF
+			printf("checksum error: checksum = %x, checksumCal = %x\n",checkSum,checkSumCal);
+		#endif
+		ret = updateErrorCheckSumError;	
+		return ret;
+	}
+	else
+	{
+		#ifdef USING_PRINTF
+			printf("checksum OK: checksum = %x, checksumCal = %x\n",checkSum,checkSumCal);
+		#endif
+	}
+
+	#ifdef USING_PRINTF
+		printf(" bmsUpdateFlag = %x, Cycle_conut = %x\n",bmsUpdateFlag,Cycle_conut);
+	#endif
+	while(bmsUpdateFlag && Cycle_conut<2)
+	{
+		#ifdef USING_PRINTF
+			printf("update ms bms step %d\n:",updateStep);				
+		#endif
+		switch (updateStep)
+		{
+			
+			case MS_UPDATE_STEP_SEND_FIRMWARE_UPDATE_REQUEST_AND_JUMP_TO_BOOTLOADER:  //0x01				
+				dataLen = 0x00;
+				updateMsgSendLen = 6+dataLen;
+				updateMsgReadLen = 8;
+				
+				pUpdateMsgSend[0] = 0x01; //node byte
+				pUpdateMsgSend[1] = 0x40;	//func byte
+				pUpdateMsgSend[2] = updateStep; //cmd byte
+				pUpdateMsgSend[3] = dataLen;	//data len
+											//no data type
+				CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4);
+				pUpdateMsgSend[4] = (CRCtemp>>8)&0xFF; // CRC High
+				pUpdateMsgSend[5] = CRCtemp&0xFF;		//CRC Low
+				
+				memset((UINT8*)(bmsAnswerMsg) , 0, 8);
+				ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
+				#ifdef USING_PRINTF
+				printf("update step 1 answer,updateMsgReadLen = %x:\n",updateMsgReadLen);
+				
+				 for(ii=0;ii<updateMsgReadLen;ii++)
+					printf("%x ",bmsAnswerMsg[ii]);
+
+					printf("\nret0 = %d",ret0);
+					printf("\n");
+				#endif
+				if(ret0!=0)
+				{
+					if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40)  // node and func byte
+					{
+						if(bmsAnswerMsg[2] == MS_UPDATE_STEP_FIRMWARE_UPDATE_REQUEST_ANSWER && bmsAnswerMsg[3] == 0x02)	//answer cmd byte:0x02, answer data len:0x02
+						{
+							if(bmsAnswerMsg[4] == 0x00)	//answer data byte1
+							{
+								if(bmsAnswerMsg[5] == 0x00)	//answer data byte2
+								{
+									updateStep = MS_UPDATE_STEP_SEND_FIRMWARE_INFO;
+									errorCount = 0;
+								}
+							}
+							else if(bmsAnswerMsg[4] == 0x01) //不允许升级
+							{
+								if(bmsAnswerMsg[5] == 0x01)//电量过低
+								{
+									updateStep = MS_UPDATE_STEP_ERROR;
+									ret = updateErrorBMSPowerLow;
+								}
+								else if(bmsAnswerMsg[5] == 0x02)//电池存在保护状态不允许升级
+								{
+									updateStep = MS_UPDATE_STEP_ERROR;
+									ret = updateErrorBMSWarningProtect;
+								}
+								else if(bmsAnswerMsg[5] == 0x03) //不支持升级
+								{
+									updateStep = MS_UPDATE_STEP_ERROR;
+									ret = updateErrorBMSNotSurport;
+								}
+								else if(bmsAnswerMsg[5] == 0x04) //当前电池处于充放电状态
+								{
+									updateStep = MS_UPDATE_STEP_ERROR;
+									ret = updateErrorBMSWorkState;
+								}
+								else
+								{
+									errorCount++;
+								}
+							}						
+						}
+						else
+						{
+							errorCount++;
+						}
+					}
+					else
+					{
+						errorCount++;
+					}
+				}			
+				else
+				{
+					errorCount++;
+				}
+
+				if(errorCount>10)
+				{
+					updateStep = MS_UPDATE_STEP_ERROR;
+					errorCount = 0;
+				}								
+				osDelay(50);
+				printf(" step 1 ret = %d\n",ret);
+				break;
+			case MS_UPDATE_STEP_SEND_FIRMWARE_INFO:  //0x03
+				dataLen = 52;
+				updateMsgSendLen = 6+dataLen;
+				updateMsgReadLen = 7;
+				pUpdateMsgSend[0] = 0x01; //node byte
+				pUpdateMsgSend[1] = 0x40;	//func byte
+				pUpdateMsgSend[2] = updateStep; //cmd byte
+				pUpdateMsgSend[3] = dataLen;	//data len
+
+				memset(ReadNVMTemp, 0, 64);
+				BSP_QSPI_Read_Safe(ReadNVMTemp, FLASH_BMS_FOTA_START_ADDR+headerLen, 16);	//data
+				MEMCPY(&pUpdateMsgSend[4], ReadNVMTemp, 16);  //厂家信息,未开启校验
+				MEMCPY(&pUpdateMsgSend[4+16], ReadNVMTemp, 16);	//保护板硬件序列号,未开启校验
+				pUpdateMsgSend[4+16*2 + 0] = (updateDataTotalByteLen>>24)&0xFF;	//固件包大小
+				pUpdateMsgSend[4+16*2 + 1] = (updateDataTotalByteLen>>16)&0xFF;
+				pUpdateMsgSend[4+16*2 + 2] = (updateDataTotalByteLen>>8)&0xFF;
+				pUpdateMsgSend[4+16*2 + 3] = (updateDataTotalByteLen)&0xFF;				
+				MEMCPY(&pUpdateMsgSend[4+16*2+4], ReadNVMTemp, 16); // 固件包头信息,未开启校验
+				
+				CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4+dataLen);
+				
+				pUpdateMsgSend[4+dataLen] = (CRCtemp>>8)&0xFF; // CRC High
+				pUpdateMsgSend[5+dataLen] = CRCtemp&0xFF;		//CRC Low
+				
+				memset((UINT8*)(bmsAnswerMsg) , 0, 8);
+				ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
+				#ifdef USING_PRINTF
+				printf("update step 3 answer:\n");
+				 for(ii=0;ii<updateMsgReadLen;ii++)
+					printf("%x ",bmsAnswerMsg[ii]);
+
+					printf("\nret0 = %d",ret0);
+					printf("\n");
+				#endif
+				if(ret0!=0)
+				{
+					if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40)  // node and func byte
+					{
+						if(bmsAnswerMsg[2] == MS_UPDATE_STEP_FIRMWARE_INFO_CHECK_AND_UPDATE_REQEST_ANSWER && bmsAnswerMsg[3] == 0x01)	//answer cmd byte:0x04, answer data len:0x01
+						{
+							if(bmsAnswerMsg[4] == 0x00)	//answer data byte1
+							{								
+								updateStep = MS_UPDATE_STEP_EREASE_APP_FLASH_REQUEST;
+								errorCount = 0;
+							}
+							else if(bmsAnswerMsg[4] == 0x01) //厂家信息错误
+							{
+								errorCount++;
+								ret = updateErrorFirmwareInfoError;
+							}		
+							else if(bmsAnswerMsg[4] == 0x02) //硬件序列号不匹配
+							{
+								errorCount++;
+								ret = updateErrorFirmwareInfoError;
+							}
+							else if(bmsAnswerMsg[4] == 0x03) //固件大小超出范围
+							{
+								errorCount++;
+								ret = updateErrorFirmwareSizeError;
+							}
+							else if(bmsAnswerMsg[4] == 0x04) //固件包头信息错误
+							{
+								errorCount++;
+								ret = updateErrorFirmwareInfoError;
+							}
+							else
+							{
+								errorCount++;
+							}
+						}
+						else
+						{
+							errorCount++;
+						}
+					}
+					else
+					{
+						errorCount++;
+					}
+				}			
+				else
+				{
+					errorCount++;
+				}
+
+				if(errorCount>10)
+				{
+					updateStep = MS_UPDATE_STEP_ERROR;
+					errorCount = 0;
+				}		
+				printf(" step 3 ret = %d\n",ret);
+				osDelay(50);
+				break;
+			case MS_UPDATE_STEP_EREASE_APP_FLASH_REQUEST:  //0x05
+				dataLen = 0;
+				updateMsgSendLen = 6+dataLen;
+				updateMsgReadLen = 8;
+				pUpdateMsgSend[0] = 0x01; //node byte
+				pUpdateMsgSend[1] = 0x40;	//func byte
+				pUpdateMsgSend[2] = updateStep; //cmd byte
+				pUpdateMsgSend[3] = dataLen;	//data len				
+				
+				CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4+dataLen);
+				
+				pUpdateMsgSend[4+dataLen] = (CRCtemp>>8)&0xFF; // CRC High
+				pUpdateMsgSend[5+dataLen] = CRCtemp&0xFF;		//CRC Low
+				
+				memset((UINT8*)(bmsAnswerMsg) , 0, 8);
+				ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
+				#ifdef USING_PRINTF
+				printf("update step 5 answer:\n");
+				 for(ii=0;ii<updateMsgReadLen;ii++)
+					printf("%x ",bmsAnswerMsg[ii]);
+
+					printf("\nret0 = %d",ret0);
+					printf("\n");
+				#endif
+				if(ret0!=0)
+				{
+					if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40)  // node and func byte
+					{
+						if(bmsAnswerMsg[2] == MS_UPDATE_STEP_EREASE_FLASH_ANSWER && bmsAnswerMsg[3] == 0x02)	//answer cmd byte:0x06, answer data len:0x02
+						{
+							if(bmsAnswerMsg[4] == 0x00)	//answer data byte1, erease successed
+							{								
+								updateStep = MS_UPDATE_STEP_SEND_UPDATE_DATA; //0x07
+								errorCount = 0;
+							}
+							else if(bmsAnswerMsg[4] == 0x01) //擦除失败
+							{
+								errorCount++;
+								ret = updateErrorAppErease;
+							}							
+							else
+							{
+								errorCount++;
+							}
+						}
+						else
+						{
+							errorCount++;
+						}
+					}
+					else
+					{
+						errorCount++;
+					}
+				}			
+				else
+				{
+					errorCount++;
+				}
+
+				if(errorCount>10)
+				{
+					updateStep = MS_UPDATE_STEP_ERROR;
+					errorCount = 0;
+				}								
+				osDelay(50);
+				break;
+			case MS_UPDATE_STEP_SEND_UPDATE_DATA:  //0x07
+				
+				updateMsgReadLen = 7;
+				pUpdateMsgSend[0] = 0x01; //node byte
+				pUpdateMsgSend[1] = 0x40;	//func byte
+				pUpdateMsgSend[2] = updateStep; //cmd byte
+				
+				for(i = 0; i < updateDataPackageCount ; i++ )	
+				{					
+					
+
+					memset(ReadNVMTemp, 0, 64);
+					
+					if((i+1)*64 < (updateDataTotalByteLen))
+					{	
+						tempLen = 64;
+						BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+headerLen+i*64,64);
+					}
+					else
+					{
+						tempLen = (updateDataTotalByteLen+4) - i*64;
+						BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+headerLen+i*64,tempLen);
+					}
+
+					CRCtemp = MS_BMS_Update_CRC16(ReadNVMTemp, tempLen);
+
+					dataLen = tempLen+6;  //data len =count(2+2 byte) + crc(2byte) +  update data len
+					updateMsgSendLen = 6+dataLen; // updateMsgSendLen = data len + header len(6byte)
+
+					pUpdateMsgSend[3] = dataLen;	//data len
+					
+					pUpdateMsgSend[4] = ((i+1)>>8)&0xFF;  //当前包序号,大端模式
+					pUpdateMsgSend[5] = (i+1)&0xFF;
+
+					pUpdateMsgSend[6] = (updateDataPackageCount>>8)&0xFF;
+					pUpdateMsgSend[7] = updateDataPackageCount&0xFF;
+					pUpdateMsgSend[8] = (CRCtemp>>8)&0xFF; // data CRC High
+					pUpdateMsgSend[9] = CRCtemp&0xFF;		//data CRC Low					
+					
+					MEMCPY(&pUpdateMsgSend[4+6], ReadNVMTemp, 64);  //升级数据,64字节
+					
+					
+					CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4+dataLen);
+					
+					pUpdateMsgSend[4+dataLen] = (CRCtemp>>8)&0xFF; // CRC High
+					pUpdateMsgSend[5+dataLen] = CRCtemp&0xFF;		//CRC Low
+					
+					memset((UINT8*)(bmsAnswerMsg) , 0, 8);
+					ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
+					#ifdef USING_PRINTF
+						printf("update step 7 answer:\n");
+					 for(ii=0;ii<updateMsgReadLen;ii++)
+						printf("%x ",bmsAnswerMsg[ii]);
+
+						printf("\nret0 = %d",ret0);
+						printf("\n");
+					#endif
+					if(ret0!=0)
+					{
+						if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40)  // node and func byte
+						{
+							if(bmsAnswerMsg[2] == MS_UPDATE_STEP_UPDATE_DATA_WRITE_ANSWER && bmsAnswerMsg[3] == 0x01)	//answer cmd byte:0x04, answer data len:0x01
+							{
+								if(bmsAnswerMsg[4] == 0x00)	//answer data byte1,接收并操作成功
+								{								
+									updateStep = MS_UPDATE_STEP_EREASE_APP_FLASH_REQUEST;
+									errorCount = 0;
+								}
+								else if(bmsAnswerMsg[4] == 0x01) //固件块校验失败
+								{
+									errorCount=10;
+									ret = updateErrorPackageCRC;
+								}		
+								else if(bmsAnswerMsg[4] == 0x02) //烧写失败
+								{
+									errorCount=10;
+									ret = updateErrorPackageWrite;
+								}
+								else if(bmsAnswerMsg[4] == 0x03) //固件块编号异常
+								{
+									errorCount=10;
+									ret = updateErrorPackageNo;
+								}								
+								else
+								{
+									errorCount=10;
+								}
+							}
+							else
+							{
+								errorCount=10;
+							}
+						}
+						else
+						{
+							errorCount=10;
+						}
+					}			
+					else
+					{
+						errorCount=10;
+					}
+
+					if(errorCount>=10)
+					{
+						updateStep = MS_UPDATE_STEP_ERROR;
+						errorCount = 0;
+						i--;
+						break;
+					}								
+					osDelay(50);
+				}
+				if(i == updateDataPackageCount)
+				{
+					updateStep = MS_UPDATE_STEP_SEND_UPDATE_DATA_END_AND_JUMP_TO_APP;
+				}
+				break;
+			case MS_UPDATE_STEP_SEND_UPDATE_DATA_END_AND_JUMP_TO_APP:  //0x09
+				dataLen = 0x00;
+				updateMsgSendLen = 6+dataLen;
+				updateMsgReadLen = 7;
+				
+				pUpdateMsgSend[0] = 0x01; //node byte
+				pUpdateMsgSend[1] = 0x40;	//func byte
+				pUpdateMsgSend[2] = updateStep; //cmd byte
+				pUpdateMsgSend[3] = dataLen;	//data len
+											//no data type
+				CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4);
+				pUpdateMsgSend[4] = (CRCtemp>>8)&0xFF; // CRC High
+				pUpdateMsgSend[5] = CRCtemp&0xFF;		//CRC Low
+				
+				memset((UINT8*)(bmsAnswerMsg) , 0, 8);
+				ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
+				#ifdef USING_PRINTF
+				printf("update step 9 answer:\n");
+				 for(ii=0;ii<updateMsgReadLen;ii++)
+					printf("%x ",bmsAnswerMsg[ii]);
+
+					printf("\nret0 = %d",ret0);
+					printf("\n");
+				#endif
+				if(ret0!=0)
+				{
+					if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40)  // node and func byte
+					{
+						if(bmsAnswerMsg[2] == MS_UPDATE_STEP_JUMP_TO_APP_ANSWER && bmsAnswerMsg[3] == 0x01)	//answer cmd byte:0x0A, answer data len:0x01
+						{
+							if(bmsAnswerMsg[4] == 0x00)	//answer data byte1, update succeed
+							{
+								errorCount = 0;
+								updateStep = MS_UPDATE_STEP_READ_CURRENT_RUNNING_MODE; //0x0B
+							}
+							else if(bmsAnswerMsg[4] == 0x01) //升级失败
+							{
+								errorCount = 10;
+								ret = updateFailed;
+							}						
+						}
+						else
+						{
+							errorCount++;
+						}
+					}
+					else
+					{
+						errorCount++;
+					}
+				}			
+				else
+				{
+					errorCount++;
+				}
+
+				if(errorCount>=10)
+				{
+					updateStep = MS_UPDATE_STEP_ERROR;
+					errorCount = 0;
+				}								
+				osDelay(50);
+				break;
+			case MS_UPDATE_STEP_READ_CURRENT_RUNNING_MODE:  //0x0B
+				dataLen = 0x00;
+				updateMsgSendLen = 6+dataLen;
+				updateMsgReadLen = 8;
+				
+				pUpdateMsgSend[0] = 0x01; //node byte
+				pUpdateMsgSend[1] = 0x40;	//func byte
+				pUpdateMsgSend[2] = updateStep; //cmd byte
+				pUpdateMsgSend[3] = dataLen;	//data len
+											//no data type
+				CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4);
+				pUpdateMsgSend[4] = (CRCtemp>>8)&0xFF; // CRC High
+				pUpdateMsgSend[5] = CRCtemp&0xFF;		//CRC Low
+				
+				memset((UINT8*)(bmsAnswerMsg) , 0, 8);
+				ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
+				#ifdef USING_PRINTF
+				printf("update step A answer:\n");
+				 for(ii=0;ii<updateMsgReadLen;ii++)
+					printf("%x ",bmsAnswerMsg[ii]);
+
+					printf("\nret0 = %d",ret0);
+					printf("\n");
+				#endif
+				if(ret0!=0)
+				{
+					if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40)  // node and func byte
+					{
+						if(bmsAnswerMsg[2] == MS_UPDATE_STEP_CURRENT_RUNNING_MODE_ANSWER && bmsAnswerMsg[3] == 0x02)	//answer cmd byte:0x0C, answer data len:0x02
+						{
+							if(bmsAnswerMsg[4] == 0x01)	//answer data byte1, update succeed, app is running
+							{
+								errorCount = 0;
+								updateStep = MS_UPDATE_STEP_END;
+							}
+							else if(bmsAnswerMsg[4] == 0x00) //update failed , boot is running,error
+							{
+								errorCount = 10;
+							}						
+						}
+						else
+						{
+							errorCount++;
+						}
+					}
+					else
+					{
+						errorCount++;
+					}
+				}			
+				else
+				{
+					errorCount++;
+				}
+
+				if(errorCount>=3)
+				{
+					updateStep = MS_UPDATE_STEP_ERROR;
+					errorCount = 0;
+				}								
+				osDelay(50);
+				break;
+			case MS_UPDATE_STEP_END: //0x0D
+				errorCount = 0;
+				bmsUpdateFlag = FALSE;
+				ret = updateOK;
+				break;
+			case MS_UPDATE_STEP_ERROR:	//0x0E
+				errorCount = 0;
+				bmsUpdateFlag = true;
+				Cycle_conut++;
+				if(Cycle_conut>2)
+				{
+					ret = updateErrorTimeout;
+					bmsUpdateFlag = FALSE;
+				}
+				break;
+			default:
+				bmsUpdateFlag = FALSE;
+				break;
+		}
+	}
+	#ifdef USING_PRINTF
+		printf("last ret = %x\n",ret);
+	#endif
+	return ret;
+
+}
+UINT8 MS_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout)
+{
+
+	UINT8 timeCount = 0;
+	UINT8 j=0;
+	USARTdrv->Send(pSend,sendLen);
+	#ifdef USING_PRINTF
+		printf("query in:");
+		for(j=0;j<sendLen;j++)
+		{
+			printf("%x ",*(pSend+j));
+		}
+		printf("\n");	
+	#endif
+	if(readLen>0)
+	{
+		USARTdrv->Receive(pRead,readLen);         
+		while((isRecvTimeout == false) && (isRecvComplete == false))
+		{
+			timeCount++;
+			osDelay(100);
+			if (timeCount>=timeout/100)
+			{
+				timeCount =0;
+				isRecvTimeout = true;
+				break;
+			}
+		}
+		#ifdef USING_PRINTF
+			printf("\nanswer in:");
+			for(j=0;j<readLen;j++)
+			{
+				printf("%x ",*(pRead+j));
+			}
+			printf("\n");
+		#endif	
+		if (isRecvComplete == true)
+		{
+			isRecvComplete = false;
+			if(*(pRead+0)!=0x01)
+			{
+				USARTdrv->Uninitialize();
+				osDelay(100);
+				USARTdrv->Initialize(USART_callback);
+				USARTdrv->PowerControl(ARM_POWER_FULL);
+				USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
+						ARM_USART_DATA_BITS_8 |
+						ARM_USART_PARITY_NONE |
+						ARM_USART_STOP_BITS_1 |
+						ARM_USART_FLOW_CONTROL_NONE, 9600);
+				#ifdef USING_PRINTF
+					printf("\nuart reset in \n");	
+				#endif
+				return  0;
+			}
+			return readLen;
+		}
+		else
+		{
+			memset(pRead,0x00,readLen);
+			isRecvTimeout = false;
+			return 0;
+		}
+	}
+	else
+	{
+			return 1;
+	}
+}
+
+
+
+static void __invert_uint8(UINT8* dBuf, UINT8* srcBuf)
+{
+	 int i;
+	 UINT8 tmp[4];
+	 tmp[0] = 0;
+	 for (i = 0;i < 8;i++)
+	 {
+		  if(srcBuf[0] & (1 << i))
+		  {
+		   	tmp[0] |= 1<<(7-i);
+		  }
+	 }
+	 dBuf[0] = tmp[0];
+}
+
+
+static void __invert_uint16(UINT16* dBuf, UINT16* srcBuf)
+{
+	 int i;
+	 UINT16 tmp[4];
+	 tmp[0] = 0;
+	 for (i = 0;i < 16;i++)
+	 {
+		  if(srcBuf[0] & (1 << i))
+		  {
+		   	tmp[0] |= 1 << (15 - i);
+		  }
+	 }
+	 dBuf[0] = tmp[0];
+}
+
+UINT16 MS_BMS_Update_CRC16(UINT8* pSendData,UINT16 len)
+{
+	
+	UINT16 wCRCin = 0xFFFF;
+	UINT16 wCPoly = 0x8005;
+	UINT8 wChar = 0;
+	UINT16 crc_rslt = 0;
+	int i;
+	while (len--)
+	{
+		wChar = *(pSendData++);
+		__invert_uint8(&wChar, &wChar);
+		wCRCin ^= (wChar << 8);
+		for (i = 0;i < 8;i++)
+		{
+			if(wCRCin & 0x8000)
+			{
+				wCRCin = (wCRCin << 1) ^ wCPoly;
+			}
+			else
+			{
+				wCRCin = wCRCin << 1;
+			}
+		}
+	}
+	__invert_uint16(&wCRCin, &wCRCin);
+	crc_rslt = ((wCRCin << 8) & 0xFF00) | ((wCRCin >> 8) & 0x00FF);
+	return (crc_rslt);
 }

+ 8 - 2
src/bsp_custom.c

@@ -17,6 +17,7 @@
 #ifdef BL_FILE_LOG
 extern uint8_t lockoutState;
 #endif
+extern UINT8 Lockstatus;
 
 void GPR_SetUartClk(void)
 {
@@ -98,14 +99,19 @@ slpManSlpState_t CheckUsrdefSlpStatus(void)
   \param     void
  */
 void CheckLockOutState(void){
-	if((slpManGetWakeupPinValue() & (0x1<<2)) == 0){
+	if((slpManGetWakeupPinValue() & (0x1<<2)) == 0)
+    {
 		#ifdef USING_PRINTF
 			printf("LOCK_OUT DOWN\r\n");
 		#endif	
+        Lockstatus = true;
 		 #ifdef BL_FILE_LOG
 			 lockoutState=1;
 		#endif
-	}else{
+	}
+    else
+    {
+        Lockstatus = false;
 		#ifdef USING_PRINTF
 			printf("LOCK_OUT UP\r\n",__LINE__);
 		#endif	

+ 107 - 5
src/hal_module_adapter.c

@@ -260,13 +260,115 @@ void UTCToBeijing(UTC8TimeType* UTC8Time,unsigned int UTCyear,unsigned char UTCm
 	UTC8Time->minute = UTCminute;
 	UTC8Time->second = UTCsecond;
 }
-
-#ifdef BL_FILE_LOG
 #include <stdarg.h>
+#ifdef DEBUGLOG
+static UINT8 DebugFileNux=0;
+static void Debug_Write_Logfile(UINT8 * buf)
+{
+	int32_t err;
+	UINT32 Count;
+	OSAFILE file;
+	while(DebugFileNux){
+		 osDelay(10/portTICK_PERIOD_MS);
+	}
+	DebugFileNux=1;
+	file = OsaFopen("DebugFile","wb");
+	if(file==NULL){
+		DebugFileNux=0;
+		return;
+	}
+	if(OsaFseek(file, 0, SEEK_END) != 0)
+	{
+	    OsaFclose(file);
+	    DebugFileNux=0;
+	    return;
+	}
+	Count = OsaFwrite(buf, 1, strlen(buf), file);
+	if(Count != (strlen(buf))){
+	}
+	OsaFclose(file);
+	DebugFileNux=0;
+}
+void Debug_printf(const UINT8 *format, ...)
+ {
+	UINT8 buf[128+1];
+	va_list args;
+	OsaUtcTimeTValue    timeUtc;
+	UINT16 year;
+	UINT8 month,day,hour,minute,sec;
+	appGetSystemTimeUtcSync(&timeUtc);
+	year=(timeUtc.UTCtimer1&0xffff0000)>>16;
+	month=(timeUtc.UTCtimer1&0xff00)>>8;
+	day=timeUtc.UTCtimer1&0xff;
+	hour=(timeUtc.UTCtimer2&0xff000000)>>24;
+	minute=(timeUtc.UTCtimer2&0xff0000)>>16;
+	sec=(timeUtc.UTCtimer2&0xff00)>>8;
+	memset(buf,0,128+1);
+	UTC8TimeType UTC8TimeStruct;
+	UTCToBeijing((UTC8TimeType *)&UTC8TimeStruct,year,month,day,hour,minute,sec);
+	sprintf((char *)buf,"%04d-%02d-%02d %02d:%02d:%02d ",UTC8TimeStruct.year,UTC8TimeStruct.month,UTC8TimeStruct.day,UTC8TimeStruct.hour,UTC8TimeStruct.minute,UTC8TimeStruct.second);
+	va_start(args, format);
+	vsnprintf(buf+strlen(buf), 128-strlen(buf), format, args);
+	va_end(args);
+	Debug_Write_Logfile(buf);
+}
+void Debug_Read_Logfile(void)
+{
+	int32_t err;
+	UINT32 Count;
+	OSAFILE file;
+	UINT8 rbuf[128+1]={0};
+	UINT8 * flag_p;
+	UINT16 pri_l; 
+	printf("%s start\r\n",__FUNCTION__);
+	while(DebugFileNux){
+		 osDelay(10/portTICK_PERIOD_MS);
+	}
+	DebugFileNux=1;
+	file = OsaFopen("DebugFile","rb");
+	if(file==NULL){
+		printf("blLog not exst!\r\n");
+		DebugFileNux=0;
+		return;
+	}
+	if(OsaFseek(file, 0, SEEK_SET) != 0)
+	{
+	    printf("Seek file failed [%d] \r\n",__LINE__);
+	    OsaFclose(file);
+	    DebugFileNux=0;
+	    return;
+	}
+	do{	
+		memset(rbuf,0,128);
+		Count = OsaFread(rbuf, 1, 128, file);
+		printf("%s",rbuf);
+				
+	}while(Count==128);
+	OsaFclose(file);
+	DebugFileNux=0;
+	printf("%s end! \r\n",__FUNCTION__);
+}
+void Debug_Del_Logfile(void)
+{
+	UINT32 ret;
+	//printf("%s start! \r\n",__FUNCTION__);
+	while(DebugFileNux){
+		 osDelay(10/portTICK_PERIOD_MS);
+	}
+	DebugFileNux=1;
+	OsaFremove("DebugFile");
+	DebugFileNux=0;
+	FaultDisplay(LED_TURN_OFF);
+	 osDelay(1000/portTICK_PERIOD_MS);
+	FaultDisplay(LED_TURN_ON);
+	 osDelay(1000/portTICK_PERIOD_MS);
+	FaultDisplay(LED_TURN_OFF);
+	 osDelay(1000/portTICK_PERIOD_MS);
+	FaultDisplay(LED_TURN_ON);
+}
+#endif
+#ifdef BL_FILE_LOG
 static UINT8 blLogFileNux=0;
-
-//UTCת»»Îª±±¾©Ê±¼ä  º¯Êý¿ÉÖ±½Óµ÷ÓÃ
-
 static void bluejoy_write_logfile(UINT8 * buf)
 {
 	int32_t err;