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的值。证明了擦除方向是往地址越小的方向。