一主多从下的IAP升级(二)

Flash操作:

写几个常用的操作flash函数,主要就是,flash的擦写和查找:

因为查找手册flash的擦除是整页擦除,我们的擦除一页的单位是2k,说明擦除一次至少擦2k,具体芯片flash擦除大小需要查看手册

首先做一下flash分区,要给boot,bootflag,APP等留出足够的空间

建议可以在flash相关的.h文件中定义下flash分区,这样方便写flash相关函数,也方便后续维护,例如要改各个分区的大小时,如果用宏去做定义,就会相对方便

#define ROM_FLASH_BASE 0x08000000

#define ROM_BOOTLOADER_BASE ROM_FLASH_BASE
#define ROM_BOOTLOADER_SIZE (18 * 1024)

#define ROM_BOOTFLAG_BASE (ROM_BOOTLOADER_BASE + ROM_BOOTLOADER_SIZE)
#define ROM_BOOTFLAG_SIZE (2 * 1024)

#define ROM_APP_BASE (ROM_BOOTFLAG_BASE + ROM_BOOTFLAG_SIZE)
#define ROM_APP_SIZE (100 * 1024)

#define ROM_WRITE_LIMIT (ROM_APP_BASE+ROM_APP_SIZE)

如上,可以定义bootload的起始地址,大小为18k,bootflag大小为2k,APP大小为100k,这样一次排列,当然也可以拓展,比如说多定义一些地址,去存特定的东西,这里只定义这三个分区

//flash之擦除整页
void flash_erase_page(uint32_t BaseAddr)
{
    //对要擦除的地址做判断是否合法
    if(BaseAddr >= ROM_WRITE_LIMIT || BaseAddr < ROM_FLASH_BASE)
        return;
    __disable_irq();
    FLASH_Unlock();
    //此处也可以做一个重试机制,以防偶现不成功的情况
    FLASH_COMPLETE == FLASH_ErasePage(u32BaseAddr))
    FLASH_Lock();
    __enable_irq();
}

//flash之读存特定数据
void flash_read_obj(FlashObj_e eObj){//这里使用枚举,主要为了扩展实际代码不止固定读某个分区
    switch(eObj){
        case eBOOTFLAG:
            //提供bootflag的起始地址addr和宽度len,读出要存入的变量data
            break;
        default:
            return;
    read_flash_data(data,addr,len);
}
//同读函数即可
void flash_save_obj(FlashObj_e eObj){//这里使用枚举,主要为了扩展实际代码不止固定存入某个分区
    switch(eObj){
        case FLASH_BOOT_FLAG:
            //对应存储即可,代码部分可使用写函数进行特定写入
            break;
        default:
            return;
    write_flash_data(desaddr,len,srcaddr);
}

void flash_eara_obj(FlashObj_e eObj)//同理

读写flash的时候,还可以存入一些crc等校验,可以在读出的时候去做一些校验,

并且在读写flash之前,应该增加一些地址限制的判断

此处只做个函数示例,具体场景下还需要具体分析。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值