私はTRGMUXメソッドを使用して、コンパレータLPCMP0の出力をeMIOS0_CH7(入力キャプチャとして構成されている)の入力にルーティングしようとしています。私はMCXE316というデバイスを使用しています。私の問題点の一つは、入出力の理解と用語の把握であり、もう一つはPERI_TRGMUX.hのバグだと考えています。ファイル。
eMIOS0のチャネル7をシンプルな入力キャプチャとして設定していますが、これは物理ピンに割り当てると正しく動作します。しかし、入力キャプチャはLPCMP0コンパレータの出力によってトリガーされるようにしたいのです。したがって、TRGMUXを使用してコンパレータの出力をeMIOS0_7の入力キャプチャの入力にルーティングできるはずです。
リファレンスマニュアルに添付されているMCXE31_TRGMUX_connectivity.xlsxファイルを見ると、左側に「入力番号」とありますが、これはTRGMUXへの入力だと推測されます。そこにLPCMP_0_COUTという項目があり、入力番号は5となっています。これが私が探しているものだと思います。上部には「EMIOS_0_ipp_ind_emios_ch[7]」が表示され、その上に出力レジスタ番号9が表示されています。チャネル5、6、9も同じ番号になっていることが分かりました。
そこで最初の質問ですが、LPCMP0トリガー出力がチャネル5、6、9ではなくチャネル7に接続されるようにTRGMUXに指示するにはどうすればよいでしょうか?TRGMUXレジスタの内部にはSEL0、SEL1、SEL2、SEL3があることは知っていますが、これらのいずれかを使用してチャネルを選択すればよいのでしょうか?そうであれば、これはどのようにマッピングされているのでしょうか(SEL0はチャネル5など)、それとも別のマッピングがあるのでしょうか、あるいはマッピングは存在しないのでしょうか?マニュアルを確認しましたが、これについては触れられていませんでした。
SEL3がチャネル7用であるという私の推測(あくまでテストのため)に基づいて、SDKのTRGMUX方法を使用してみました。以下が私の呼び出しシーケンスです。
TRGMUX_SetTriggerSource(TRGMUX, kTRGMUX_Emios0_1, kTRGMUX_TriggerInput2, kTRGMUX_SourceLpcmp0 );
TRGMUXをレジスタベースとすると、kTRGMUX_Emios0_1はeMIOS0用のTRGMUXレジスタ(定義値は9)、kTRGMUX_TriggerInput2はレジスタのSEL2入力、kTRGMUX_SourceLpcmp0はトリガーのソース(定義値は5)です。
問題は、このルーチン自体がこの方法内でハードフォルトを発生させることです。このメソッドの実際のSDKコードは以下のとおりです。
status_t TRGMUX_SetTriggerSource(TRGMUX_Type *base, uint32_t index, trgmux_trigger_input_t input, uint32_t trigger_src)
ヤージュ
uint32_t 型の値;
status_t ステータス;
value = base->TRGCFG[index];
if (0U != (value & TRGMUX_TRGCFG_LK_MASK))
ヤージュ
ステータス = kStatus_TRGMUX_Locked;
}
それ以外
ヤージュ
/* TRGCFGレジスタ内のすべてのSELビットフィールドは同じ長さであるため、SEL0のマスクを使用して他のSELにアクセスします。
* ビットファイル。*/
value = (value & ~((uint32_t)TRGMUX_TRGCFG_SEL0_MASK << (uint32_t)input)) |
((trigger_src & (uint32_t)TRGMUX_TRGCFG_SEL0_MASK) << (uint32_t)input);
base->TRGCFG[index] = value;
ステータス = kStatus_Success;
}
ステータスを返します。
}
ルーチンは最初の行でクラッシュします
value = base->TRGCFG[index];
デバッグ出力を見ると、TRGCFG配列が一度も初期化されていないようです。この変数はPERI_TRGMUX.hで定義されています。そしてその構造は次のとおりです。
/** TRGMUX - レジスタ配列のサイズ */
#define TRGMUX_TRGCFG_COUNT 40u
/** TRGMUX - レジスタレイアウト型定義 */
typedef struct {
__IO uint32_t TRGCFG[TRGMUX_TRGCFG_COUNT]; /**< TRGMUX ADC12_0 レジスタ..TRGMUX CM7_RXEV レジスタ、配列オフセット: 0x0、配列ステップ: 0x4、有効なインデックス: [0-1、3、6-18、21-39] */
} TRGMUX_Type;
TRGCFGが実際にどこで定義されているのか、どうしても見つけることができません。デバッガーでは、配列全体(40個の要素すべて)が199661に設定されていますが、これはゴミデータに違いありません。私は要素9(インデックスは9)にアクセスしています。
そこで2つ目の質問ですが、私はこの方法を正しく使っているのでしょうか?私の想定は正しいのでしょうか?それともSDKのルーチンに問題があるのでしょうか?
こんにちは、 @brucebowling さん
投稿ありがとうございます!
TRGMUX SELx の動作に関するあなたの理解は正しいです。EMIOS0_0 はチャネル 1 ~ 4 用、EMIOS0_1 はチャネル 5 ~ 7 および 9 用です。TRGMUX_connectivity.xlsx に示されているように、チャネル 0 および 8 は使用できません。
また、
私の環境でも同様の現象を再現できました。社内で検討し、解決に役立つ可能性のある関連情報があれば共有します。
SDKやTRGMUXの機能に関して新しいフィードバックがないか確認したいのですが。
TRGMUXはペリフェラルごとにレジスタが1つだけなので、次の1行で直接書き込もうとしました:
*(volatile uint32_t *)0x40080024UL = 0x00050000UL;
TRGMUXのベースアドレス(RMによると)は0x4008_000で、TRGMUX_eMIOS0_1レジスタのオフセットは0x24なので、絶対アドレスは0x40080024になります。LPCMP0_COUT の SELx フィールドは 0x05 です。これを SEL2 ビット位置 (ビット 16:23) にシフトします。ロックビットはリセット時(ロック解除時)は0であるべきで、私はそれをロック解除したままにしておきます。
この1本の線が、毎回深刻な障害によるクラッシュと焼損を引き起こします(不正確な障害)。他のSELxの場所を変更してみましたが、それでもクラッシュします。eMIOSやLPCMPの設定前にこの設定を試しましたし、ペリフェラルを完全にセットアップした後も試しましたが、毎回クラッシュしました。
ここで、マニュアルには見つからない疑問がいくつかあります:
1) TRGMUXリンクは**ペリフェラル**が初期化・有効化される前に設定しますか、それとも後ですか?
2) TRGMUX用のモジュールクロックやそれに類するものはありますか?クロックを有効にする前にモジュールにアクセスすると、私が経験しているようなハードフォルトが発生することは知っています。特に何かは見当たりませんし、TRGMUXレジスタは各ペリフェラルの一部だと思います。つまり、ペリフェラルのクロックを有効にすると必要なTRGMUXのクロックも有効になるはずですよね?
ご協力ありがとうございました。
こんにちは、 @brucebowling さん
返信が遅くなり申し訳ありません。
TRGMUXクロックはデフォルトでは有効になっていないことに気づきました。クロックが無効化された状態でTRGMUXレジスタにアクセスしようとするとハードフォールトが発生します。時計が一つなくなっていたというあなたの推測は正しかったです。
電話する前に次の一文を追加してもらえますかTRGMUX_SetTriggerSource?
CLOCK_EnableClock(kCLOCK_Trgmux);
この変更で私の側の問題は解決しました。
参考までに、TRGMUXの使用例はSDKのこちらにあります:
ボード/FRDMMCXE31b/demo_apps/mc_pmsm/pmsm_enc
これで問題が解決したかどうか、またはTRGMUXに関して他に質問があればお知らせください。
OK、クラッシュの問題はまだ解決していませんが、さらに調査したところ、TRGMUXを設定する前にSIUL2 IMCRレジスタを設定する必要があるようです。参考マニュアルに添付されたIOMUX xlsファイルを見ると、eMIOS0_CH[7]でSSSビットを4に設定してTRGMUX_INT_OUT38を選択する必要があり、これはSIUL_IMCR567で行うと書かれています(512の命名オフセットのために512を567から差し引く必要があります)。以下に、この処理に使用したコードと、TRGMUXを設定するコードを示します。
SIUL2->IMCR[55] = SIUL2_IMCR_SSS(4);
*(volatile uint32_t *)0x40080024UL = TRGMUX_TRGCFG_SEL3(kTRGMUX_SourceLpcmp0);
TRGMUXのハードフォルトが依然として発生しています。
はい、クロックにこの行を追加することでハードフォルトとSDK方法が修正されました。そして、私が考え出した直接コーディングによる方法も同様にうまく機能しました。
一般的には、TRGMUXクロックを有効にしIMCRレジスタを設定し、さらにTRGMUXのリンクをSDKメソッドで呼び出す必要があります。これにより、LPCMPはeMIOSの入力キャプチャを適切にトリガーします。
サポートありがとうございます。