فهرست منبع

功能测试OK,关于掉电数据保存的逻辑需要再梳理下。

Dail 11 ماه پیش
والد
کامیت
18af1e8d01

+ 7 - 1
Core/Src/main.c

@@ -140,6 +140,9 @@ int main(void)
 	ADC_Start();
 	HAL_Delay(20);//20ms
 	
+	//开机按键检测初始化
+	Power_Key_Init();
+	
 	//定时器2启动计数
 	HAL_TIM_Base_Start(&htim2);
 	
@@ -183,7 +186,7 @@ int main(void)
 	//MC控制初始化
 	MC_Init();//339ms
 	
-    //变速器参数初始化
+  //变速器参数初始化
 	GearBox_Init();
 
 	//检查电机是否授权
@@ -362,6 +365,9 @@ int main(void)
 			
 			//变速器处理
       GearBox_Loop();
+      
+			//开关机处理
+      Power_OnOff_Process();
 
       //MCU自检
 			STU_TimeBase();

+ 5 - 0
MDK-ARM/QD007A_CTL_APP.uvprojx

@@ -717,6 +717,11 @@
               <FileType>1</FileType>
               <FilePath>..\User\Src\enviolo_can.c</FilePath>
             </File>
+            <File>
+              <FileName>power_key.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\User\Src\power_key.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2446 - 2446
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 1 - 1
User/Inc/light_driver.h

@@ -10,7 +10,7 @@ typedef struct
 	uint16_t Pin;
 }MC_LightDriver_IO_Struct_t;
 
-extern MC_LightDriver_IO_Struct_t HeadLightIO_Groups[3], TailLightIO_Groups[3]; 
+extern MC_LightDriver_IO_Struct_t HeadLightIO_Groups[2], TailLightIO_Groups[2]; 
 
 void LightDriver_Init(void);
 void LightDriver_Process(uint8_t Light_Mode, MC_LightVoltage_Struct_t HeadLightVol, MC_LightVoltage_Struct_t TailLightVol, TrueOrFalse_Flag_Struct_t IsBreakFlag, MC_LightSwitch_Struct_t LightSwitchCode);

+ 24 - 0
User/Inc/power_key.h

@@ -0,0 +1,24 @@
+#ifndef __POWER_KEY_H
+#define __POWER_KEY_H
+
+#include "stm32f1xx_hal.h"
+
+#define POWER_ON_TIME    (uint16_t)1000 //¿ª»úÑÓʱ
+#define POWER_OFF_TIME   (uint16_t)200  //¹Ø»úÑÓʱ
+
+typedef enum
+{
+	Power_KeyStatus_Init = 0x00,
+	Power_KeyStatus_OnCheck, 
+	Power_KeyStatus_OnEnd,
+	Power_KeyStatus_OffCheck,
+	Power_KeyStatus_Off
+}Power_KeyStatus_Struct_t;
+
+extern Power_KeyStatus_Struct_t Power_KeyStatus;
+extern uint32_t Power_KeyCheck_TimeDelay;
+
+void Power_Key_Init(void);
+void Power_OnOff_Process(void);
+
+#endif

+ 1 - 1
User/Inc/tasks.h

@@ -17,7 +17,7 @@ extern void MC_SendRunInfo_Process(MC_WorkMode_Struct_t WorkMode);
 extern void MC_SendDebugInfo_Process(MC_WorkMode_Struct_t WorkMode);
 extern void MC_TE_SensorData_Process(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData);
 extern uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil);
-extern void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable);
+extern void PowerOff_Process(uint8_t PowerOffMode, TrueOrFalse_Flag_Struct_t ReturnEnable);
 extern void MC_CanRxCheck_Process(MC_SupportFlag_Struct_t NoPBU_Flag, MC_SupportFlag_Struct_t NoHMI_Flag, MC_WorkMode_Struct_t WorkMode, MC_GearSt_Struct_t* GearSt);
 extern void MC_UartRxCheck_Process(void);
 extern void MC_RunTime_Cal(uint32_t* p_Runtime);

+ 3 - 3
User/Src/can_process.c

@@ -94,7 +94,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x1308://关机指令
 				{					
-					PowerOff_Process(FALSE);
+					PowerOff_Process(0, FALSE);
 					break;
 				}
 				case 0x1410://电池设计信息
@@ -134,7 +134,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				//PBU广播的指令
         case 0x1008://PBU关机指令
 				{
-					PowerOff_Process(FALSE);
+					PowerOff_Process(0, FALSE);
 					break;
 				}
 				case 0x120C://PBU物理ID
@@ -642,7 +642,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  if(strncmp("RESET", (char*)Data, DataLength) == 0)
 					{
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
-						PowerOff_Process(TRUE);
+						PowerOff_Process(0, TRUE);
 		    	  HAL_Delay(100);
 			      __set_FAULTMASK(1);//关闭所有中断
 			      HAL_NVIC_SystemReset();

+ 1 - 1
User/Src/hardware_check.c

@@ -68,7 +68,7 @@ void GetHardware_Versin(uint16_t VolaVal)
 						#else
 						Error
 						#endif
-						MC_VerInfo.HW_Version[7] =Hardware_VersionTable[Count];
+						MC_VerInfo.HW_Version[7] = Hardware_VersionTable[Count];
 						VersionIdentifyFinishedFlag = TRUE;
 						return ;
 					}

