OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3034|回复: 0

关于原子IAP代码里操作Flash的问题讨论

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-9-19
在线时间
2 小时
发表于 2019-9-19 15:30:22 | 显示全部楼层 |阅读模式
    刚开始看到正点原子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的连续调用有关,但是具体原因还想不懂,希望有大佬给指导指导

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 14:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表