gpt4 book ai didi

STM32F745 - HAL_FLASH_Program 不永久写入闪存

转载 作者:行者123 更新时间:2023-12-05 07:09:36 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com