Browse Source

V7.2.2_20230725
基于上一版本优化第一次开机EEPROM和FLASH的处理逻辑,避免异常情况导致数据被还原。

Dail 2 năm trước cách đây
mục cha
commit
de4d482171

+ 10 - 0
Core/Src/main.c

@@ -162,6 +162,9 @@ int main(void)
 	EEPROM_Flash_Erase(EEPROM_FLASH_BEGIN_ADDRESS, EEPROM_FLASH_END_ADDRESS);
 	#endif
 	
+	//根据EEPROM里存储的开机次数确定是否首次开机
+	IsFirstPowerOnFlag = CheckFactoryModeFromEEPROM(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1);
+	
 	//EEPROM_Flash初始化	
 	EEPROM_Flash_Check();//第一次运行 113ms,正常运行 1ms
 	
@@ -221,8 +224,10 @@ int main(void)
 		  	RunPeriodTestCnt = 0;
 			}
 			#endif
+			
 			//硬件版本识别
 			GetHardware_Versin( HardwareVersion_AD );
+			
 			//无码表模式初始化处理
 			NoPBUMode_Ini();	
 			//CAN数据解析及处理
@@ -308,6 +313,9 @@ int main(void)
 			  ErrorLogSave_Process(&MC_ErrorLogSaveInfo, &IsErrorLogSaveInfoUpdateFlag);
 				RunLogSave_Process(&RunLogSaveIndex);
 			}
+			
+			#if 1
+			//异常掉电时保存里程数据
 			if(PowerDown_SaveFlag==TRUE)
 			{	
 				MC_PowerOffBkp.ODO_Km = MC_RideLog.ODO_Km;
@@ -319,6 +327,8 @@ int main(void)
 				SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, (uint8_t*)"FLAG", 4); //掉电存储的数据标志更新
 				PowerDown_SaveFlag = FALSE;
 			}
+			#endif
+			
 			#if 1
 			//故障检测
 			MC_Fault_Check_Process();

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2443 - 2443
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 1 - 0
User/Inc/eeprom_24c02.h

@@ -45,5 +45,6 @@ int8_t SavePowerOffBakData(I2C_Handle_Struct_t* I2C_Handle, TrueOrFalse_Flag_Str
 void EEPROM_24C02_ParamReset(I2C_Handle_Struct_t* I2C_Handle);
 void EEPROM_24C02_LogReset(I2C_Handle_Struct_t* I2C_Handle);
 int8_t RunLogSave_Process(uint8_t* RunLogIndex);
+TrueOrFalse_Flag_Struct_t CheckFactoryModeFromEEPROM(I2C_Handle_Struct_t* I2C_Handle, uint8_t Addr);
 
 #endif

+ 2 - 0
User/Inc/eeprom_flash.h

@@ -28,6 +28,8 @@
 extern TrueOrFalse_Flag_Struct_t IsPowerOffDataBkp_SaveFlag;
 extern TrueOrFalse_Flag_Struct_t IsFlashSaveDataUpdate;
 
+extern void CopyDataToEEPROM_Flash(void);
+extern void CopyDataFromEEPROM_Flash(void);
 extern void FLASH_Write(uint32_t FlashAddress, uint32_t* Data, uint16_t DataLength);
 extern void EEPROM_Flash_Erase(uint32_t BeginAddress, uint32_t EndAddress);
 extern int8_t ReadDataFromEEPROM_Flash(uint32_t FlashAddress, uint8_t* Data, uint8_t Length); // Length±ØÐëΪ4µÄ±¶Êý

+ 1 - 0
User/Inc/var.h

@@ -498,6 +498,7 @@ extern uint16_t SpeedRatio;
 extern uint16_t HardwareVersion_AD;
 extern TrueOrFalse_Flag_Struct_t VersionIdentifyFinishedFlag;
 extern TrueOrFalse_Flag_Struct_t PowerDown_SaveFlag;
+extern TrueOrFalse_Flag_Struct_t IsFirstPowerOnFlag;
 /**************************全局变量声明End***************************/
 
 /**************************全局函数声明Begin*************************/

+ 3 - 1
User/Src/can_process.c

@@ -595,7 +595,8 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				{
 				  if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
 					{
-					  EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_FLAG, EEPROM_24C02_ADDR_FLAG + 4, 0xFF);
+					  EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_FLAG, EEPROM_24C02_ADDR_FLAG + 4, 0xFF);//清除标志位
+						EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, EEPROM_24C02_ADDR_RUN_LOG1 + 4, 0xFF);//清除开机次数
 						EEPROM_Flash_Erase(EEPROM_FLASH_BEGIN_ADDRESS, EEPROM_FLASH_END_ADDRESS);
 						EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN, LOG_ADDRESS_END);
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
@@ -610,6 +611,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					{
 					  Var_SetToDefaultParam();
 						EEPROM_24C02_ParamReset(&I2C_Handle_EEPROM);
+						CopyDataToEEPROM_Flash();
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 				  	__set_FAULTMASK(1);//关闭所有中断
 			      HAL_NVIC_SystemReset();

+ 20 - 2
User/Src/eeprom_24c02.c

@@ -334,9 +334,13 @@ int8_t EEPROM_24C02_Check(I2C_Handle_Struct_t* I2C_Handle)
 	{
 		return(CopyDataFromEEpprom_24C02(I2C_Handle));
 	}
-	else //数据无效
+	else if(IsFirstPowerOnFlag == TRUE) // 数据无效且开机次数为0时,写入默认参数
 	{
-		return (CopyDefaultDataToEEpprom_24C02(I2C_Handle));
+		return(CopyDefaultDataToEEpprom_24C02(I2C_Handle));
+	}
+	else
+	{
+	  return ACK_FAIL;
 	}
 }
 
