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]
しかし、私は同じ結果を得る。
さて、私は 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
セクションに格納することを指定し、const
はuserConfig
のアドレスが静的に保たれるようにします。
これで、実行時にフラッシュのこの領域に書き込むために、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();