打印

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

[复制链接]
270|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一亚麻怡|  楼主 | 2018-7-9 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始看到正点原子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的连续调用有关,但是具体原因还想不懂,希望有大佬给指导指导。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

404

主题

404

帖子

0

粉丝