@@ -471,3 +475,17 @@ int8_t RunLogSave_Process(uint8_t* RunLogIndex)
 	}
 	return 0;
 }
+
+//根据历史信息中开机次数判断是否进行第一次开机
+TrueOrFalse_Flag_Struct_t CheckFactoryModeFromEEPROM(I2C_Handle_Struct_t* I2C_Handle, uint8_t Addr)
+{
+  uint8_t Temp_8[4] = {0}; 
+	
+	//读取存储标志并计算校验码
+	EEPROM_24C02_ReadOneByte(I2C_Handle, Addr, Temp_8);
+	EEPROM_24C02_ReadOneByte(I2C_Handle, Addr + 1, (Temp_8 + 1));
+	EEPROM_24C02_ReadOneByte(I2C_Handle, Addr + 2, (Temp_8 + 2));
+	EEPROM_24C02_ReadOneByte(I2C_Handle, Addr + 3, (Temp_8 + 3));
+	
+	return((Temp_8[0] & Temp_8[1] & Temp_8[2] & Temp_8[3] == 0xFF) ? TRUE : FALSE);
+}

+ 5 - 6
User/Src/eeprom_flash.c

@@ -7,9 +7,9 @@ FLASH_EraseInitTypeDef EEPROM_AreaEraseInitStruct;
 TrueOrFalse_Flag_Struct_t IsPowerOffDataBkp_SaveFlag = FALSE;
 TrueOrFalse_Flag_Struct_t IsFlashSaveDataUpdate = FALSE;
 
-/****************************局函数定义******************************/
+/****************************局函数定义******************************/
 //数据写入
-static void CopyDataToEEPROM_Flash(void)
+void CopyDataToEEPROM_Flash(void)
 {
 	uint32_t Temp_32[2];
 	//Flash页擦除
@@ -40,7 +40,7 @@ static void CopyDataToEEPROM_Flash(void)
 	FLASH_Write(EEPROM_FLASH_ADDR_FLAG, Temp_32, 2);
 }
 
-static void CopyDataFromEEPROM_Flash(void)
+void CopyDataFromEEPROM_Flash(void)
 {
   uint8_t Data_Buf[64];
 	int8_t Error_OK; 
@@ -102,7 +102,6 @@ static void CopyDataFromEEPROM_Flash(void)
 			
 }
 