+ 5 - 5
User/Src/light_driver.c

@@ -1,17 +1,17 @@
 #include "light_driver.h"
 #include "speed_sensor.h"
 
-MC_LightDriver_IO_Struct_t HeadLightIO_Groups[3] = 
+MC_LightDriver_IO_Struct_t HeadLightIO_Groups[2] = 
 {
   {GPIOB, GPIO_PIN_4|GPIO_PIN_5},  //ǰµÆ6V
   {GPIOB, GPIO_PIN_6},  //ǰµÆ12V
-  {GPIOB, GPIO_PIN_7},  //ǰµÆËæµç³Øµçѹ
+  //{GPIOB, GPIO_PIN_7},  //ǰµÆËæµç³Øµçѹ
 };
-MC_LightDriver_IO_Struct_t TailLightIO_Groups[3] = 
+MC_LightDriver_IO_Struct_t TailLightIO_Groups[2] = 
 {
   {GPIOB, GPIO_PIN_2},  //βµÆ6V
   {GPIOB, GPIO_PIN_0},  //βµÆ12V
-  {GPIOA, GPIO_PIN_6}   //βµÆËæµç³Øµçѹ
+  //{GPIOA, GPIO_PIN_6}   //βµÆËæµç³Øµçѹ
 };
 
 static void LightDriver_IO_Control(MC_LightDriver_IO_Struct_t* IO_Groups, uint8_t Len, uint8_t ID, MC_LightSwitch_Struct_t SwitchCode)
@@ -44,7 +44,7 @@ void LightDriver_Init(void)
 	__HAL_RCC_GPIOB_CLK_ENABLE();
 	
   /*Configure GPIO pin Output Level */
-  for(i=0; i< 3; i++)
+  for(i=0; i< 2; i++)
 	{
 	  //ǰµÆ×é
 		HAL_GPIO_WritePin(HeadLightIO_Groups[i].Port, HeadLightIO_Groups[i].Pin, GPIO_PIN_RESET);

+ 76 - 0
User/Src/power_key.c

@@ -0,0 +1,76 @@
+#include "power_key.h"
+#include "tasks.h"
+
+Power_KeyStatus_Struct_t Power_KeyStatus = Power_KeyStatus_Init;
+uint32_t Power_KeyCheck_TimeDelay = 0;
+
+void Power_Key_Init(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct;
+	
+	__HAL_RCC_GPIOA_CLK_ENABLE();
+	__HAL_RCC_GPIOB_CLK_ENABLE();
+	
+	//Key PA6
+	GPIO_InitStruct.Pin = GPIO_PIN_6;
+	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+  GPIO_InitStruct.Pull = GPIO_PULLUP;
+	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+	
+	//Lock PB7
+	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
+	GPIO_InitStruct.Pin = GPIO_PIN_7;
+	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+	
+}
+
+void Power_OnOff_Process(void)
+{
+  switch(Power_KeyStatus)
+	{
+	  case Power_KeyStatus_Init: //初始状态,检测到按键按下进入OnCheck
+		{
+		  if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_RESET)
+			{
+			  Power_KeyCheck_TimeDelay = HAL_GetTick();
+				Power_KeyStatus = Power_KeyStatus_OnCheck;
+			}
+			break;
+		}
+		case Power_KeyStatus_OnCheck: //OnCheck状态检测按下时间,到达延时且按键松开进入OnEnd
+		{
+		  if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) && (HAL_GetTick() - Power_KeyCheck_TimeDelay) > POWER_ON_TIME)
+			{
+			  Power_KeyStatus = Power_KeyStatus_OnEnd;
+				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
+			}
+			break;
+		}
+		case Power_KeyStatus_OnEnd: //OnEnd状态检测到按键再次按下,进入OffCheck
+		{
+		  if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_RESET)
+			{
+			  Power_KeyCheck_TimeDelay = HAL_GetTick();
+				Power_KeyStatus = Power_KeyStatus_OffCheck;
+			}
+			break;
+		}
+		case Power_KeyStatus_OffCheck: //OffCheck状态检测按下时间,到达延时进入Off
+		{
+		  if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) && (HAL_GetTick() - Power_KeyCheck_TimeDelay) > POWER_OFF_TIME)
+			{
+			  Power_KeyStatus = Power_KeyStatus_Off;
+			}
+			break;
+		}
+		case Power_KeyStatus_Off: //Off关闭自锁,喂狗,关闭所有中断,关闭驱动IO和灯控IO,等待按键松开
+		{
+		  PowerOff_Process(1, FALSE);
+			break;
+		}
+		default:break;
+	}
+}
+

+ 47 - 22
User/Src/tasks.c

@@ -20,6 +20,7 @@
 #include "light_driver.h"
 #include "MC_Globals.h"
 #include "MC_FOC_Driver.h"
