1. FlexNVMとFlashXに関する基本的な質問と回答をいくつか紹介します。
1.1 FlexNVMとは何ですか?
FlexNVMは、データフラッシュとして、エミュレートされたEEPROMの不揮発性ストレージとして、または両方のオプションの組み合わせとして使用できるフラッシュメモリの追加の個別のブロックです。このドキュメントでは、最初のオプションであるFlexNVMが単にデータフラッシュとして機能することに焦点を当てます。
FlexNVMは、部品番号の専用箇所に「X」を含むMCU部品に含まれています。例えば:
MK64FX512VMD12 には、1 ブロック (512 KB) のプログラムフラッシュと 1 ブロック (128 KB) の FlexNVM が含まれています。
MK64FN1M0VMD12 には、2 ブロック (各 512 KB) のプログラムフラッシュのみが含まれています。
FlexNVMとフラッシュブロックの詳細については、MCUリファレンスマニュアルを参照してください。たとえば、「フラッシュメモリサイズ」の章です。
1.2 FlashXとは何ですか?
MQX FlashXドライバは、内部フラッシュへの書き込みと内部フラッシュからの読み出し機能を提供します。残念ながら、FlexNVM メモリはデフォルト ステートでは部分的にしかサポートされておらず、一部の BSP ではエミュレートされた EEPROM の設定と機能が実装されています (flexnvm サンプル コード)。詳細については、c:\Freescale\Freescale_MQX_4_2\doc\mqx フォルダの MQX_IO_User_Guide.pdf を確認してください。
1.3 FlexNVMを搭載したマイコンを搭載した自分のボードで、FlexNVMのないマイコン用BSPを使用できますか?
お勧めしません。ただし、この BSP を独自のボード BSP のベースとして使用することができます。MQX_BSP_Cloning_Wizard_Getting_Started.pdfご確認ください。ドキュメントをC:\Freescale\Freescale_MQX_4_2\docフォルダにMQX_BSP_Porting_Guide.pdfおよびMQX_BSP_Porting_Example_User_Guide.pdfします。
1.4 KSDKプロジェクトでFlashXを使用できますか?
残念ながら、FlashXドライバはKSDKに実装されていませんでした。KSDKには、C90TFS/FTFxフラッシュファミリ用の独自の標準ソフトウェアドライバ(SSD)が含まれていますが、これはFlashXドライバの場合のような高レベルの抽象化レイヤーがない低レベルのドライバです。
2. FlexNVMをサポートするためのMQX FlashXドライバーのアップデート手順。
2.1これらのファイルをバックアップしてください: user_config.h、
2.2 user_config.h で FlashX を有効にする定義によるファイル:
#define BSPCFG_ENABLE_FLASHX 1
2.3
2.3.1 MCUリファレンスマニュアルを確認し、必要に応じてBSP_INTERNAL_FLASH_BASE、BSP_INTERNAL_FLASH_SIZE、BSP_INTERNAL_FLASH_SECTOR_SIZEを更新してください。通常、FlexNVMのないBSPが自身のBSPのベースとして使用された場合は、BSP_INTERNAL_FLASH_SIZEを減らす必要があります。
2.3.2メモリマップでFlexNVMを定義する新しいマクロを追加します。例えば:
#define BSP_INTERNAL_FLEXNVM_BASE 0x10000000
#define BSP_FLEXNVM_SECTOR_SIZE 0x400
#define BSP_INTERNAL_FLEXNVM_SIZE 0x00008000
2.4 BSPフォルダの init_flashx.c を更新します。
2.4.1 FlexNVMファイルブロックを_bsp_flashx_file_blocks[]テーブルに追加します。例えば:
データフラッシュファイルブロック
{ "dflash", BSP_INTERNAL_FLEXNVM_BASE, (uint32_t) (BSP_INTERNAL_FLEXNVM_BASE+ BSP_INTERNAL_FLEXNVM_SIZE - 1) },
パラメータは{ファイルブロック名、開始アドレス、終了アドレス}です。
注:これは純粋なソフトウェアインターフェースです。アドレスの範囲は、物理フラッシュ ブロック パラメーターに合わせる必要はありません。必要に応じてファイルブロックを整理できます。
2.4.2FlexNVM BSP をベースとして非 FlexNVM BSP を使用していた場合は、KinetisX デバイスの HW ブロック マップを変更する必要があります。_bsp_flashx_init構造で_flashx_kinetisN_block_mapを_flashx_kinetisX_block_mapに変更してください。
2.5 flash_ftfl.c または flash_ftfe.c を更新するファイル:
2.5.1 お使いのMCUにFTFLまたはFTFEフラッシュメモリモジュールがあるかどうかをMCUリファレンスマニュアルを参照し、編集する適切なファイルを選択してください。
2.5.2FlexNVMメモリブロックを_flashx_kinetisX_block_map[]テーブルに追加します。例えば:
{ BSP_INTERNAL_FLEXNVM_SIZE / BSP_FLEXNVM_SECTOR_SIZE, (_mem_size) BSP_INTERNAL_FLEXNVM_BASE, BSP_FLEXNVM_SECTOR_SIZE }, // FlexNVMブロック
パラメータは{number of sectors, start address, sector size}です。
注:これは、物理ハードウェアメモリブロックの説明です。アドレスの範囲は、物理フラッシュ ブロック パラメーターに適合する必要があります。
2.5.3次に、FlexNVMアドレスの問題を修正する必要があります。プログラムフラッシュとFlexNVMフラッシュはFTFE_FCCOBn FTFL_FCCOBnどちらも、FCCOB1..FCCOB3には、24ビット形式のアドレスが含まれています。したがって、FlexNVMアドレスを直接操作することはできません - FlexNVMベース0x10000000のため、24ビットに収まりません。
FTFL/FTFE モジュールでは、24 ビット アドレスの最上位ビット (ビット 23) がプログラム フラッシュと FlexNVM フラッシュの区別に使用されるように指定されています。たとえば、次のようなコードを使用できます。
FlexNVMフラッシュアドレスのときに23ビットを設定
IF(write_addr & BSP_INTERNAL_FLEXNVM_BASE)
{
write_addr = write_addr |(1<<23);
}
そして、このコードを必要な関数に追加してから、command_array[]に書き込みます( command_array[] の内容はFTFL_FCCOBn/FTFE_FCCOBnレジスタの埋めに使用されます)。
FlashXサンプルコードの基本的な作業には、少なくともftfl_flash_erase_sector()/ftfe_flash_erase_sector()およびftfl_flash_write_sector()/ftfe_flash_write_sector()関数を更新する必要があります。
2.6.これらの変更後、flash_demo.c で FlashX のサンプルコードを使用してみてくださいデフォルトのプログラムフラッシュファイルブロックの代わりにFlexNVMファイルブロックを開くだけです。例えば:
#define FLASH_NAME 「flashx:bank0」
#define FLASH_NAME「flashx:dflash」
添付ファイルには、MQX4.2.0およびMK20DX72 MCUの変更例があります。
3.フラッシュの書き換え方法 - 一般的な注意事項:
フラッシュ・データは、プログラミングされる前に消去済みの状態にある必要があります。 ビットの累積的なプログラミング(より多くのゼロの追加)は許可されません。
FTFLモジュールとFTFEモジュールの両方の場合、整列されたフレーズ(通常は64ビット)でフラッシュをプログラムします。より小さなチャンク(バイト単位など)でプログラムが必要な場合、FTFLモジュールでは、推奨されていなくてもこのフレーズに書き込むことができます。ただし、FTFEモジュールは、同じフレーズに2回目の書き込みを行うとバス障害を引き起こします。したがって、すでに書き込まれたFTFEフレーズのデータを変更する方法を保存する方法は、セクター全体を消去してデータを書き換え直すだけです。そのため、FTFEモジュールにはioctlコマンドFLASH_IOCTL_ENABLE_SECTOR_CACHEを使用してください。セクタ キャッシュの割り当ては、フル セクタ書き込みと、デスティネーション領域 (フレーズに揃えられた) が空白の部分的なセクタ上書きの場合には必要ありません。
こんにちはシュリダール、
FlexNVM の場合:
flash_ftfl.cの_flashx_kinetisX_block_map[]テーブルも編集する必要がありますファイルを作成し、FlexNVMブロックの説明を追加します。
FlexRAM の場合:
電源を切る前にフラッシュ/クローズ機能を使用しましたか?
FlexRAMの使用例については、c:\Freescale\Freescale_MQX_4_2\mqx\examples\flexnvmを参照してください。
EEPROM エミュレーションを有効にするまで、ターゲットの FlexRAM メモリ範囲は「標準」RAM のように機能します。
もちろん、FlexNVMメモリをデータフラッシュとして使用するか、エミュレートされたEEPROMとして使用するか、FlexNVMメモリを2つのセクションに分割して両方のオプションを使用するかを選択する必要があります(その場合、メモリ範囲はそれに応じて更新する必要があります)。
いずれにせよ、空のMCUをデフォルト設定のFlexNVMメモリはデータフラッシュとして、FlexRAMは「標準」RAMとして使用できます。エミュレートされたEEPROM(FlexRAM)を使用する場合は、FlexNVMメモリを設定する必要があります(Program PartitionコマンドおよびSet FlexRAM Functionコマンド)。flexnvm サンプルコードを参照してください...