Procházet zdrojové kódy

1)修改升级应答协议。
2)保留FLASH最后1K不擦除,留给APP程序使用。

damon před 6 roky
rodič
revize
eab962f13f

+ 3 - 1
Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h

@@ -618,7 +618,9 @@ typedef struct
 
 
 #define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
-#define FLASH_BANK1_END       ((uint32_t)0x0801FFFF) /*!< FLASH END address of bank1 */
+#define FLASH_BANK1_END       ((uint32_t)0x0801FBFF) /*!< FLASH END address of bank1 */
+
+
 #define SRAM_BASE             ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
 #define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
 

+ 10 - 9
user/user_can/can_app.c

@@ -167,7 +167,7 @@ void CA_RxData_Process(CAN_Buf_TypeDef*ptCANRx)
 						
 						downLoad.packageSize = *(uint32_t *)(frameCrcBuff + 15);
 					
-						//FLASH_Block_Erase();
+						/*擦除FLASH,剩余最后1k没有擦除,保留其他功能使用**/
 						FLASH_If_Erase(APPLICATION_ADDRESS);
 						
 						/*清空flash写标志*/
@@ -345,21 +345,22 @@ void sendAck(void)
 
 void sendUpdateAck( CD_UINT16 cmd ,CD_UINT8 packageNum )
 {
-	static CD_UINT8 ackBuff[14]={ FRAME_HEAD1,FRAME_HEAD2,0x07,0x15,0x0C,0x03,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0xF0 };
+	static CD_UINT8 ackBuff[15]={ FRAME_HEAD1,FRAME_HEAD2,0x07,0x15,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0 };
 	CD_UINT32 crc32Ret;
 	//static CD_UINT8 ucInit_flag = 0;
 	uint8_t i;
 	
 	ackBuff[6] = (CD_UINT8)(cmd >>8);
 	ackBuff[7] = (CD_UINT8)cmd;
-	ackBuff[8] = packageNum;
+	ackBuff[8] = (CD_UINT8)(packageNum>>8);
+	ackBuff[9] = (CD_UINT8)packageNum;
 	
 	crc32Ret = CRC32_Calculate( (CD_UINT8 *)ackBuff,9 );
 	
-	ackBuff[9] = (CD_UINT8)( crc32Ret >> 24 );
-	ackBuff[10] = (CD_UINT8)( crc32Ret >> 16 );
-	ackBuff[11] = (CD_UINT8)( crc32Ret >> 8 );
-	ackBuff[12] = (CD_UINT8)( crc32Ret );
+	ackBuff[10] = (CD_UINT8)( crc32Ret >> 24 );
+	ackBuff[11] = (CD_UINT8)( crc32Ret >> 16 );
+	ackBuff[12] = (CD_UINT8)( crc32Ret >> 8 );
+	ackBuff[13] = (CD_UINT8)( crc32Ret );
 	
 	/*发送第1包数据*/
 	hcan.pTxMsg->StdId = CAN_RxBuf_Struct1.ID;
@@ -379,9 +380,9 @@ void sendUpdateAck( CD_UINT16 cmd ,CD_UINT8 packageNum )
 	}	
   
   /*发送第2包数据*/
-	hcan.pTxMsg->DLC = 4;
+	hcan.pTxMsg->DLC = 5;
 
-	for( i=0;i<4;i++)
+	for( i=0;i<5;i++)
 	{
 		hcan.pTxMsg->Data[i] = ackBuff[i+10];
 	}

+ 2 - 2
user/user_menu/protocol.h

@@ -76,8 +76,8 @@
 #define CMD_UPDATA_END     0xA401    
 
 #define CMD_BOOT_INFO      0xC109
-#define CMD_ACK_OK         0xC201
-#define CMD_ACK_ERR        0xC301
+#define CMD_ACK_OK         0xC202
+#define CMD_ACK_ERR        0xC302
 #define CMD_ACK_REQ        0xC401
 #define CMD_ACK_EOT        0xC501
 #define CMD_ACK_ERR_FLASH  0xC601

+ 4 - 20
更新记录.txt

@@ -1,20 +1,4 @@
-
-V2.1 20181219 Damon
-1)增加CAN接收ID号过滤,保证升级时,只接收上位机的数据。
-2)升级中,超时改为2秒,超时应答错误命令ACK_ERROR。
-3)文件头、文件尾接收出错时,都应答ACK_REQ,重发文件。
-4)写flash出错时,应答包号和空命令,以便出错时通过CAN盒子观察错误。
-5)前后灯的IO口初始化为低电平,防止开机过程中灯亮。
-
-V2.0 Damon 20180623
-    1) 修改写flash的代码。
-    2)修改升级流程中,接收一个数据包的最长时间为500ms,在写入flash成功后,立即应答上位机。
-    3)上电即向上位机发送第一天应答,取消等待200ms。
-    4)启动过程中,向上位机发送5条应答(间隔100ms,最后一天发送完即跳转),未响应则跳转到APP程序。
-    
-    20180711
-    1)去掉升级成功后,跳转至APP时的延时。
-
-20190102
-1)优化升级出错处理,降低升级中断、失败。
-2)增加写flash标志位,防止重复写flash出错。
+V1..0.0 20190325
+1) 针对motinnova的协议和升级流程修改。
+2)修改升级应答协议。
+3)保留FLASH最后1K不擦除,留给APP程序使用。