optical/NxFuncs/stiap/stiap.c

454 lines
11 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#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);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////