【问题标题】:How can I erase an internal flash Page (not sector!) in my STM32F405RG while using HAL?如何在使用 HAL 时擦除 STM32F405RG 中的内部闪存页面(不是扇区!)?
【发布时间】:2017-08-05 23:40:15
【问题描述】:

我在尝试管理 STM32F4 微控制器中的内部闪存时走到了死胡同。有很多示例,但大多数都使用 SPL API 或低级寄存器操作。我正在使用 HAL 库。而且我找不到只擦除一页的功能(在stm32f4xx_hal_flash.cstm32f4xx_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;

}

发生编译器错误,因为 HAL 中没有 FLASH->AR(地址寄存器)。 我发现阅读了RM0090 Reference manual,现在我需要使用FLASH->CR 而不是AR,并设置位FLASH_CR_SNB [3:6] 来选择扇区号。

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

【问题讨论】:

  • 闪存的最小可擦除大小是一个扇区......

标签: c gcc stm32 hal usb-mass-storage


【解决方案1】:

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

我引用参考手册:

3.6.3 擦除

闪存擦除操作可以在扇区级别或在 整个闪存> 内存(大容量擦除)。批量擦除不会影响 OTP 扇区 或配置部门。

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

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

【讨论】:

  • 感谢您的回答。但这对我来说很奇怪,因为我发现了一些使用页面擦除的例子。但是当你首先需要擦除整个扇区时,如何从 USB 主机将一些页面写入 FLASH。
  • 真正的问题是:您是从哪里发现这些页面存在的?什么是适合您的页面?
  • 例如以下文档:STM32F4 闪存包含 512 页(每页 2 KB)。但它被 12 个扇区划分: '/* Flash 扇区的基地址 */ 0x08000000 Sector 0, 16 Kbytes 0x08004000 Sector 1, 16 Kbytes 0x08008000 Sector 2, 16 Kbytes 0x0800C000 of Sector 3, 16 Kbytes 0x08000000 Sector 4, 0x08020000扇区5,128 KBYTES 0x08040000扇区6,128 KBYTES 0x08060000扇区7,128 KBYTES 0x08080000扇区8,128 KBYTES 0x080A0000扇区9,128 KBYTES 0x080C0000扇区10,128 KBYTES 0x080E0000扇区11,128 KBYTES' SPAN>
  • @VshivtsevDaniil 那来源是什么?不是RM0090。如果您查看 RM0090,您会发现没有提到 flash 中的页面,因为这不是一个存在或重要的概念。您只能擦除整个扇区。
  • @unwind 这是来自PM0075 Programming manual 的屏幕截图。我弄错了……
【解决方案2】:

通常: 复制表中的闪存扇区,修改表中的页面,擦除扇区,将表复制到闪存扇区

【讨论】:

  • 这张表是不是在内存中?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-02-12
    • 2022-01-03
    • 2021-07-06
    • 2014-09-17
    • 2018-11-03
    • 2021-09-10
    • 2015-01-29
    • 2018-01-16
    • 2021-07-21
    相关资源
    最近更新 更多