【问题标题】:How to write to STM32 Flash如何写入STM32 Flash
【发布时间】:2019-06-07 03:49:58
【问题描述】:

我想从我的用户代码写入 STM32F407VGT 的闪存扇区 11 以存储一些数据。我使用了stm32f4xx_hal_flash.c 库。我首先使用此代码擦除扇区:

void Flash_Init(void)
{        
    FLASH_EraseInitTypeDef pEraseInit;

    pEraseInit.Banks = FLASH_BANK_1;
    pEraseInit.NbSectors = 1;
    pEraseInit.Sector = FLASH_SECTOR_10;
    pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;

    if(HAL_FLASH_Unlock() == HAL_OK)
    {
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
        HAL_FLASHEx_Erase(&pEraseInit,0);
        HAL_FLASH_Lock();
    }
}

程序在到达HAL_FLASHEx_Erase(&pEraseInit,0); 函数时挂起。我的分散文件如下所示:

LR_IROM1 0x08000000 0x01000000  {    ; load region size_region
  ER_IROM1 0x08000000 0x01000000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {
   .ANY (+RW +ZI)
  }
}

我必须先做些什么才能让这个功能起作用吗?

【问题讨论】:

  • 定义挂起。您的代码从哪里执行(您是否正在擦除存储当前代码的闪存)?
  • 您好,感谢您的回复。当你问它从哪里执行时,我不确定你的意思。该函数是从 main 调用的。在这个例子中,我试图擦除闪存扇区 10(0x080C0000 到 0x080DFFFF),这是主闪存中的一个 12kbyte 块。根据构建输出的程序大小是“程序大小:代码=21432 RO-data=11152 RW-data=152 ZI-data=2152”所以我很难相信我的扇区擦除功能正在覆盖程序的一部分。扇区 0 到 3 每个为 16 kbyte,扇区 4 为 64 kbyte,扇区 5 到 11 为 128 kbyte。
  • 啊,是的,这加起来了。那时可能不会删除您的代码。不过,hangs 是什么意思?数据表中是否提到了擦除闪存时的注意事项?
  • 挂起是指函数HAL_FLASH_Lock(); 永远不会执行。从调试器中我可以看到,当调用它但未调用下一个函数时,该内存区域正在被擦除(所有 F)。我在数据表或 .c 文件中看不到任何会阻止此功能执行的内容。闪存控制寄存器访问必须在任何操作之前解锁,但程序可以成功地进行管理。我在想我的分散文件配置不正确,但除此之外我不确定?
  • 您可以使用以下答案来解决您的问题。 stackoverflow.com/questions/44443619/…

标签: stm32 stm32f4discovery flash-memory stm32f4 stm32-hal


【解决方案1】:

您想写入扇区 11,但您的 pEraseInit.Sector 变量在您的 init 函数中是 FLASH_SECTOR_10。所以你应该把 FLASH_SECTOR_10 改为 FLASH_SECTOR_11。 此外,如果您使用 CubeMX,您可以尝试在没有 init 函数的情况下执行写入和读取函数。

uint32_t flash_read(uint32_t address){
    return *(uint32_t*)address;
}

void flash_write(uint32_t address, uint32_t data){
    HAL_FLASH_Unlock();
    FLASH_Erase_Sector(FLASH_SECTOR_11,VOLTAGE_RANGE_1);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,address,data);
    HAL_FLASH_Lock();
}

You can see flash memoty map from here

【讨论】:

  • 谢谢,在查看您的代码后发现HAL_FLASHEx_Erase(); 函数不起作用,但FLASH_Erase_Sector(); 起作用。看了图书馆,我不知道为什么,但至少它解决了我的问题,谢谢。
猜你喜欢
  • 2016-07-11
  • 2012-02-16
  • 2021-07-29
  • 2021-07-20
  • 2019-11-25
  • 2018-08-26
  • 2017-06-13
  • 2021-07-04
  • 2019-07-02
相关资源
最近更新 更多