簡體   English   中英

在Flash中為用戶數據分配內存(STM32F4 HAL)

[英]Allocating memory in Flash for user data (STM32F4 HAL)

我正在嘗試使用STM32F405的內部閃存來存儲一堆用戶可設置的字節,這些字節在重新啟動后仍然存在。

我正在使用:

uint8_t userConfig[64] __attribute__((at(0x0800C000)));

為我想要存儲的數據分配內存。

當程序啟動時,我檢查第一個字節是否設置為0x42 ,如果沒有,我用它設置:

HAL_FLASH_Unlock();
HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[0], 0x42);
HAL_FLASH_Lock();

之后我檢查userConfig[0]的值, userConfig[0]看到0x42 ......太棒了!

然而,當我點擊重置時,再次查看該位置,它不再是0x42 ......

知道我哪里錯了嗎? 我也嘗試過:

#pragma location = 0x0800C00
volatile const uint8_t userConfig[64]

但我得到了相同的結果..

好吧,由於clive1在ST論壇上找到了答案。 此示例適用於STM32F405xG。

首先,我們需要修改鏈接描述文件(.ld文件)中的內存布局

修改現有FLASH並為DATA添加新行。 在這里,我已經分配了section 11全部section 11

MEMORY
{
  FLASH (RX)        : ORIGIN = 0x08000000, LENGTH = 1M-128K
  DATA (RWX)        : ORIGIN = 0x080E0000, LENGTH = 128k
  ...
  ...
}

用於編輯源軟件網站上的鏈接器文件的手冊

在同一個文件中,我們需要添加:

.user_data :
{
  . = ALIGN(4);
     *(.user_data)
  . = ALIGN(4);
} > DATA

這將創建一個名為.user_datasection ,我們可以在程序代碼中解決該section

最后,在.c文件中添加:

__attribute__((__section__(".user_data"))) const uint8_t userConfig[64]

這指定我們希望將userConfig變量存儲在.user_data部分中,並且const確保userConfig的地址保持靜態。

現在,要在運行時寫入閃存的這個區域,可以使用stm32f4 stdlib或HAL閃存驅動程序。

在你可以寫入閃存之前,它必須被擦除(所有字節都設置為0xFF)HAL庫的指令由於某種原因而沒有說明這樣做...

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_11, VOLTAGE_RANGE_3);

HAL_FLASH_Program(TYPEPROGRAM_WORD, &userConfig[index], someData);

HAL_FLASH_Lock();

暫無
暫無

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

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