+#include "log_save.h"
 
 /************************全局变量************************/
 TrueOrFalse_Flag_Struct_t IsInitFinish_Flag = FALSE;
@@ -622,11 +623,10 @@ uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil)
 }
 
 //接收到关机指令处理
-void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
+void PowerOff_Process(uint8_t PowerOffMode, TrueOrFalse_Flag_Struct_t ReturnEnable)
 {
   static FlagStatus SaveFlag = RESET;
 	static uint32_t PeriodTimeCnt = 0;
-	static uint8_t Count = 0;
 	
 	//关闭助力档位
 	MC_ControlCode.GearSt = MC_GearSt_OFF;
@@ -634,25 +634,52 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	Update_MC_ControlCode_Back();
 	LightDriver_Process(MC_ConfigParam2.MC_Light_Mode, MC_ConfigParam2.HeadLightVol, MC_ConfigParam2.TailLightVol, IsBreakTrig_Flag, MC_ControlCode.LightSwitch);
 
-	
-	#if 1 //存储到Flash,下次开机时从Flash取出转移到EEPROM
-	if(SaveFlag == RESET)
+	if(PowerOffMode == 0) //被动关机
+  {
+		#if 1 //存储到Flash,下次开机时从Flash取出转移到EEPROM
+		if(SaveFlag == RESET)
+		{
+			MC_PowerOffBkp.ODO_Km = MC_RideLog.ODO_Km;
+			MC_PowerOffBkp.ODO_Time = MC_RideLog.ODO_Time;
+			MC_PowerOffBkp.Trip_Km = MC_RideLog.TRIP_Km;
+			MC_PowerOffBkp.Trip_Time = MC_RideLog.TRIP_Time;
+			MC_PowerOffBkp.Run_Time = MC_RunLog1.RunTime;
+			MC_PowerOffBkp.Log_ODO_Km = MC_RunLog1.ODO_Km;
+			MC_PowerOffBkp.Log_ODO_Time = MC_RunLog1.ODO_Time;
+			SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, (uint8_t*)&MC_PowerOffBkp.ODO_Km, 40);//写入掉电临时保存数据,写入前该区域需擦除为0xFF才能操作成功
+			SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, (uint8_t*)"FLAG", 4); //掉电存储的数据标志更新
+			SaveFlag = SET;
+		}
+		#endif
+		
+		//发送关机就绪信号
+	  SendData(ID_MC_BC, MODE_REPORT, 0x1305, (uint8_t*)"READY");
+	}
+  else //主动关机
 	{
-		MC_PowerOffBkp.ODO_Km = MC_RideLog.ODO_Km;
-		MC_PowerOffBkp.ODO_Time = MC_RideLog.ODO_Time;
-		MC_PowerOffBkp.Trip_Km = MC_RideLog.TRIP_Km;
-		MC_PowerOffBkp.Trip_Time = MC_RideLog.TRIP_Time;
-		MC_PowerOffBkp.Run_Time = MC_RunLog1.RunTime;
-		MC_PowerOffBkp.Log_ODO_Km = MC_RunLog1.ODO_Km;
-		MC_PowerOffBkp.Log_ODO_Time = MC_RunLog1.ODO_Time;
-		SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, (uint8_t*)&MC_PowerOffBkp.ODO_Km, 40);//写入掉电临时保存数据,写入前该区域需擦除为0xFF才能操作成功
-		SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, (uint8_t*)"FLAG", 4); //掉电存储的数据标志更新
-		SaveFlag = SET;
+	  #if 1 //存储历史数据
+		//EEPROM更新历史记录
+		SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
+		SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
+		SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
+		//Flash数据更新
+		if(MC_CalParam.Foc_Flag == RESET)
+		{
+			EEPROM_Flash_DataUpdate(&IsFlashSaveDataUpdate);
+		}
+		//故障日志存储更新处理
+		if(MC_CalParam.Foc_Flag == RESET)
+		{
+			ErrorLogSave_Process(&MC_ErrorLogSaveInfo, &IsErrorLogSaveInfoUpdateFlag);
+			RunLogSave_Process(&RunLogSaveIndex);
+		}
+		#endif
+		
+		//发送关机指令
+	  SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t*)"SHUTDOWN");
+		HAL_Delay(1000);
+		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
 	}
-	#endif
-	
-	//发送关机就绪信号
-	SendData(ID_MC_BC, MODE_REPORT, 0x1305, (uint8_t*)"READY");
 	
 	//等待关机
 	if(ReturnEnable == TRUE)
@@ -662,13 +689,11 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	else
 	{
 		PeriodTimeCnt = HAL_GetTick();
-		Count = 0;
-	  while(Count < 10)
+	  while(1)
 		{
 		  if((HAL_GetTick() - PeriodTimeCnt) > 100)
 			{
 			  PeriodTimeCnt = HAL_GetTick();
-				Count++;
 				#if DEBUG
 			  HAL_IWDG_Refresh(&hiwdg);
 			  #endif

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است