Browse Source

V3000 优化了Uart逻辑和中断计数

CHENJIE-PC\QiXiang_CHENJIE 3 năm trước cách đây
mục cha
commit
24424b37b9
4 tập tin đã thay đổi với 102 bổ sung97 xóa
  1. 4 4
      inc/AppConfig.h
  2. 2 1
      inc/AppTaskUart.h
  3. 8 11
      src/AppTaskMain.c
  4. 88 81
      src/AppTaskUart.c

+ 4 - 4
inc/AppConfig.h

@@ -13,7 +13,7 @@
 #define DATA_MODULE_TYPE            (1)                 //1表示NB模块,2表示4G cat1
 #define EOLSTATE                    (1)                 //1表示下线检测跳过,使用默认值,0表示使用下线检测
 #define DEFAULT_SN                  "RLTEST00000000001" //默认上传的SN编码
-#define	APPSWVERSION		        0x03000000          //数据模块软件版本号
+#define	APPSWVERSION		        0x03000001          //数据模块软件版本号
 
 #define TCP_ADD                     "iotp.fast-fun.cn"  //数据上传的地址
 #define TCP_PORT					8712                //数据上传的端口
@@ -26,13 +26,13 @@
 #define APP_CONFIG_FILE_NAME                "qxappconfig.nvm"
 #define APP_DATAINFO_FILE_NAME              "qxappDataInfo3.nvm"
 #define BATT_SN_LEN                17
-#define BMS_OTHER_TEMP          2
+#define BMS_OTHER_TEMP              2
 
 
-#define BATT_IDLE_SYM         0x00    //静置
+#define BATT_IDLE_SYM           0x00    //静置
 #define BATT_CHARGE_SYM 		0x02    //充电
 #define BATT_DISCHARGE_SYM      0x01    //放电
-#define BATT_MOVE_SYM	    0x01    //移动
+#define BATT_MOVE_SYM	        0x01    //移动
 #define BATT_NO_MOVE_SYM 		0x00    //静止
 
 #define TCP_START_SYM1			0x23

+ 2 - 1
inc/AppTaskUart.h

