2

尝试管理 STM32F4 微控制器中的内部闪存时,我走到了死胡同。有很多示例,但大多数都使用 SPL API 或低级寄存器操作。我正在使用 HAL 库。而且我找不到只擦除一页的功能(在stm32f4xx_hal_flash.c和中stm32f4xx_hal_flash_ex.c)。建议的功能,例如HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)不允许您仅擦除一页(2048 kByte)但仅擦除整个扇区(或扇区)。当我尝试使用类似的东西时:

void Internal_Flash_Erase(unsigned int pageAddress) {
while (FLASH->SR & FLASH_SR_BSY);
if (FLASH->SR & FLASH_SR_EOP) {
    FLASH->SR = FLASH_SR_EOP;
}

FLASH->CR |= FLASH_CR_PER;
FLASH->AR = pageAddress;
FLASH->CR |= FLASH_CR_STRT;
while (!(FLASH->SR & FLASH_SR_EOP));
FLASH->SR = FLASH_SR_EOP;
FLASH->CR &= ~FLASH_CR_PER;

}

发生编译器错误,因为FLASH->ARHAL 中没有(地址寄存器)。我发现阅读了RM0090 参考手册,现在我需要使用FLASH->CRAR 并设置位FLASH_CR_SNB [3:6]来选择扇区号。

现在我不知道如何只擦除一页。int8_t STORAGE_Write_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) 有必要在内部闪存中为该功能创建一个大容量存储设备: usbd_storage_if.c将 USB 堆栈调用转换为内部闪存。

4

3 回答 3

3

你不能。您可以擦除的最小部分是一个扇区。

我引用参考手册:

3.6.3 擦除

Flash 存储器擦除操作可以在扇区级别或整个 Flash> 存储器上执行(Mass Erase)。批量擦除不影响 OTP 扇区或配置扇区。

这就是扇区大小不同的原因。考虑到何时可能需要擦除闪存数据,布局软件以巧妙地使用扇区非常重要。

您可能需要在 RAM 中缓冲整个扇区,以便以类似文件系统的粒度实现闪存写入。

于 2017-03-15T10:01:02.393 回答
2

通常:拷贝一个表中的flash扇区,修改表中的页,擦除扇区,拷贝表到flash扇区

于 2017-03-15T10:36:20.047 回答
2

显然我发现了我的错误。我找到的示例适用于 STM32F103xx。而 STM32F103xx 闪存实际上被分为页面(1 或 2 KB)。可以擦除等于擦除“页”的“扇区”。但是 STM32F4xx 的情况有所不同,其中闪存被划分为扇区。

于 2017-03-15T11:04:28.673 回答