Browse Source

backup iap phase

terry 2 years ago
parent
commit
919011fcf4

+ 8 - 0
Core/Inc/iap.h

@@ -46,6 +46,14 @@ extern uint32_t update_flag;
 extern uint16_t packTotalNum;
 extern uint16_t packIndex ;
 
+
+extern uint32_t nowcurAddr;
+extern uint32_t nowcurAddr1;
+extern uint16_t nowcurpack;
+extern uint16_t curaddr[2];
+extern uint16_t curapack[1];
+
+
 extern int lenindex;
 extern uint16_t iapbinMd5[8] ;
 void Process_CMD_IAP_Update(void);

+ 2 - 2
Core/Inc/main.h

@@ -99,8 +99,8 @@ uint32_t read_flash_32(uint32_t addr);
 #define ADC2_FLASH_ADDR   		((uint32_t)0x8072000)  // Adc3_Calibration    4-20mA
 
 #define SYSVERSION_ADDR   		((uint32_t)0x8072800)  
-#define CURPACKAGE_ADDR   		((uint32_t)0x8073000)  
-#define CURADDRESS_ADDR   		((uint32_t)0x8073800)  
+#define CURaddr_PACKAGE_ADDR   	((uint32_t)0x8073000)  
+
 #define VERSION_ADDR			((uint32_t)0x8074000)  
 #define LENGTH_ADDR				((uint32_t)0x8074800)  
 #define MD5_ADDR				((uint32_t)0x8075000)  

+ 3 - 0
Core/Inc/usart.h

@@ -69,6 +69,9 @@ void update_baudrate(uint16_t temp);
 void update_sysVersion(uint32_t addr);
 void update_iaplength(uint32_t addr);
 void updateiapMd5(uint32_t addr);
+void updatecuraddr(uint32_t addr);
+int compareArrays(uint16_t arr1[], uint16_t arr2[], int size) ;
+void updatecurpack(uint32_t addr);
 /* USER CODE END Prototypes */
 
 #ifdef __cplusplus

+ 1 - 1
Core/Src/dataHandling.c

@@ -370,7 +370,7 @@ void iap_write_appbin(uint32_t appxaddr, uint32_t appbuf, uint32_t appsize)
 			
 //		memset(iapbuf, 0, sizeof(iapbuf));	
 		int txLen;
-		txLen = sprintf((char *)USART_IAP_RX, "%s%d\r\n", ACK_Arr,z);
+		txLen = sprintf((char *)USART_IAP_RX, "%s%d", ACK_Arr,z);
 		HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);	
 
 		fwaddr = fwaddr + 0x800;

+ 55 - 88
Core/Src/iap.c

@@ -15,16 +15,6 @@ __asm void MSR_MSP(uint32_t addr)
     BX r14
 }
 