@@ -39,7 +39,8 @@
 #define UART_READ_FLAG      0x00
 typedef enum
 {
-    PROCESS_UART_STATE_ENCRYPT = 0,
+    PROCESS_UART_STATE_INTI = 0,
+    PROCESS_UART_STATE_ENCRYPT,
     PROCESS_UART_STATE_IDLE,
     PROCESS_UART_STATE_READ,
     PROCESS_UART_STATE_WRITE,

+ 8 - 11
src/AppTaskMain.c

@@ -30,7 +30,7 @@ static void appAfterSlp2(void *pdata, slpManLpState state);
 UINT8 MainSlpHandler          = 0xff;//主线程睡眠句柄
 static void MainTask(void* arg)
 {
-    UINT8 PadInterrupt1_clrCounter = 0;
+    UINT8 PadInterrupt_clrCounter = 0;
     TimerHandle_t monitor_timer = NULL;
     TimerHandle_t work_timer = NULL;
     TimerHandle_t sleep_timer = NULL;
@@ -93,6 +93,7 @@ static void MainTask(void* arg)
                     xTimerStop(work_timer,0);
                     xTimerStart(sleep_timer, 0);
                     WorkTimerEnd = FALSE;
+                    NVIC_EnableIRQ(PadWakeup1_IRQn);
                 }
                 if(TcpErrorcount>=10 &&PadInterrupt==0x00)
                 {
@@ -120,15 +121,10 @@ static void MainTask(void* arg)
             {
                 PROC_APP_STATE_SWITCH(LISTEN);
                 osDelay(100);
-                if (TimeCounter%10==0 && PadInterrupt1_clrCounter<15)
+                if(PadInterrupt!=0x00)
                 {
-                    PadInterrupt1_clrCounter++;
-                    clrbit(PadInterrupt,1);
-                    if(PadInterrupt1_clrCounter==15)
-                    {
-                        NVIC_EnableIRQ(PadWakeup1_IRQn);
-                        clrbit(PadInterrupt,1);
-                    }
+                    PadInterrupt_clrCounter++;
+                    PadInterrupt = 0x00;
                 }
                 if(AppDataInfo.appDataModify)
                 {
@@ -141,14 +137,15 @@ static void MainTask(void* arg)
                 #ifdef USING_PRINTF1
                     printf("[%d]%x - %x - %x - %x\n",__LINE__,SleepTimerEnd,BMS_Fota_update_flag,TCPWorkState,PadInterrupt);
                 #endif
-                if((SleepTimerEnd)||(TCPWorkState==1)||(PadInterrupt!=0x00))//从监听转换为工作的条件
+                if((SleepTimerEnd)||(TCPWorkState==1)||(PadInterrupt_clrCounter>=3))//从监听转换为工作的条件
                 {
                     PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
                     xTimerStop(sleep_timer,0);
                     SleepTimerEnd = FALSE;
                     PadInterrupt = 0x00;
-                    PadInterrupt1_clrCounter = 0;
+                    PadInterrupt_clrCounter = 0;
                     NVIC_DisableIRQ(PadWakeup1_IRQn);
+                    break;
                 }
                 if(NB_Fota_update_flag)
                 {

+ 88 - 81
src/AppTaskUart.c

@@ -24,16 +24,10 @@ static UINT8 Uart_WriteCmd_func(UartWriteData_S UartWriteData);
 void USART_callback(uint32_t event);
 static UINT16 crc_chk(UINT8* data, UINT8 length);
 UINT8 Uart_Encrypt_Send(void);
+void Uart_Cmd_Control(QueueHandle_t UartWriteCmdHandle,UartWriteData_S UartWriteData,UartAnswerData_S UartAnswerData);
 static UINT8 Uart_DataRecv_func(UartQueryType Uart_Read_Msg_Fun,UINT8* Uart_Recv_Buffer_Fun);
 static void UartTask(void* arg)
 {
-    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);
 
     UINT16  Uart_Uds_LEN;
     UINT16  Reg_Num = 0;
@@ -43,11 +37,10 @@ static void UartTask(void* arg)
     memset(&(Uart_Read_Msg),0x00,sizeof(Uart_Read_Msg));
     UartAnswerData_S UartAnswerData;//应答数据初始化
 	memset(&(UartAnswerData),0x00,sizeof(UartAnswerData_S));
-    UartWriteData_S  UartWriteData;
+	UartWriteData_S  UartWriteData;
 	memset(&(UartWriteData),0x00,sizeof(UartWriteData_S));//Uart控制命令初始化
-    PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
+    PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_INTI);
 	UINT8 ret = 0x00;
-	UINT8 HeatSwitch = 0;
 	if(UartWriteCmdHandle == NULL)//Uart控制命令传输指针
 	{
 		UartWriteCmdHandle = osMessageQueueNew(1,sizeof(UartWriteData_S), NULL);
@@ -56,6 +49,18 @@ static void UartTask(void* arg)
     {
         switch (gProcess_Uart_Task)
         {
+			case PROCESS_UART_STATE_INTI:
+			{
+				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);
+				PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
+				break;
+			}
             case PROCESS_UART_STATE_ENCRYPT:
             {
                 UINT8 EncryptFlag=0x00;
@@ -71,6 +76,7 @@ static void UartTask(void* arg)
             case PROCESS_UART_STATE_IDLE:
             {
                 osDelay(100);
+				Uart_Cmd_Control(UartWriteCmdHandle,UartWriteData,UartAnswerData);//电池锁定,继电器锁定,加热控制
                 if(TimeCounter%10==0 && gProcess_app==WORK)
                 {
                     #ifdef USING_PRINTF1
@@ -100,47 +106,6 @@ static void UartTask(void* arg)
 						break;
 					}
 				}
-                if(battWorkState ==0x00 && AppDataInfo.BattLock==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x02)//try to lock lock the discharge 
-				{
-                    #ifdef USING_PRINTF
-                        printf("try to lock\n");
-                    #endif
-					UartWriteData.WriteCmd = 0x01;
-					UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
-					UartWriteData.Data[1] = 0x02;
-					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
-				}
-				else if (battWorkState ==0x00 && AppDataInfo.BattLock==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x03 ) // try to unlock
-				{
-                    #ifdef USING_PRINTF
-                        printf("try to unlock\n");
-                    #endif
-					UartWriteData.WriteCmd = 0x01;
-					UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
-					UartWriteData.Data[1] = 0x03;
-					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
-				}
-				if(AppDataInfo.RelayControl==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x00)//继电器断开
-				{
-					UartWriteData.WriteCmd = 0x04;
-					UartWriteData.Data[0] = 0x80;
-					UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
-					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
-				}
-				else if(AppDataInfo.RelayControl==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x80)//继电器闭合
-				{
-					UartWriteData.WriteCmd = 0x04;
-					UartWriteData.Data[0] = 0x00;
-					UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
-					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
-				}
-				if(TimeCounter%50==0 && BattHeaterSwitch(&HeatSwitch,10,5,10)==TRUE)
-				{
-					UartWriteData.WriteCmd = 0x02;
-					UartWriteData.Data[0] = 0x00;
-					UartWriteData.Data[1] = HeatSwitch&0xFF;
-					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
-				}
                 break;
             }
             case PROCESS_UART_STATE_READ:
@@ -162,23 +127,34 @@ static void UartTask(void* arg)
                 #ifdef USING_PRINTF1
 					printf("[%d]Uart_Recv_buffer-%d: ",__LINE__,Uart_Recv_LEN);
                 #endif
-                if(Uart_Recv_LEN>0)
+                if(Uart_Recv_LEN>5)
                 {
                     UartRecvFlag = 1;
                     UartAnswerData.len = Uart_Recv_LEN;
                     uartBattInfoDecode(UartAnswerData.data);
+					clrbit(PadInterrupt,1);
+					PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
+					break;
                 }
-                else
+                else if(Uart_Recv_LEN==1)//接收的数据校验不过
                 {
+					osDelay(100);
                     UartRecvFlagCounter++;
-                    if(UartRecvFlagCounter>=3)
-                    {
-                        UartRecvFlag = 0;
-                        UartRecvFlagCounter = 0;
-                    }
+					clrbit(PadInterrupt,1);
                 }
-				clrbit(PadInterrupt,1);
-                PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
+				else//没有接收到数据
+				{
+					osDelay(100);
+                    UartRecvFlagCounter++;
+					clrbit(PadInterrupt,1);
+				}
+				if(UartRecvFlagCounter>=3)
+				{
+					UartRecvFlag = 0;
+					UartRecvFlagCounter = 0;
+					PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_INTI);
+					break;
+				}
                 #ifdef USING_PRINTF1
 					printf("[%d]Uart_Recv_buffer-%d: ",__LINE__,Uart_Recv_LEN);
 					for(int i=0;i<Uart_Recv_LEN;i++)
@@ -198,7 +174,7 @@ static void UartTask(void* arg)
             }
             case PROCESS_UART_STATE_UPDATE:
             {
-                UartRecvFlag =  FALSE;
+                UartRecvFlag =  0;
 				#if  BMS_MANUFACTURE==1
 				{
 					SP_BMS_Update_Service();
@@ -216,18 +192,11 @@ static void UartTask(void* arg)
                     printf("Uart silence begin\n");
                 #endif
                 UartRecvFlag = 0;
+				USARTdrv->PowerControl(ARM_POWER_LOW);
                 while (gProcess_app==LISTEN)
                 {
-                    osDelay(1000);
+                    osDelay(100);
                 }
-                PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
-                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);
                 break;
             }
             default:
@@ -350,6 +319,52 @@ static UINT8 Uart_WriteCmd_func(UartWriteData_S UartWriteData)
         return 0x00;
     }
 }
+void Uart_Cmd_Control(QueueHandle_t UartWriteCmdHandle,UartWriteData_S UartWriteData,UartAnswerData_S UartAnswerData)
+{
+	UINT8 HeatSwitch = 0;
+	if(TimeCounter%10==0 && BattHeaterSwitch(&HeatSwitch,10,5,10)==TRUE)
+	{
+		UartWriteData.WriteCmd = 0x02;
+		UartWriteData.Data[0] = 0x00;
+		UartWriteData.Data[1] = HeatSwitch&0xFF;
+		osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+	}
+	if(battWorkState ==0x00 && AppDataInfo.BattLock==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x02)//try to lock lock the discharge 
+	{
+		#ifdef USING_PRINTF
+			printf("try to lock\n");
+		#endif
+		UartWriteData.WriteCmd = 0x01;
+		UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
+		UartWriteData.Data[1] = 0x02;
+		osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+	}
+	else if (battWorkState ==0x00 && AppDataInfo.BattLock==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x03 ) // try to unlock
+	{
+		#ifdef USING_PRINTF
+			printf("try to unlock\n");
+		#endif
+		UartWriteData.WriteCmd = 0x01;
+		UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
+		UartWriteData.Data[1] = 0x03;
+		osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+	}
+
+	if(AppDataInfo.RelayControl==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x00)//继电器断开
+	{
+		UartWriteData.WriteCmd = 0x04;
+		UartWriteData.Data[0] = 0x80;
+		UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
+		osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+	}
+	else if(AppDataInfo.RelayControl==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x80)//继电器闭合
+	{
+		UartWriteData.WriteCmd = 0x04;
+		UartWriteData.Data[0] = 0x00;
+		UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
+		osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+	}
+}
 //Uart发送接收函数
 static UINT8 Uart_DataRecv_func(UartQueryType Uart_Read_Msg_Fun,UINT8* Uart_Recv_Buffer_Fun)
 {
@@ -398,23 +413,15 @@ static UINT8 Uart_DataRecv_func(UartQueryType Uart_Read_Msg_Fun,UINT8* Uart_Recv
         }
         else //接收数据的校验不过
         {
-            osDelay(5000);
-            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);
-            memset(Uart_Recv_Buffer_Fun,0xff,Data_Len);
-            return 0;
+            memset(Uart_Recv_Buffer_Fun,0x00,Data_Len);
+            return 1;
         }
     }
     else
     {
         memset(Uart_Recv_Buffer_Fun,0x00,Data_Len);
         isRecvTimeout = false;
-        return 0;
+        return 2;
     }
 	return 0;
 }