2015-11-13 70 views
0

我试图将一些数据保存到我的STM32F407板上的闪存中。在我可以保存它们之前,我需要清除内存扇区。我选择了16千字节Sector1从地址0x08004000开始并选择电压范围2.1-2.7 V。我正在使用HAL库。不能擦除闪存中的数据(STM32)

程序停止响应后FLASH-> CR | = FLASH_CR_STRT;行内HAL_FLASHEx_Erase() - > FLASH_Erase_Sector()函数。

我很确定这是我的错,但我找不出什么是错的。

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(); 

我是否选择错误的电压范围或扇区数?

感谢您的回答。

+1

您可能对电气工程堆栈交换中的这个问题有更好的运气 - 请参阅他们的“[我可以问什么问题?](http://electronics.stackexchange.com/help/on-topic)”页面。 – tonysdg

回答

0

我找到了解决方案。我使用HAL_FLASH_Lock()函数而不是HAL_FLASHEx_Erase()函数,它工作正常。我也改变了扇区,因为我意外地擦除了我的程序。

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(); 

感谢您的帮助。

2

如果你的程序大于16k,那么你已经设法从闪存中删除它的一部分。您应该从闪存末端选择一个扇区(但擦除时间会更长),或者在链接器配置中重新排列这些部分。