STM32F103C8T6 Flash读写注意事项

STM32F103C8T6 Flash读写
使用HAL_FLASHEx_Erase(&f,&pageError) 擦除页时,擦除的方向不是给定地址往后一页(在F103中是1kb,也就是 地址值增加0x400) 而是往前1kb.
函数解析:

HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
  函数内部调用,可以看出,往后移也不一定是1kb,在代码  address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress) 中 NbPages * FLASH_PAGE_SIZE 才是真正的擦除量。
       if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)
      {
        /*Initialization of PageError variable*/
        *PageError = 0xFFFFFFFFU;
        
        /* Erase page by page to be done*/
        for(address = pEraseInit->PageAddress;
            address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress);
            address += FLASH_PAGE_SIZE)
        {
          FLASH_PageErase(address);
          
          /* Wait for last operation to be completed */
          status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
          
          /* If the erase operation is completed, disable the PER Bit */
          CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
          
          if (status != HAL_OK)
          {
            /* In case of error, stop erase procedure and return the faulty address */
            *PageError = address;
            break;
          }
        }
      }

经过实测 擦除的内容为: 地址和地址前1kb内容。
例如:
在这里插入图片描述
在这里插入图片描述
代码中 0x0800FBFF 0x0800F700 相差0x4FF 距离大于0x400,0x400 转化为10进制刚好是1024,也就是1k。当使用擦除HAL_FLASHEx_Erase擦除0x0800FBFF 时,会将0x0800F7FF-0x0800FBFF一起擦除,0x0800F700 在此外所以不影响。当ADDR的地址改为0x0800F800 时出现 0x0800F800 的值为0xFFFFFFFF,如图中 a的值。证明了擦除方向是往地址越小的方向。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值