作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 HAL_FLASH_Program() 将 uuid 编程到特定地址。我可以通过从同一地址读取来验证它是否写入成功。但是,如果我重新启动 MCU,该地址的内存将返回到原始值。如果我直接通过 ST-Link 写入它,那么它会永久保留。
有人知道这是为什么吗?在使用 HAL_FLASH_Program() 写入之前,我是否需要删除内存位置?我正在使用 STM32F745。
我的代码非常简单:
#define UUID_ADDR (0x080FFFFB)
uint16_t uuid 0x1234
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, UUID_ADDR, uuid);
谢谢
最佳答案
闪存要求您要写入的扇区必须处于删除状态才能写入。
为此,您需要一些额外的步骤才能使写入持久化。
下面是如何操作的示例,但请确保地址符合您的目的,这里只是一个通用代码:
HAL_StatusTypeDef write_halfword_to_flash(uint32_t sector, uint32_t addr, void *data) {
HAL_StatusTypeDef status = HAL_FLASH_Unlock();
uint32_t error = 0;
// make sure that this structure matches the datasheet of your chip
FLASH_EraseInitTypedef FLASH_EraseInitStruct = {
.TypeErase = FLASH_TYPEERASE_SECTORS,
.Sector = sector,
.NbSectors = 1,
.VoltageRange = FLASH_VOLTAGE_RANGE_3
};
// clear all flags before you write it to flash
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR |
FLASH_FLAG_WRPERR | FLASH_FLAGH_PGAERR | FLAG_PGSERR);
if (status != HAL_OK)
return status;
// perform the erase first
HAL_FLASHEx_Erase(&FLASH_EraseInitStruct, &error);
if (error)
return -1;
// now that the sector is erased, we can write to it
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, data);
if (status != HAL_OK)
return status;
HAL_FLASH_Unlock();
return status;
}
关于STM32F745 - HAL_FLASH_Program 不永久写入闪存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61509933/
我正在使用 HAL_FLASH_Program() 将 uuid 编程到特定地址。我可以通过从同一地址读取来验证它是否写入成功。但是,如果我重新启动 MCU,该地址的内存将返回到原始值。如果我直接通过
我是一名优秀的程序员,十分优秀!