おかげで、STフォーラムで答えが見つかりましたclive1
。この例は、STM32F405xG で機能します。
まず、リンカー スクリプト ファイル (.ld ファイル) のメモリ レイアウトを変更する必要があります。
既存の FLASH を変更し、DATA の新しい行を追加します。ここでは のすべてを割り当てました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
これにより、プログラム コードでアドレス指定できるsection
呼び出しが作成されます。.user_data
最後に、.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();