7

所以我不能在擦除后直接写入内部闪存。如果在写操作之前没有擦除操作,那么我可以。关于为什么的任何想法?

编程函数返回“成功写入”值,但在查看内存时,没有写入数据。这是代码:

uint32_t pageAddress = 0x08008000;
uint16_t buffer = 0xAAAA;

HAL_FLASH_Unlock();
FLASH_PageErase(pageAddress);
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer);
HAL_FLASH_Lock();

我尝试在擦除和编程之间锁定内存,在这些操作之间造成延迟,但没有帮助。

4

2 回答 2

12

问题是在调用 FLASH_PageErase() 时设置的 FLASH->CR 寄存器中的 PER 位在其末尾没有被清除。在闪存仍处于解锁状态时清除该位允许在此之后运行闪存上的其他操作。

STM 文档对此无话可说。

于 2015-02-13T14:39:49.893 回答
0

你可以HAL_FLASHEx_Erase改用。

uint32_t pageAddress = 0x0801FC00;
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t page_err;

EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = pageAddress;
EraseInitStruct.NbPages = 1;

uint32_t buffer = 0xC0FFEE;
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase(&EraseInitStruct, &page_err);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, pageAddress, buffer);
HAL_FLASH_Lock();
于 2022-01-29T19:21:35.387 回答