关于正点原子的stm32h743 iap固件升级例程出现的问题解决

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字节,解决问题

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值