|
楼主 |
发表于 2017-1-18 10:39:52
|
显示全部楼层
#define WRITE_ADDRESS 0x8010000
#define APPLICATION_ADDRESS (uint32_t)(0x08010000)
void updataApplication(__IO uint32_t* ReadAddress,__IO uint32_t* WriteAddress)
{
u8 n;
u8 datatemp[516];
uint32_t data[128];
int lent=0,leng=0;;
FLASH_Unlock();
FLASH_If_Erase(WRITE_ADDRESS);
// while(*ReadAddress<0x8100000)
// {
// data=*(uint32_t*)*ReadAddress;
// FLASH_ProgramWord(*WriteAddress, data);
// *ReadAddress += 4;
// *WriteAddress+= 4;
// }
while(*WriteAddress<0x8100000)
{
// FLASH_If_Write(&WriteAddress, data ,4096*256);
W25QXX_Read(datatemp,w52q128_addr+4096*512,516);
lent = datatemp[0]*256+datatemp[1];
if((datatemp[lent+2]==CRC16_2(datatemp,lent+2)%256)&&(datatemp[lent+3]==CRC16_2(datatemp,lent+2)/256%256))
{
leng = lent/4;
if((lent%4)!=0) leng++;
memset(data,0xFF,sizeof(uint32_t)*128);
for(n=0;n<leng;n++)
{
data[n] = datatemp[(n*4)+5]*256*256*256 + datatemp[(n*4)+4]*256*256 + datatemp[(n*4)+3]*256 + datatemp[n*4+2];
FLASH_ProgramWord(*WriteAddress, data[n]);
*WriteAddress+= 4;
}
w52q128_addr+=516;
if(lent<512) //tftp最后一个包小于512字节
{
FLASH_Lock();
break;
}
}
}
FLASH_Lock();
}
void stm32_app()
{
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
AppAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) AppAddress;
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
__disable_irq(); //关闭所有中断
Jump_To_Application(); //执行应用程序
}
}
因为公司项目,加密了不能把全部源码上传,这是IAP里的主要两个函数 |
|