-/****************************全局函数定义******************************/
 //指定地址写入指定长度数据类型为32bit数据
 void FLASH_Write(uint32_t FlashAddress, uint32_t* Data, uint16_t DataLength)
 {
@@ -211,11 +210,11 @@ void EEPROM_Flash_Check(void)
 	FlagResult = CRC32_Calculate(DataBuf, 4);
 	
 	//判断数据是否有效
-	if((FlagResult - FlagCrc) == 0)//数据有效
+	if((FlagResult - FlagCrc) == 0) //数据有效
 	{
 	  CopyDataFromEEPROM_Flash();
 	}
-	else//数据无效
+	else if(IsFirstPowerOnFlag == TRUE) //数据无效且开机次数为0时,写入默认参数
 	{
 		CopyDataToEEPROM_Flash();
 	}

+ 7 - 5
User/Src/protect_check.c

@@ -253,16 +253,18 @@ void MC_Protect_OverHeat_Process(uint8_t T_MCU, uint8_t T_PCB, uint8_t T_Coil, u
 	
 	if(p_MC_ErrorCode->ERROR_Bit.Protect_OverTemp == 0)
 	{
-		if( MC_HallSensorData.InverterExistFlag==TRUE ) 
-		{	//单片机100度保护,绕组130度保护
-			if( (T_PCB < (TH - 25))&&(T_Coil < (TH + 5)) ) 
+		//旧板无MOS温度传感器,根据PCB温度和绕组温度
+		if( MC_HallSensorData.InverterExistFlag==TRUE )
+		{	//PCB板100度保护,绕组135度保护
+			if( (T_PCB < (TH - 25))&&(T_Coil < (TH + 10)) ) 
 			{
 				OT_Set_TimeCnt = HAL_GetTick();
 			}
 		}
+		//新板有MOS温度传感器,根据PCB温度、MOS温度、绕组温度
 		else
-		{ //单片机90度保护,绕组130度保护,MOS管105度保护
-			if( (T_PCB < (TH - 35))&&(T_Coil < (TH + 5))&&(T_MCU < (TH - 20)) ) 
+		{ //单片机100度保护,绕组135度保护,MOS管105度保护
+			if( (T_PCB < (TH - 25))&&(T_Coil < (TH + 10))&&(T_MCU < (TH - 20)) ) 
 			{
 				OT_Set_TimeCnt = HAL_GetTick();
 			}

+ 9 - 3
User/Src/var.c

@@ -43,6 +43,7 @@ uint16_t SpeedRatio;
 uint16_t HardwareVersion_AD=0;
 TrueOrFalse_Flag_Struct_t VersionIdentifyFinishedFlag = FALSE;
 TrueOrFalse_Flag_Struct_t PowerDown_SaveFlag = FALSE;
+TrueOrFalse_Flag_Struct_t IsFirstPowerOnFlag = FALSE;
 //BMS默认设计信息
 const BMS_DesignInfo_Struct_t BMS_DesignInfo_Default =
 {
@@ -61,7 +62,7 @@ const PBU_ConfigParam_Struct_t PBU_ConfigParam_Default =
 //MC默认配置参数1,占用32bytes
 const MC_ConfigParam1_Struct_t MC_ConfigParam1_Default = 
 {
-  (MC_SupportFlag_Struct_t)MC_SUPPORT_ENABLE,     //支持指拨模式,0x55-不支持,0x-AA支持
+  (MC_SupportFlag_Struct_t)MC_SUPPORT_ENABLE,      //支持指拨模式,0x55-不支持,0x-AA支持
 	(MC_StarMode_Struct_t)MC_StarMode_NORM,          //启动模式 
 	(uint16_t)100,                                   //停机时间 ms	
 	(uint8_t)25,                                     //限速 km/h
@@ -95,8 +96,13 @@ const MC_ConfigParam2_Struct_t MC_ConfigParam2_Default =
 	(int16_t)0,
 	(MC_SupportFlag_Struct_t)MC_SUPPORT_DISABLE,     //0x55-不支持,0x-AA支持
 	(MC_TailLight_Mode_Struct_t)MC_TAIL_LIGHT_MODE2, 
-	(uint8_t)0,
-	(uint8_t)0,
+	(uint8_t)12,
+	(uint8_t)12,
+	(uint16_t)150,
+	(uint16_t)75,
+	(uint16_t)150,
+	(int8_t)0,
+	(int8_t)0
 };
 
 //MC默认马达参数,占用16bytes

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác