web-dev-qa-db-ja.com

STM32F4、Cortex M4のFLASHへの書き込み/読み取り方法

例えば、FLASHに5という整数の変数を書き込み、電源が切れてデバイスの電源がオンになった後、再度読み取ります。

何かを書くためには、まずページを消去してから書く必要があることをすでに知っています。

マニュアルには次のように書かれています:

  1. フラッシュオプションキーレジスタ(FLASH_OPTKEYR)にOPTKEY1 = 0x0819 2A3Bを書き込む
  2. フラッシュオプションキーレジスタ(FLASH_OPTKEYR)にOPTKEY2 = 0x4C5D 6E7Fを書き込みます。

このタスクを実行するにはどうすればよいですか?

セクター0には、0x0800 0000から0x0800 3FFFまでのブロックアドレスがあります。これは、書き込み先です。

71ページのマニュアルへのリンク: STM32 Manual

8
Alex M.

HALライブラリを使用してフラッシュにデータを書き込むために、次のコードを使用できます。

void Write_Flash(uint8_t data)
{
     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_6, VOLTAGE_RANGE_3);
     HAL_FLASH_Program(TYPEPROGRAM_Word, FlashAddress, data);
     HAL_FLASH_Lock();
}

次のようにリンカースクリプトを更新する必要があります。 DATAMEMORYを追加し、SECTIONS.user_dataを追加します。

MEMORY
{
RAM (xrw)      : Origin = 0x20000000, LENGTH = 320K
CCMRAM (rw)      : Origin = 0x10000000, LENGTH = 64K
FLASH (rx)      : Origin = 0x8000000, LENGTH = 2048K
DATA (rwx)      : Origin = 0x08040000, LENGTH = 128k
}

/* Define output sections */
SECTIONS
{
 .user_data :
  {
    . = ALIGN(4);
     KEEP(*(.user_data))
    . = ALIGN(4);
  } > DATA

電源投入後にデータを読み取るために、メインコードに次の属性を追加する必要があります

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

これらすべての後、userConfig[0]を呼び出してフラッシュデータを読み取ることができます。

9
Gürtaç Kadem