454 lines
11 KiB
C
454 lines
11 KiB
C
|
|
|
|||
|
|
#include "stiap.h"
|
|||
|
|
|
|||
|
|
#include "stapp.h"
|
|||
|
|
|
|||
|
|
#include "crc32.h"
|
|||
|
|
#include "trigger.h"
|
|||
|
|
#include "shell.h"
|
|||
|
|
#include "delay.h"
|
|||
|
|
|
|||
|
|
#if (0) // <20><>ʱ<EFBFBD><CAB1>ʩ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#include "can.h"
|
|||
|
|
#include "fmc.h"
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//===================================================================
|
|||
|
|
// IAP<41><50><EFBFBD><EFBFBD>
|
|||
|
|
// stfaddr: Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
|||
|
|
// saveaddr: Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NORFLASH <20><> RAM <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ.
|
|||
|
|
// size: Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>С <20><><EFBFBD>ֽڣ<D6BD>
|
|||
|
|
|
|||
|
|
int WriteAppBinData(u32 stfaddr, u32 saveaddr, u32 size)
|
|||
|
|
{
|
|||
|
|
int rslt = 0;
|
|||
|
|
u32 faddr = stfaddr;
|
|||
|
|
u32 saddr = saveaddr;
|
|||
|
|
u32 wrsize = size;
|
|||
|
|
u16 thissize;
|
|||
|
|
#ifdef STM32_FLASH_SEC_SIZE // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
#define STM32_RW_BUFF_SIZE (STM32_FLASH_SEC_SIZE)
|
|||
|
|
#else
|
|||
|
|
#define STM32_RW_BUFF_SIZE (STM32_FLASH_RW_SIZE)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH || APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
u8 iapbuf[STM32_RW_BUFF_SIZE];
|
|||
|
|
#else
|
|||
|
|
u8 * iapbuf;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if (NO_BUFF_WHEN_WT == 1) // 20230928 ljs <20><EFBFBD>д<EFBFBD><D0B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ʧ<EFBFBD><CAA7>
|
|||
|
|
u32 secIdx = GetFlashSectorIdx(faddr);
|
|||
|
|
u32 secnums = GetFlashSectorIdx(faddr+wrsize);
|
|||
|
|
secnums = secnums - secIdx + 1;
|
|||
|
|
STMFlashErase(secIdx, secnums);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
printf("Write data to addr = 0x%x begin\r\n", (unsigned int)faddr);
|
|||
|
|
while (wrsize > 0)
|
|||
|
|
{
|
|||
|
|
if (wrsize < STM32_RW_BUFF_SIZE)
|
|||
|
|
{
|
|||
|
|
thissize = wrsize;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
thissize = STM32_RW_BUFF_SIZE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
DatFlashRdData(saddr, iapbuf, thissize); // <20><> norflash <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
iapbuf = (u8*)saddr; // <20><> ram <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
STMFlashRead(saddr, (u16*)iapbuf, thissize/2); // <20><>st flash <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#else
|
|||
|
|
break;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
STMFlashWrite(faddr, (u16*)iapbuf, thissize/2, 1); // д<><D0B4><EFBFBD>ݵ<EFBFBD>stm32<33><32>flash<73><68>
|
|||
|
|
|
|||
|
|
rslt = STMFlashCheck(faddr, (u16*)iapbuf, thissize/2); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
|
|||
|
|
if (rslt != 0)
|
|||
|
|
{
|
|||
|
|
printf("\r\nWriteAppBinData error. addr=0x%x, size=%d\r\n", (unsigned int)faddr, thissize);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
PutChar('.');
|
|||
|
|
faddr += thissize; // ָ<><D6B8>ƫ<EFBFBD><C6AB>
|
|||
|
|
saddr += thissize; // ָ<><D6B8>ƫ<EFBFBD><C6AB>
|
|||
|
|
wrsize -= thissize;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("write data finish\r\n");
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
printf("WriteAppBinData finish, check all data\r\n");
|
|||
|
|
rslt = STMFlashCheck(stfaddr, (u16*)saveaddr, size/2); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
printf("WriteAppBinData ok\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
if (rslt != 0)
|
|||
|
|
{
|
|||
|
|
printf("WriteAppBinData failed\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
// 20230523 <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ⲿRAM<41><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
char g_appEnFlag[16] = {0xff};
|
|||
|
|
void SetAppEnFlag(int flag)
|
|||
|
|
{
|
|||
|
|
if (flag == 0)
|
|||
|
|
{
|
|||
|
|
memset(g_appEnFlag, 0xff, 16);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
strcpy(g_appEnFlag, APP_RIGHT);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int IsAppRight(void)
|
|||
|
|
{
|
|||
|
|
if (strcmp((void*)APP_RIGHT, g_appEnFlag) != 0)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
// bootloader <20>ӿں<D3BF><DABA><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ӵ洢<D3B4><E6B4A2><EFBFBD><EFBFBD>APP<50><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int UpdateApp(void)
|
|||
|
|
{
|
|||
|
|
int rslt = 0;
|
|||
|
|
u32 saveaddr; // <20><><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD><C8A1>ַ
|
|||
|
|
u32 stfaddr; // <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ַ
|
|||
|
|
u32 appsize, wsize;
|
|||
|
|
u32 crc;
|
|||
|
|
IapHead iaphd;
|
|||
|
|
u32 resetaddr, stacktop;
|
|||
|
|
|
|||
|
|
memset(&iaphd, 0, sizeof(IapHead));
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
u32 taddr = (u32)(&iaphd);
|
|||
|
|
DatFlashRdData(APP_MARK_ADDR, (u8 *)(taddr), sizeof(IapHead)/sizeof(u8)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
memcpy((void*)(&iaphd), (void*)APP_MARK_ADDR, sizeof(IapHead)); // <20><><EFBFBD><EFBFBD>iaphead <20><><EFBFBD><EFBFBD>
|
|||
|
|
SetAppEnFlag(1);
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
u32 taddr = (u32)(&iaphd);
|
|||
|
|
STMFlashRead(APP_MARK_ADDR, (u16*)(taddr), sizeof(IapHead)/sizeof(u16));
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
crc = CalcCrc32((u8*)&(iaphd), sizeof(IapHead)-sizeof(iaphd.checkcrc)); // У<><D0A3>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
|||
|
|
|
|||
|
|
printf("UpdateApp begin\r\n");
|
|||
|
|
#if (0)
|
|||
|
|
printf("iaphd.upmask=%s\r\n", iaphd.upmask);
|
|||
|
|
printf("iaphd.rdaddr=0x%x\r\n", iaphd.rdaddr);
|
|||
|
|
printf("iaphd.wraddr=0x%x\r\n", iaphd.wraddr);
|
|||
|
|
printf("iaphd.size=0x%x\r\n", iaphd.size);
|
|||
|
|
printf("iaphd.wsize=0x%x\r\n", iaphd.wsize);
|
|||
|
|
printf("iaphd.appcheck=0x%x\r\n", iaphd.appcheck);
|
|||
|
|
printf("calc iaphd crc = 0x%x, save iaphd.checkcrc = 0x%x\r\n", crc, iaphd.checkcrc);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (crc != iaphd.checkcrc)
|
|||
|
|
{
|
|||
|
|
printf("updatedata checkcrc err\r\n");
|
|||
|
|
return -1; // У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (strcmp((void*)STM32_MARK, iaphd.upmask) != 0) // <20>Ƚ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("updatedata upmask err\r\n");
|
|||
|
|
return 0; // <20><>һ<EFBFBD><D2BB>, <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
saveaddr = iaphd.rdaddr + APP_SAVE_BASE; // <20><>ȡ<EFBFBD><C8A1>ַ
|
|||
|
|
stfaddr = iaphd.wraddr + STM32_FLASH_BASE; // д<><D0B4><EFBFBD><EFBFBD>ַ
|
|||
|
|
appsize = iaphd.size;
|
|||
|
|
wsize = iaphd.wsize;
|
|||
|
|
|
|||
|
|
if ((stfaddr < STM32_APP_ADDR) ||
|
|||
|
|
(stfaddr >= (STM32_FLASH_BASE + STM32_FLASH_SIZE)) ||
|
|||
|
|
(saveaddr < APP_ADDR_BEG) ||
|
|||
|
|
0 ) // <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
|||
|
|
{
|
|||
|
|
printf("flash addr error\r\n");
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
crc = GetAppSaveDataCrc(saveaddr, appsize);
|
|||
|
|
|
|||
|
|
if (crc != iaphd.appcheck)
|
|||
|
|
{
|
|||
|
|
printf("save data crc check error, crc=0x%x, appcheck=0x%x\r\n", crc, iaphd.appcheck);
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>Ӵ洢<D3B4><E6B4A2><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1>λ<EFBFBD><CEBB>ַ<EFBFBD><D6B7>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
{
|
|||
|
|
u8 buff[8];
|
|||
|
|
DatFlashRdData(APP_ADDR_BEG, buff, 8);
|
|||
|
|
stacktop = *(__IO uint32_t*)(buff); // ջ<><D5BB><EFBFBD><EFBFBD>ַ
|
|||
|
|
resetaddr = *(__IO uint32_t*)(buff+4); // <20><>λ<EFBFBD><CEBB>ַ
|
|||
|
|
}
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM || APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
stacktop = *(__IO uint32_t*)(APP_ADDR_BEG); // ջ<><D5BB><EFBFBD><EFBFBD>ַ
|
|||
|
|
resetaddr = *(__IO uint32_t*)(APP_ADDR_BEG+4); // <20><>λ<EFBFBD><CEBB>ַ
|
|||
|
|
#else
|
|||
|
|
return -2;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
printf("save file stacktop = 0x%x, resetaddr=0x%x\r\n", (unsigned int)stacktop, (unsigned int)resetaddr);
|
|||
|
|
if ((resetaddr >= STM32_APP_ADDR) &&
|
|||
|
|
((resetaddr & 0xFF000000) == 0x08000000) && // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ0X08XXXXXX
|
|||
|
|
((stacktop & 0x2FFC0000) == 0x20000000) && // <20><><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
printf("save data ok\r\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("save data not right\r\n");
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
SetAppEnFlag(0); // <20><><EFBFBD><EFBFBD>app<70><70>ȷ<EFBFBD><C8B7>־....
|
|||
|
|
#endif
|
|||
|
|
printf("UpdateApp: from add=0x%x to stadd=0x%x, size=%d, wsize=%d\r\n", saveaddr, stfaddr, appsize, wsize);
|
|||
|
|
|
|||
|
|
rslt = WriteAppBinData(stfaddr, saveaddr, wsize); // <20><><EFBFBD><EFBFBD>FLASH<53><48><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
DatFlash4kErase(APP_MARK_ADDR, 1); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
memset((void*)APP_MARK_ADDR, 0xff, IAPHEAD_LEN); // ȫ<><C8AB>дΪ0xff
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
STMFlashErase(GetFlashSectorIdx(APP_MARK_ADDR), 1);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
SetAppEnFlag(1);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
__WEAK void CloseAllPeripheral()
|
|||
|
|
{
|
|||
|
|
__disable_irq(); // <20>ر<EFBFBD><D8B1>ж<EFBFBD>
|
|||
|
|
|
|||
|
|
#if (0) // <20><>ʱ<EFBFBD><CAB1>ʩ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
HAL_DeInit();
|
|||
|
|
|
|||
|
|
LL_GPIO_DeInit(GPIOA);
|
|||
|
|
LL_GPIO_DeInit(GPIOB);
|
|||
|
|
LL_GPIO_DeInit(GPIOC);
|
|||
|
|
LL_GPIO_DeInit(GPIOD);
|
|||
|
|
LL_GPIO_DeInit(GPIOE);
|
|||
|
|
LL_GPIO_DeInit(GPIOF);
|
|||
|
|
LL_GPIO_DeInit(GPIOG);
|
|||
|
|
|
|||
|
|
LL_EXTI_DeInit();
|
|||
|
|
|
|||
|
|
HAL_ADC_DeInit(&hadc3);
|
|||
|
|
|
|||
|
|
HAL_CAN_DeInit(&HCAN);
|
|||
|
|
|
|||
|
|
HAL_SRAM_DeInit(&hsram1);
|
|||
|
|
HAL_SRAM_DeInit(&hsram2);
|
|||
|
|
HAL_SRAM_DeInit(&hsram3);
|
|||
|
|
HAL_SRAM_DeInit(&hsram4);
|
|||
|
|
|
|||
|
|
LL_SPI_DeInit(SPI1);
|
|||
|
|
LL_SPI_DeInit(SPI2);
|
|||
|
|
|
|||
|
|
LL_TIM_DeInit(TIM1);
|
|||
|
|
LL_TIM_DeInit(TIM2);
|
|||
|
|
LL_TIM_DeInit(TIM3);
|
|||
|
|
LL_TIM_DeInit(TIM4);
|
|||
|
|
LL_TIM_DeInit(TIM5);
|
|||
|
|
LL_TIM_DeInit(TIM6);
|
|||
|
|
LL_TIM_DeInit(TIM7);
|
|||
|
|
LL_TIM_DeInit(TIM8);
|
|||
|
|
|
|||
|
|
LL_USART_DeInit(USART1);
|
|||
|
|
LL_USART_DeInit(USART2);
|
|||
|
|
LL_USART_DeInit(USART3);
|
|||
|
|
LL_USART_DeInit(UART4);
|
|||
|
|
LL_USART_DeInit(UART5);
|
|||
|
|
#else
|
|||
|
|
LL_EXTI_DeInit();
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
__disable_irq(); // <20>ر<EFBFBD><D8B1>ж<EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//===================================================================
|
|||
|
|
|
|||
|
|
// <20><>ת<EFBFBD><D7AA>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int JumpToApp(void)
|
|||
|
|
{
|
|||
|
|
typedef void (*iapfun)(void); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD>.
|
|||
|
|
int rslt;
|
|||
|
|
u32 resetaddr, stacktop;
|
|||
|
|
|
|||
|
|
printf("Begin run app\r\n");
|
|||
|
|
|
|||
|
|
// <20><>flash<73>ж<EFBFBD>ȡ<EFBFBD><C8A1>λ<EFBFBD><CEBB>ַ<EFBFBD><D6B7>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ
|
|||
|
|
stacktop = *(__IO uint32_t*)(STM32_APP_ADDR); // ջ<><D5BB><EFBFBD><EFBFBD>ַ
|
|||
|
|
resetaddr = *(__IO uint32_t*)(STM32_APP_ADDR+4); // <20><>λ<EFBFBD><CEBB>ַ
|
|||
|
|
rslt = 0;
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
rslt = IsAppRight();
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
printf("stacktop = 0x%x, resetaddr=0x%x\r\n", (unsigned int)stacktop, (unsigned int)resetaddr);
|
|||
|
|
|
|||
|
|
DelayMs(100);
|
|||
|
|
|
|||
|
|
if ( (rslt == 0) &&
|
|||
|
|
(resetaddr >= STM32_APP_ADDR) &&
|
|||
|
|
((resetaddr & 0xFF000000) == 0x08000000) && // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ0X08XXXXXX
|
|||
|
|
((stacktop & 0x2FFC0000) == 0x20000000) && // <20><><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
iapfun jump;
|
|||
|
|
|
|||
|
|
printf("Jump to app address\r\n");
|
|||
|
|
|
|||
|
|
DelayMs(100);
|
|||
|
|
|
|||
|
|
CloseAllPeripheral();
|
|||
|
|
DelayMs(100);
|
|||
|
|
|
|||
|
|
jump = (iapfun)(resetaddr); // <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ(<28><>λ<EFBFBD><CEBB>ַ)
|
|||
|
|
__set_MSP(stacktop); // <20><>ʼ<EFBFBD><CABC> APP <20><>ջָ<D5BB><D6B8> (<28>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ)
|
|||
|
|
jump(); // <20><>ת<EFBFBD><D7AA>APP.
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("run app failed\r\n");
|
|||
|
|
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
// app <20><><EFBFBD><EFBFBD>iapģ<70>鹦<EFBFBD>ܽӿں<D3BF><DABA><EFBFBD>
|
|||
|
|
|
|||
|
|
void IAPCleanUpdateArea(void)
|
|||
|
|
{
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> norflash <20>Ŀ<EFBFBD>
|
|||
|
|
u32 addr;
|
|||
|
|
int erflag;
|
|||
|
|
int count = 0;
|
|||
|
|
|
|||
|
|
printf("IAPCleanUpdateArea, erase begin\r\n");
|
|||
|
|
|
|||
|
|
addr = NOR_SAVE_BASE;
|
|||
|
|
while(addr < NOR_SAVE_END)
|
|||
|
|
{
|
|||
|
|
erflag = IsDatFlashEmpty(addr, SNF_BYTES_PER_SEC); // <20>ж<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
|||
|
|
|
|||
|
|
if (erflag != 0)
|
|||
|
|
{
|
|||
|
|
DatFlash4kErase(addr, 1); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
PutChar('.');
|
|||
|
|
count++;
|
|||
|
|
//erflag = IsDatFlashEmpty(addr, SNF_BYTES_PER_SEC); // <20>ж<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
|||
|
|
//printf("erase failed, addr=%d, idx=%d, flag=%d\r\n", addr, (addr-NOR_SAVE_BASE)/SNF_BYTES_PER_SEC, erflag);
|
|||
|
|
}
|
|||
|
|
addr += SNF_BYTES_PER_SEC; // <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("IAPCleanUpdateArea finish, count=%d\r\n", count);
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
memset((void*)EXRAM_SAVE_BASE, 0xff, STM32_FLASH_SIZE); // ȫ<><C8AB>дΪ0xff
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
STMFlashErase(GetFlashSectorIdx(APP_SAVE_BASE), (STF_UPDATE_SIZE+MARK_SIZE)/STM32_FLASH_SEC_SIZE);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ, <20><><EFBFBD>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|||
|
|
void IapWritePara(u32 rdAddr, u32 wrAddr, u32 len, u32 wlen, u32 check)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>ݳ<EFBFBD><DDB3>ȱ<EFBFBD><C8B1><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>(STM32_FLASH_SEC_SIZE)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
IapHead iaphd;
|
|||
|
|
memset(&iaphd, 0xff, sizeof(IapHead));
|
|||
|
|
|
|||
|
|
strcpy(iaphd.upmask, STM32_MARK);
|
|||
|
|
iaphd.rdaddr = rdAddr;
|
|||
|
|
iaphd.wraddr = wrAddr;
|
|||
|
|
iaphd.size = len;
|
|||
|
|
iaphd.wsize = wlen;
|
|||
|
|
iaphd.appcheck = check;
|
|||
|
|
iaphd.checkcrc = CalcCrc32((u8*)&(iaphd.upmask[0]), sizeof(IapHead)-sizeof(iaphd.checkcrc)); // У<><D0A3>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
|||
|
|
|
|||
|
|
printf("IapWritePara begin\r\n");
|
|||
|
|
|
|||
|
|
#if (0)
|
|||
|
|
printf("iaphd.upmask %s\r\n", iaphd.upmask);
|
|||
|
|
printf("iaphd.rdaddr=0x%x\r\n", iaphd.rdaddr);
|
|||
|
|
printf("iaphd.wraddr=0x%x\r\n", iaphd.wraddr);
|
|||
|
|
printf("iaphd.size=0x%x\r\n", iaphd.size);
|
|||
|
|
printf("iaphd.wsize=0x%x\r\n", iaphd.wsize);
|
|||
|
|
printf("iaphd.appcheck=0x%x\r\n", iaphd.appcheck);
|
|||
|
|
printf("iaphd.checkcrc = 0x%x\r\n", iaphd.checkcrc);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
DatFlash4kErase(NOR_MARK_ADDR, 1); // 4k<34><6B><EFBFBD><EFBFBD>
|
|||
|
|
u32 taddr = (u32)(&iaphd);
|
|||
|
|
DatFlashWrData(NOR_MARK_ADDR, (u8*)(taddr), sizeof(IapHead)/sizeof(u8)); // д<><D0B4>
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
memcpy((void*)EXRAM_MARK_ADDR, (void*)(&(iaphd)), sizeof(IapHead));
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
STMFlashErase(GetFlashSectorIdx(APP_MARK_ADDR), 1);
|
|||
|
|
u32 taddr = (u32)(&iaphd);
|
|||
|
|
STMFlashWrite(APP_MARK_ADDR, (u16*)(taddr), sizeof(IapHead)/sizeof(u16), 3); // д<><D0B4>
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
printf("IapWritePara end\r\n");
|
|||
|
|
|
|||
|
|
DelayMs(100);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|