简体   繁体   English

无法从闪存中擦除数据 (STM32)

[英]Can´t erase data from flash memory (STM32)

I´m trying to save some data to flash memory on my STM32F407 board.我正在尝试将一些数据保存到STM32F407板上的闪存中。 Before I can save them I need to erase memory sector.在我保存它们之前,我需要擦除内存扇区。 I choosed 16 Kbytes Sector1 starting with address 0x08004000 and choosed Voltage range 2.1-2.7 V .我选择了从地址0x08004000开始的 16 KB Sector1并选择了电压范围 2.1-2.7 V I'm using HAL library.我正在使用 HAL 库。

Program stops responding after FLASH->CR |= FLASH_CR_STRT; FLASH->CR |= FLASH_CR_STRT后程序停止响应 line inside HAL_FLASHEx_Erase() -> FLASH_Erase_Sector() function. HAL_FLASHEx_Erase() -> FLASH_Erase_Sector() 函数内的行。

I'm pretty sure it's my fault but I can't find out what is wrong.我很确定这是我的错,但我无法找出问题所在。

HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.Sector = FLASH_SECTOR_1;
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_2;
EraseInitStruct.NbSectors = 1;
uint32_t SectorError = 0;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) {     
    HAL_FLASH_Lock();
    return;
}

uint16_t data = 300;
//----------------------------write data
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, start_address, data) != HAL_OK) {
    HAL_FLASH_Lock();
    return;
}
HAL_FLASH_Lock();

Did I choosed wrong voltage range or number of sectors?我是否选择了错误的电压范围或扇区数?

Thanks for your answers.感谢您的回答。

If your program is bigger than 16k, then you've just managed to erase a part of it from flash.如果您的程序大于 16k,那么您就已经成功地从闪存中擦除了它的一部分。 You should pick a sector from the end of the flash (but then the erase times will be longer), or rearrange the sections a bit in your linker configuration.您应该从闪存的末尾选择一个扇区(但擦除时间会更长),或者在链接器配置中稍微重新排列这些部分。

I found the solution.我找到了解决方案。 I used HAL_FLASH_Lock() function instead of HAL_FLASHEx_Erase() function and it works fine.我使用 HAL_FLASH_Lock() 函数而不是 HAL_FLASHEx_Erase() 函数,它工作正常。 I also changed SECTOR because I was accidently erasing my program.我还更改了 SECTOR,因为我不小心删除了我的程序。

unit32_t address = 0x0800C000;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

FLASH_Erase_Sector(FLASH_SECTOR_3, VOLTAGE_RANGE_3);

//----------------------------write data  
uint8_t data = 'A';
if (HAL_FLASH_Program(TYPEPROGRAM_BYTE, address, data) != HAL_OK) {
    HAL_FLASH_Lock();
    return;
}
HAL_FLASH_Lock();

Thanks for your help.谢谢你的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM