13

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]と、わかりました0x42... 素晴らしい!

しかし、リセットを押して場所をもう一度見ると、もうあり0x42ません...

どこが間違っているのか分かりますか?私も試しました:

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

しかし、私は同じ結果を得ます..

4

1 に答える 1

21

おかげで、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();
于 2015-02-13T17:27:58.017 に答える