[英]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_data
的section
,我們可以在程序代碼中解決該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.