|
@@ -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: // 启动失败
|
|
|
{
|