-void iap_load_app(uint32_t appxaddr)
-{
-	if (((*(uint32_t *)appxaddr) & 0x2FFE0000) == 0x20000000) //检查栈顶地址是否合法.
-	{
-		jump2app = (iapfun) * (uint32_t *)(appxaddr + 4); //用户代码区第二个字为程序开始地址(复位地址)
-		MSR_MSP(*(uint32_t *)appxaddr);					  //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
-		jump2app();										  //跳转到APP.
-	}
-}
-
 typedef void (*pFunction)(void);
 void jump_to_app(uint32_t app_addr)
 {
@@ -49,10 +39,12 @@ uint8_t binLength[10] = {0};
 uint8_t binMd5[16] = {0};
 
 uint16_t iapbinMd5[8] = {0};
+uint16_t iapbinMd5_1[8] = {0};
 uint16_t FileBuffArray[512];  
 uint16_t FileBuffArray1[512]; 
 uint16_t start_addr = 0;
 uint16_t packIndex = 0;
+uint16_t addrIndex = 0;
 uint16_t packTotalNum = 0;
 uint16_t packIndexbak = 0; 
 uint16_t crcIAP = 0;
@@ -60,31 +52,36 @@ uint16_t crcTerminal = 0;
 uint32_t AddrToWrite = Application_Buffer_Addr;
 int FileLength_IAP; 
 uint32_t update_flag = 0;
-//uint16_t iapbigbuf[20000];
 
 int tag = 0;
 int lenindex=0;
-//int indexbuf=0;
-
 
+uint32_t nowcurAddr = 0;
+uint32_t nowcurAddr1 = 0;
+uint16_t nowcurpack = 0;
+uint16_t curaddr[2] = {0};
+uint16_t curapack[1] = {0};
+uint16_t curaddr_pack[3] = {0};
+int sameIndex;
+	
 void Process_CMD_IAP_Update(void)
 {
-
 	int lenRx1;
 	int i;
 	USART_IAP_FLAG = 0;
 	packIndex = USART_IAP_RX[8] << 8 | USART_IAP_RX[9];
 	
+	addrIndex = USART_IAP_RX[2] << 8 | USART_IAP_RX[3];
+	
 	lenRx1 = USART_PUB_LENGTH;
 
 	uint8_t ERR_Arr[8] = "error\r\n";
-//	uint8_t ACK_Arr[16] = "acknowlege=ok";
 	
 	YmodemID = USART_IAP_RX[7];
 	memset(FileBuffArray, 0, sizeof(FileBuffArray));
 	memset(FileBuffArray1, 0, sizeof(FileBuffArray1));
 	
-	
+	updatecuraddr(CURaddr_PACKAGE_ADDR);
 	
 	switch (YmodemID)
 	{
@@ -92,7 +89,8 @@ void Process_CMD_IAP_Update(void)
 			memcpy(startFrame, &USART_IAP_RX[10], 40);
 			crcIAP = crc16_xmodem(&USART_IAP_RX[10], 128); 
 			crcTerminal = (USART_IAP_RX[lenRx1 - 4] << 8) | USART_IAP_RX[lenRx1 - 3];
-		
+			
+			AddrToWrite = 0;
 			if (crcIAP == crcTerminal)
 			{
 /*升级起始帧标记0*/				
@@ -120,7 +118,6 @@ void Process_CMD_IAP_Update(void)
 	
    	lenindex =1;//长度为5位数
 #endif	
-
 					readFlashToArr(binLength, StartMode_Addr+27);
 					if(lenindex != 0)
 					{
@@ -136,14 +133,13 @@ void Process_CMD_IAP_Update(void)
 
 					
 					all_len = FileLength_IAP;
-					
-					
 					erase_flash(LENGTH_ADDR);
 					HAL_FLASH_Unlock();  // 解锁Flash
 					HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, LENGTH_ADDR, all_len);
 					HAL_FLASH_Lock();  // 上锁Flash
 /*IAP总长度标记1*/		
 					
+					
 /*IAP_MD5标记0*/
 					if(lenindex!=0)
 					{
@@ -162,13 +158,12 @@ void Process_CMD_IAP_Update(void)
 						for (int i = 0; i < 8; i++) {
 							iapbinMd5[i] = ((iapbinMd5[i] >> 8) & 0xFF) | ((iapbinMd5[i] << 8) & 0xFF00);
 						}
-					}
-
-						
-				
+					}		
 /*IAP_MD5标记1*/	
-					
+
 					AddrToWrite = Application_Buffer_Addr;
+
+					
 				}
 
 				memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));	
@@ -176,8 +171,6 @@ void Process_CMD_IAP_Update(void)
 				receive_modbus_9_1(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
 									((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5], USART_MODBUS_RX[6]);
 
-				
-				__NOP();
 			}
 
 			else
@@ -198,7 +191,20 @@ void Process_CMD_IAP_Update(void)
 			crcIAP = crc16_xmodem(&USART_IAP_RX[10], 128); 
 			crcTerminal = (USART_IAP_RX[lenRx1 - 4] << 8) + USART_IAP_RX[lenRx1 - 3];
 		
-
+		
+			if(nowcurAddr1 == 0xFFFFFFFF)
+			{
+				AddrToWrite = Application_Buffer_Addr;
+			}
+			else{
+				int addr = nowcurAddr1;
+				int base_addr = Application_Buffer_Addr;
+				int step_size = 0x80;
+				int index = (addr - base_addr) / step_size;//算出包索引
+				
+				AddrToWrite = addr;
+				packIndex = index;
+			}
 		
 			if (crcIAP == crcTerminal)
 			{
@@ -211,17 +217,11 @@ void Process_CMD_IAP_Update(void)
 				AddrToWrite += 128;
 				
 				
-				
-
-//				Flash_ReadBytes(&iapbigbuf[indexbuf], AddrToWrite, 128);
-//				indexbuf+=128;
-
-				
-				
 				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
 				HAL_Delay(1);  
 				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
 				
+				
 				if((AddrToWrite & 0xffff) != (USART_IAP_RX[2] << 8 | USART_IAP_RX[3]))
 				{
 					HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
@@ -230,12 +230,25 @@ void Process_CMD_IAP_Update(void)
 				
 				
 				memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));	
