web-dev-qa-db-ja.com

ユーザーデータ用のフラッシュのメモリの割り当て(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]の値を確認すると、0x42...が表示されます。

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

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

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

しかし、私は同じ結果を得る。

12
HammerFet

さて、私は STフォーラムclive1のおかげで答えを見つけました。この例は、STM32F405xGで機能します。

まず、リンカスクリプトファイル(.ldファイル)のメモリレイアウトを変更する必要があります

既存のFLASHを変更し、DATAの新しい行を追加します。ここでは、section 11のすべてを割り当てました。

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

ソースウェアWebサイトでリンカーファイルを編集するためのマニュアル

同じファイルに、以下を追加する必要があります。

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

これにより、.user_dataと呼ばれるsectionが作成されます。これは、プログラムコードで対処できます。

最後に、.cファイルに次を追加します。

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

これは、userConfig変数を.user_dataセクションに格納することを指定し、constuserConfigのアドレスが静的に保たれるようにします。

これで、実行時にフラッシュのこの領域に書き込むために、stm32f4stdlibまたは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();
20
HammerFet