FM0+/FM3/FM4 マイクロコントローラ ビットバンディングによるペリフェラル レジスタの各ビットへのアクセス - KBA220576 - Community Translated (JA)

Version 1

    Community Translated by  MoTa_728816          Version: **

     

    Translation - English: Bit-banding access to individual bits in peripheral registers for FM0+/FM3/FM4 microcontrollers – KBA220576

     

    質問:

    ペリフェラル レジスタへのアクセスにビットバンディング (Bit-banding) を使用した場合、どのアクセス サイズ (バイト、ハーフワード、ワード) が使用可能ですか?

     

    回答:

    ビットバンド エイリアス アドレスはワード単位でアラインされていて任意のサイズでのアクセスが可能です。しかし、目的とするレジスタがサポートしている最小単位でのアクセスが推奨されます。各ペリフェラル レジスタの対応可能なアクセスサイズについては FM0+、FM3、FM4 マイクロコントローラ テクニカル リファレンス マニュアル (TRM) の “Appendixes - Register Map” 節 をご参照ください。ビットバンド エイリアス アドレスに対して 読出し(read) あるいは 書込み(write) の命令が発行されると、(読出し 命令には) 読出し処理が、(書込み 命令には) リード モディファイ ライト (read-modify-write) 処理が暗黙的にその読出し/書込み命令で指定されたアクセス サイズで対象ペリフェラル レジスタに行われます。

    アクセス サイズはほとんどのペリフェラル レジスタでは問題になりません。しかし、考慮する必要がある場合もあります。

    対象レジスタのサイズと同じ32-bit ワード単位内に他のレジスタが含まれていないかをご確認ください。

    もし対象レジスタがバイトやハーフワードのレジスタで、同じワード内に他のレジスタが配置されていた場合、ビットバンドを対象レジスタのサイズよりも大きなサイズでアクセスしないでください。もし隣接するレジスタが FIFO やステータスレジスタのように、ハードウェアウェア コントロール ビットを含んでいた場合読出し/リード モディファイ ライト処理によって内容が失われてしまう可能性があります。

    (例) USB ホスト:ホスト エラー ステータス (HERR) レジスタとホスト割込み (HIRQ) レジスタ

     

    これはハードウェア コントロール ビットを含むレジスタへのビットアクセスでも発生します。

    代表的な例としては スキャン変換 FIFO データ (SCFD) レジスタが挙げられます。

    32-bit のレジスタの下位ハーフワードにはスキャン変換結果の有効性を表すステータスビット (INVL ビット) を含み、上位ハーフワードには FIFO がスキャン変換後のデータを保存しています。スキャン変換結果の有効性を確認するために、定期的にこの INVL ビットは評価される可能性があります。

    もしスキャン変換結果の有効性を確認するために INVL ビットを含むアドレスが 32-bit ワードサイズでアクセスされると、読出し処理はこのレジスタの全領域におよび FIFO の有効なスキャン変換データもシフトアウトされて失われてしまいます。

    この問題を回避するためには、このビットバンド エイリアス アドレスにはバイトかハーフワードのサイズでアクセスしなければなりません。

    (例) DMAC: 設定レジスタ A (DMACA) の PB ビットと EB, ST ビット

    MFS UART モード: マルチプロセッサ モードにおける RDR/TDR レジスタの D8 ビットと D[7:0] ビット

    ADC: スキャン変換 FIFO データレジスタ (SCFD) と プライオリティ変換 FIFO データ (PCFD) レジスタの下位と上位のハーフワード

     

    他の注意が必要なケースとしては書込み専用レジスタへのビット書込みがあります。

    ビットバンド エイリアスの書込みは対象レジスタにリード モディファイ ライト処理を行います。

    しかし、(書込み専用レジスタの)読出し値は未定義となっています。

    そのため、対象ビット以外のビットに未定義の値が書き込まれてしまう恐れがあります。これはペリフェラルの予期せぬ挙動につながる可能性があります。

    このようなレジスタにはビットバンド エイリアス アクセスは行わないでください。

    (例) BT: Software-based Simultaneous Startup (BTSSSR) レジスタ

     

    ペリフェラル ドライバ ライブラリ (PDL) をお使いの場合、使用するビットバンド エイリアス アドレスの定義を確認してください。

    PDL はペリフェラル レジスタのアクセスを容易にする ビットバンド エイリアス アドレスのマクロを提供しています。

    ビットバンド エイリアスのマクロはペリフェラル定義ヘッダファイル内で、“bFM_”というプリフィックス付きで定義されています。

    もしお使いのビットバンド エイリアスのマクロが前述の手法に従っていない場合には、それらはご使用にならないでください。

    (例) スキャン変換 FIFO データ (SCFD) レジスタの下位と上位のハーフワード

    PDL 2.1.0 での定義:#define bFM_ADC0_SCFD_INVL *((volatile uint8_t *)(0x424E01B0UL))

    → SCFD レジスタへのアクセスがバイトアクセスなので、これは問題ありません。

    PDL 2.1.0 での定義:#define bFM_ADC0_SCFD_INVL *((volatile unsigned int*)(0x424E01B0UL))

    → SCFD レジスタへのアクセスがワードアクセスなので、FIFO データが失われる危険性があります。このマクロ定義は使用しないでください。