-				delay_sys_us(80);
 				
-				receive_modbus_9_1(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
-									((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5], USART_MODBUS_RX[6]);
+				//CURPACKAGE_ADDR
+				//CURADDRESS_ADDR
+				nowcurAddr = AddrToWrite;
+				
+				curaddr_pack[0] = (nowcurAddr >> 16) & 0xFFFF;;
+				curaddr_pack[1] = nowcurAddr & 0xFFFF;
+				curaddr_pack[2] = packIndex+1;
+				
 
-			}				
+			}	
+
+				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
+				HAL_Delay(1);  
+				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
+			Flash_WriteBytes(curaddr_pack, CURaddr_PACKAGE_ADDR, 3);
+			
+			receive_modbus_9_1(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+								((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5], USART_MODBUS_RX[6]);			
 			break;
 			
 			
@@ -246,13 +259,6 @@ void Process_CMD_IAP_Update(void)
 				crcTerminal = (USART_IAP_RX[lenRx1 - 4] << 8) + USART_IAP_RX[lenRx1 - 3];
 				if (crcIAP == crcTerminal)
 				{
-//					int txLen;
-//					txLen = sprintf((char *)USART_IAP_RX, "%s\r\n", ACK_Arr);
-//					HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
-//					while (huart1.gState == HAL_UART_STATE_BUSY_TX)
-//					{
-//						HAL_Delay(1);
-//					}
 					
 /*系统版本标记0*/					
 					Flash_ReadBytes(version, StartMode_Addr + 14, 8);
@@ -319,29 +325,17 @@ void Start_BootLoader(void)
 	
 	
     update_iaplength(LENGTH_ADDR);
-//	uint16_t pagenum =  (all_len+2048)/2048;
 	
 	switch (ModeStart)
 	{
 		case Startup_Normal: // 正常启动  在APP2中可以设定此标志位   使得下次重启之后进入APP1
-		{
-//			txLen = sprintf((char *)USART_IAP_RX, "normalStart");
-//			HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
+		{	
 			break;
 		}
 		
 		
 		case Startup_Update: /*启动最新的程序 */
-//			{
-//				FLASH_EraseInitTypeDef erase_init;
-//				erase_init.TypeErase = FLASH_TYPEERASE_PAGES;  // 擦除类型为页擦除
-//				erase_init.PageAddress = ADD_UPDATE_PROG;  
-//				erase_init.NbPages = pagenum;  // 擦除的页数
-//				uint32_t page_error = 0;
-//				HAL_FLASH_Unlock();  // 解锁Flash
-//				HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error);  // 执行擦除操作
-//				HAL_FLASH_Lock();  // 上锁Flash
-//			}
+
 			all_len = FileLength_IAP;
 			
 			tag = App2_MD5_Check(Application_Buffer_Addr,all_len);
@@ -381,42 +375,15 @@ void Start_BootLoader(void)
 				}
 				
 				Set_App2_Flag();
-//				iap_load_app(ADD_UPDATE_PROG);
 			}
-//			break;
 
 		case Startup_APP2: /*启动最新的程序 */
-
-//			txLen = sprintf((char *)USART_IAP_RX, "jump");
-//			HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
+		
 			if ((all_len<0x20000) && App2_MD5_Check(ADD_UPDATE_PROG,all_len))
 			{
 				__set_FAULTMASK(0);			   //先关闭全局中断
-//				iap_load_app(ADD_UPDATE_PROG); //执行FLASH APP2代码
 				jump_to_app(ADD_UPDATE_PROG);
 			}
-			
-			
-//			__set_FAULTMASK(0);		
-//			Set_normal_Flag();
-			
-//			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
-//			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
-//			Set_App2_Flag();
-//			
-//			__set_FAULTMASK(0);			   //先关闭全局中断
-//			iap_load_app(ADD_UPDATE_PROG);
-			
-			
-
-//			Set_jump_Flag();
-////	
-//		case Jump_app:
-			
-//			__set_FAULTMASK(0);			   //先关闭全局中断
-////			Set_normal_Flag();
-//			IAP_ExecuteApp(0x8020000); //执行FLASH APP2代码
-//			
 			break;
 		default: // 启动失败
 		{

+ 19 - 14
Core/Src/main.c

@@ -52,10 +52,8 @@ uint8_t  data_to_send[50];
 uint16_t CRC_value 		 = 0;
 uint16_t initial_address = 0x00C1;
 uint16_t BaudrateValue 	 = 0x0000;
-uint32_t System_version  = 0x23080700;
+uint32_t System_version  = 0x23080800;
 uint8_t  bufMain[128] 	= {0};
-uint32_t scb;
-
 
 /* USER CODE END PV */
 
@@ -112,7 +110,6 @@ int main(void)
    	Start_BootLoader();
 #else	
 	SCB->VTOR = 0x08020000;
-	__set_PRIMASK(0);
 #endif	
 
 //更新标定数据  
@@ -125,16 +122,8 @@ int main(void)
 //更新结束  
 
 
-
-//  scb = SCB->VTOR;
-//  if(scb==0x08020000)
-//  {
-//	
-//  }
 	int txLen = sprintf((char *)USART_IAP_RX, "app1");
 	HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);	
-//  rebootTip = sprintf((char*)bufMain, "reboot ok");
-//  HAL_UART_Transmit(&huart1, bufMain, rebootTip, 300);
   HAL_UART_Receive_DMA(&huart1,USART_PUB_RX,RX_BUF_SIZE); 
   __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); 
   /* USER CODE END 2 */
@@ -521,10 +510,26 @@ void ModBus(void) {
 
 			receive_modbus_9(initial_address, 0x03, 0x04,  ((System_version >> 16) & 0xFFFF), (System_version & 0xFFFF), 9);
 				
-//			__set_FAULTMASK(0);			   //先关闭全局中断
-//			iap_load_app(0x08020000);
 		}
 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x50 \
+			&& USART_MODBUS_RX[3] == 0x02 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x02){//断点地址
+
+			updatecuraddr(CURaddr_PACKAGE_ADDR);
+			receive_modbus_9(initial_address, 0x03, 0x04,  ((nowcurAddr1 >> 16) & 0xFFFF), (nowcurAddr1 & 0xFFFF), 9);
+				
+
+		}
+			
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x50 \
+			&& USART_MODBUS_RX[3] == 0x04 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){//断点包索引
+				
+			updatecurpack(CURaddr_PACKAGE_ADDR);
+			receive_modbus_7(initial_address, 0x03, 0x02, nowcurpack, 7);
+				
+
+		}
+			
 		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x06 && USART_MODBUS_RX[2] == 0x00 \
 			&& USART_MODBUS_RX[3] == 0x02 && USART_MODBUS_RX[4] == 0x00){
 			

+ 21 - 2
Core/Src/usart.c

@@ -347,11 +347,30 @@ void update_iaplength(uint32_t addr)
 
 void updateiapMd5(uint32_t addr)
 {
-//	Flash_ReadBytes(iapbinMd5, addr + 33, 16);
 	Flash_ReadBytes(iapbinMd5, MD5_ADDR, 16);
-	
 	for (int i = 0; i < 8; i++) {
 		iapbinMd5[i] = ((iapbinMd5[i] >> 8) & 0xFF) | ((iapbinMd5[i] << 8) & 0xFF00);
 	}
 }
+
+void updatecuraddr(uint32_t addr)
+{
+	Flash_ReadBytes(&curaddr[0], addr, 4);
+	nowcurAddr1 =  ((uint32_t)curaddr[0] << 16) | curaddr[1];
+}
+
+void updatecurpack(uint32_t addr)
+{
+	Flash_ReadBytes(&curapack[0], addr+4, 2);
+	nowcurpack = curapack[0];
+}
+
+int compareArrays(uint16_t arr1[], uint16_t arr2[], int size) {
+    for (int i = 0; i < size; i++) {
+        if (arr1[i] != arr2[i]) {
+            return 0; // 数组不一致,返回0
+        }
+    }
+    return 1; // 数组一致,返回1
+}
 /* USER CODE END 1 */

BIN
Doc/iocollect软件功能说明及操作说明书.docx


BIN
Doc/~$collect软件功能说明及操作说明书.docx


+ 32 - 2
MDK-ARM/iocollect.uvoptx

@@ -203,7 +203,27 @@
         <Ww>
           <count>9</count>
           <WinNumber>1</WinNumber>
-          <ItemText>scb</ItemText>
+          <ItemText>nowcurAddr</ItemText>
+        </Ww>
+        <Ww>
+          <count>10</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>nowcurAddr1</ItemText>
+        </Ww>
+        <Ww>
+          <count>11</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>AddrToWrite</ItemText>
+        </Ww>
+        <Ww>
+          <count>12</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>nowcurpack</ItemText>
+        </Ww>
+        <Ww>
+          <count>13</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>sameIndex</ItemText>
         </Ww>
       </WatchWindow1>
       <WatchWindow2>
@@ -212,12 +232,22 @@
           <WinNumber>2</WinNumber>
           <ItemText>digest</ItemText>
         </Ww>
+        <Ww>
+          <count>1</count>
+          <WinNumber>2</WinNumber>
+          <ItemText>iapbinMd5_1</ItemText>
+        </Ww>
+        <Ww>
+          <count>2</count>
+          <WinNumber>2</WinNumber>
+          <ItemText>iapbinMd5</ItemText>
+        </Ww>
       </WatchWindow2>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>0</SubType>
-          <ItemText>0x807F07A</ItemText>
+          <ItemText>0x8075000</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>

+ 2 - 2
MDK-ARM/iocollect.uvprojx

@@ -49,7 +49,7 @@
             <InvalidFlash>1</InvalidFlash>
           </TargetStatus>
           <OutputDirectory>..\Output\</OutputDirectory>
-          <OutputName>iocollect_23080700</OutputName>
+          <OutputName>iocollect_23080800</OutputName>
           <CreateExecutable>1</CreateExecutable>
           <CreateLib>0</CreateLib>
           <CreateHexFile>1</CreateHexFile>
@@ -82,7 +82,7 @@
           <AfterMake>
             <RunUserProg1>1</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name>fromelf.exe --bin --output ..\Output\iocollect_23080700.bin ..\Output\*.axf</UserProg1Name>
+            <UserProg1Name>fromelf.exe --bin --output ..\Output\iocollect_23080800.bin ..\Output\*.axf</UserProg1Name>
             <UserProg2Name></UserProg2Name>
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>

BIN
Output/iocollect_23080800.bin


File diff suppressed because it is too large
+ 2149 - 0
Output/iocollect_23080800.hex


+ 46 - 0
Output/iocollect_23080800.lnp

@@ -0,0 +1,46 @@
+--cpu Cortex-M3
+"..\output\startup_stm32f103xe.o"
+"..\output\iap.o"
+"..\output\datahandling.o"
+"..\output\main.o"
+"..\output\gpio.o"
+"..\output\freertos.o"
+"..\output\adc.o"
+"..\output\dma.o"
+"..\output\tim.o"
+"..\output\usart.o"
+"..\output\stm32f1xx_it.o"
+"..\output\stm32f1xx_hal_msp.o"
+"..\output\stm32f1xx_hal_timebase_tim.o"
+"..\output\md5c.o"
+"..\output\stm32f1xx_hal_gpio_ex.o"
+"..\output\stm32f1xx_hal_adc.o"
+"..\output\stm32f1xx_hal_adc_ex.o"
+"..\output\stm32f1xx_hal.o"
+"..\output\stm32f1xx_hal_rcc.o"
+"..\output\stm32f1xx_hal_rcc_ex.o"
+"..\output\stm32f1xx_hal_gpio.o"
+"..\output\stm32f1xx_hal_dma.o"
+"..\output\stm32f1xx_hal_cortex.o"
+"..\output\stm32f1xx_hal_pwr.o"
+"..\output\stm32f1xx_hal_flash.o"
+"..\output\stm32f1xx_hal_flash_ex.o"
+"..\output\stm32f1xx_hal_exti.o"
+"..\output\stm32f1xx_hal_tim.o"
+"..\output\stm32f1xx_hal_tim_ex.o"
+"..\output\stm32f1xx_hal_uart.o"
+"..\output\system_stm32f1xx.o"
+"..\output\croutine.o"
+"..\output\event_groups.o"
+"..\output\list.o"
+"..\output\queue.o"
+"..\output\stream_buffer.o"
+"..\output\tasks.o"
+"..\output\timers.o"
+"..\output\cmsis_os.o"
+"..\output\heap_4.o"
+"..\output\port.o"
+--library_type=microlib --strict --scatter "..\Output\iocollect_23080800.sct"
+--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
+--info sizes --info totals --info unused --info veneers
+--list "..\Output\iocollect_23080800.map" -o ..\Output\iocollect_23080800.axf