簡體   English   中英

STM32F411VET6將數據存儲在R / W閃存中

[英]STM32F411VET6 storing data in R/W flash memory

我正在嘗試將數據存儲在STM32F411VET6的閃存中。 我希望即使重新啟動MC后也可以存儲並保留內存。 我已經看過這個這個這個這個例子,但是我仍然不確定我是否正確地做到了。 我可以在內存中創建一個位置(我在地圖文件中簽入),並以此作為分散文件:

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00060000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  USER_CONFIG 0x08060000 0x0001FFFF  {
   userConfig.o (+RW)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

這對於我的代碼(改編自這個例子):

__attribute__((__section__("USER_CONFIG"))) const char userValues[64];

void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
  uint8_t addressGap;
  HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR);
  FLASH_Erase_Sector(FLASH_SECTOR_7, VOLTAGE_RANGE_3);
  int ii = 0;
  for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
  {
    addressGap = pow(2, flashTypeProgram) * ii;
    HAL_FLASH_Program(flashTypeProgram, userValues[0] + addressGap, data[ii]);
  }
  HAL_FLASH_Lock();
}

但是,每當我構建代碼時,都會出現錯誤:“沒有任何部分與模式userConfig.o相匹配”。

我有什么設置不正確的原因嗎?或者為什么我在某個地方錯過了通話?

Kamil Cuk的幫助下,我得以獲得解決方案,幫助我解決了一些問題。 我在分散文件中遇到的問題之一是我的加載和執行地址不相同,導致鏈接器無法按預期工作(在此鏈接中有很好的解釋)。 我將.sct文件修改為以下內容:

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

LR_IROM2 0x08060000 0x00020000 {  ; load region size_region
  USER_CONFIG 0x08060000 0x00020000  {
   *(.user_data)
  }
}

在創建了其他加載區域的情況下,該實現將導致我的加載地址和異常地址相同。

然后,如果有人也來這里尋求幫助,這是我閃爍的代碼:

__attribute__((section(".user_data"))) const char userConfig[64];

[...]

void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
  uint8_t addressGap;
  HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR);
  FLASH_Erase_Sector(FLASH_SECTOR_7, VOLTAGE_RANGE_3);
  int ii = 0;
  for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
  {
    addressGap = pow(2, flashTypeProgram) * ii;
    HAL_FLASH_Program(flashTypeProgram, (uint32_t) &userConfig[0] + addressGap, data[ii]);
  }
  HAL_FLASH_Lock();
}

該程序使我可以將數據存儲在內部閃存中,即使在硬重啟后(斷開所有電源,然后重新連接至電路板),該數據也仍會保留。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM