iapfun jump2app;
u32 iapbuf[512] = {0}; //2K字节缓存
// appxaddr: 应用程序的起始地址
// appbuf: 应用程序 CODE(代码)的指针,指向待写入的二进制数据
// appsize: 应用程序大小(字节),指明待写入数据的长度
//u32 TEXT_LENTH; //数组长度
//u32 SIZE;
void iap_write_appbin(u32 appxaddr, u8 *appbuf, u32 appsize)
{
u32 t; // 循环计数器
u16 i = 0; // 用于记录当前缓冲区中的字节数
u32 temp; // 用于临时存储读取的 32 位数据
u32 fwaddr = appxaddr; // 当前写入的地址,初始化为应用程序的起始地址
u8 *dfu = appbuf; // 指向待写入数据的指针,初始化为应用程序缓冲区
// 循环遍历待写入的应用程序数据,每次处理 4 字节
for (t = 0; t < appsize; t += 4)
{
// 将 4 字节的数据从 appbuf 中读取并组合成一个 32 位的整数
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; // 将组合好的 32 位数据存入缓冲区
if (i == 16)
{
i = 0; // 重置缓冲区计数器
STMFLASH_Write(fwaddr, iapbuf, 16); // 将缓冲区中的数据写入到 Flash,32个字节
fwaddr += 64; // 更新写入地址,偏移 32 字节(8 * 4 = 32)
}
}
// 如果缓冲区中还有未写入的数据(即 i 不为 0),将最后的一些内容字节写入 Flash
if (i)
STMFLASH_Write(fwaddr, iapbuf, i); // 将剩余的字节写入到 Flash
}
出现的情况是大批量写入flash出现间隔写入失败,为0xff的情况,解决方法是将一次性写入1024个改为64字节,解决问题