刚开始看到正点原子STM32F429的IAP例程时,就对里面烧写APP程序时使用2K字节的缓存表示疑惑。不明白为什么要有这2K字节的缓存。
u32 iapbuf[512]; //2K字节缓存
//appxaddr:应用程序的起始地址
//appbuf:应用程序CODE.
//appsize:应用程序大小(字节).
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
u32 t;
u16 i=0;
u32 temp;
u32 fwaddr=appxaddr;//当前写入的地址
u8 *dfu=appbuf;
for(t=0;t<appsize;t+=4)
{
temp=(u32)dfu[3<<24;
temp|=(u32)dfu[2<<16;
temp|=(u32)dfu[1<<8;
temp|=(u32)dfu[0];
dfu+=4;//偏移4个字节
iapbuf[i++=temp;
if(i==512)
{
i=0;
STMFLASH_Write(fwaddr,iapbuf,512);
fwaddr+=2048;//偏移2048 512*4=2048
}
}
if(i)STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.
}
后来自己写了一个不做缓存的程序,就是把APP程序一直循环写入Flash里面,但是后来发现虽然写入没有问题,但是程序会在其它地方有莫名其妙的BUG,用回一定字节的缓存程序就没有问题。
extern HAL_FLASH_StatusTypeDef Hal_Flash_write(uint32_t address, uint8_t *buffer, uint32_t byte_number)
{
uint32_t write_address = address;
uint32_t end_address = address + byte_number;
uint32_t *word = (uint32_t *)buffer;
if ((address < STM32_FLASH_BASE) || (address % 4))
{
return HAL_FLASH_FAIL;
}
HAL_FLASH_Unlock();
while (write_address < end_address)
{
if (HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, write_address, *word))
{
HAL_FLASH_Lock();
return HAL_FLASH_FAIL;
}
write_address += 4;
word++;
}
HAL_FLASH_Lock();
if (0 != memcmp((char *)address, buffer, byte_number))
{
return HAL_FLASH_FAIL;
}
return HAL_FLASH_SUCCEED;
}
我有想过会不会跟HAL_FLASH_Program的连续调用有关,但是具体原因还想不懂,希望有大佬给指导指导。 |