0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[メモ] STM32L15x 系のInternal FLASHの書き込み・消去

Last updated at Posted at 2017-08-02

概要

  • STM32L152xCでの、Internal Flashの書き込み・消去のメモ

  • 参考:

    • RM0038 リファレンスマニュアル / Reference manual
      STM32L100xx, STM32L151xx, STM32L152xx and STM32L162xx
      advanced ARM®-based 32-bit MCUs の
       Section 3: Flash program memory and data EEPROM / セクション 3 :フラッシュプログラムメモリとデータ EEPROM
    • STM32Cube_FW_L1 のサンプルコード
    • (リンク先が変わったりするので、STのページから検索するのがいいと思う)

メモ

STM32L1: Flashメモリの構成

  • 4KB / Sector
  • 256 Bytes / Page (=> 16 Pages / Sector)
  • Page毎にErase
  • Sector毎にWrite Protection
  • チップごとの詳細は、RM0038リファレンスマニュアルを参照

アンロックとロック

  • 書き込み・消去前に HAL_FLASH_Unlock()、 後に、HAL_FLASH_Lock()する
    • HAL_StatusTypeDef HAL_FLASH_Unlock(void)
    • HAL_StatusTypeDef HAL_FLASH_Lock(void)

消去

HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)

  • コード

    FLASH_EraseInitTypeDef EraseInitStruct;
    uint32_t PAGEError;
    
    ...
    
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = 消去するページの先頭アドレス ;
    EraseInitStruct.NbPages     = 消去するページ数 ;
    
    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
    {
        // (PAGEError != 0xFFFFFFFFU) なら、PAGEError に消去でエラーの発生したアドレスが入っている
    }
    

書き込み

  • ワード(4bytes)書き込み
    HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
  • ハーフページ書き込み
    HAL_StatusTypeDef HAL_FLASHEx_HalfPageProgram(uint32_t Address, uint32_t* pBuffer)

  • コード

    uint32_t Address, Data;
    
    Address = 書き込みアドレス (Address%4 == 0 じゃないとだめだと思う)
    Data = 書き込むデータ
    
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, data) == HAL_OK)
    {
        // エラー
    }
    

エラーの詳細を得る

uint32_t HAL_FLASH_GetError(void);

#define HAL_FLASH_ERROR_NONE      0x00U  /*!< No error */
#define HAL_FLASH_ERROR_PGA       0x01U  /*!< Programming alignment error */
#define HAL_FLASH_ERROR_WRP       0x02U  /*!< Write protection error */
#define HAL_FLASH_ERROR_OPTV      0x04U  /*!< Option validity error */
#define HAL_FLASH_ERROR_SIZE      0x08U  /*!<  */
#define HAL_FLASH_ERROR_RD        0x10U  /*!< Read protected error */
#define HAL_FLASH_ERROR_OPTVUSR   0x20U  /*!< Option UserValidity Error. */
#define HAL_FLASH_ERROR_OPERATION 0x40U  /*!< Not used */

その他

  • (TODO) 消去・書き込み速度などを測定する
  • ハーフページ書き込みは、未テスト. 確認後更新する(予定)
  • 外付け SPI-Flashの代わりに使えるかな??
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?