2395830_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2395830_ja-JP

2395830_ja-JP

S32K348-GPIO EIRQからDMA要求

親愛なるNXPサポートチームへ、

今、GPIO PTD6でEIRQ14の立ち上がりエッジ検出を設定し、このピン信号をDMAチャネルにマッピングし、PIT_1 Timer[0]から現在の値を取得しようとしています。これはフリーランニングとして設定されています。
SIUL2はPTDAで正しく設定されているようで、関連するMCUピンで信号(1Hz)を接続するとこのピンが切り替えられているのが確認できます。

でもDMAは私には合いません
私の推測では、PTD6から>DMAMUX-> DMAチャネル4の適切なチェーンを見つけるのに問題があるのだと思います。そして、これらの情報を正確にどこで見つけられるかも調べてください。

S32K3xx_DMAMUX_map.xlsx から以下の情報を取得しました。

OndrejK_0-1784190602227.png

そこで最初の問題です:PTD6(EIRQ14)に専用のソース>リクエストはどれですか?
RMマニュアルの表44とはどのように関連しているのでしょうか?

OndrejK_1-1784190821068.png

以下は、私が現在取り組んでいるコードの断片です。
PTD6 のセットアップ

void Setup_PTD6_EIRQ14_for_DMA ( void )
{
/* 1. MSCRレジスタによる物理ピンPTD6の設定 */
    // PTD6 は、インデックス MSCR[102] に対応します (スクリーンショットに示されているとおり)
    IP_SIUL2 -> MSCR [ 102 ] = 0 ; // レジスタをクリア
    IP_SIUL2->MSCR[102] |= (1 << 19); // IBE = 1(入力バッファ有効化 - ピンを入力として設定)
    IP_SIUL2 -> IMCR [ 542 - ( 512 )] = 3u ;
    オプション:信号が浮かんでいる場合は、プルアップ(PUE=1、PUS=1)またはプルダウン(PUE=1、PUS=0)を有効にすることができます。

/* 2. 回線EIRQ[14]でのエッジ検出の有効化 */
    // すべての立ち上がりエッジのタイムスタンプを取得したい
    IP_SIUL2 -> IREER0 |= ( 1 << 14 ); // IREER0[EIRE14] = 1 (立ち上がりエッジを有効にする)
    IP_SIUL2 -> IFEER0 &= ~ ( 1 << 14 ); // IFEER0[EIRE14] = 0 (立ち下がりエッジを無効化)

/* 3. リクエストルーティング: 割り込みからDMAへの変更 */
    // このステップにより、エッジがCPU(NVIC)を起動せず、代わりにDMAラインをトリガーすることが保証されます。
    IP_SIUL2->DIRSR0 |= (1 << 14); // DIRSR0[DIRS14] = 1(割り込みではなくDMA要求を選択する)

/* 4.EIRQのDMA要求生成の最終有効化[14] */
    IP_SIUL2->DIRER0 |= (1 << 14); // DIRER0[EIRE14] = 1(DMA要求ラインを起動)
}
 
DMAチャネルの設定:
void Setup_eDMA_Channel4_Capture_PIT1 ( void )
{
/* 1.eDMAチャネル4のDMAMUX初期化 */
    EIRQ14(ソース14)をeDMAチャンネル4にマッピング
    IP_DMAMUX_1 -> CHCFG [ 4 ] = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE ( 7u ); // EIRQ14 は DMAMUX_1 のソース 7 です
    //IP_DMAMUX_0->CHCFG[4] = 0U;

/* 2.チャネルPIT_1 4のTCD構成(正確なS32K3ベアメタル構文)*/
    // ソース: PIT_1 タイマー 0 の現在の値
    IP_TCD -> TCD4_SADDR = ( uint32_t ) & ( IP_PIT_1 -> TIMER [ 0 ]. CVAL );
    IP_TCD -> TCD4_SOFF  = 0 ; // ソースはインクリメントされません
    IP_TCD -> TCD4_ATTR  = 0x0202 ; // 32ビットソース、32ビットデスティネーション

    // マイナーループ: 1回のトリガーで転送されるバイト数
    // S32K3では、これはNBYTES_MLOFFNOレジスタに対応します(マイナーループリンクなし)
    IP_TCD -> NBYTES4 . TCD4_NBYTES_MLOFFNO = 4 ; // トリガーごとに 4 バイト (32 ビット) を転送

    // 宛先: RAM 内の配列
    IP_TCD -> TCD4_DADDR = ( uint32_t ) dma_timestamps ;
    IP_TCD -> TCD4_DOFF  = 4 ; // 各エッジの後に RAM で 4 バイトシフトする

    // 循環バッファ: 配列全体を埋めた後、先頭に戻る
    IP_TCD -> TCD4_DLAST_SGA = - ( BUFFER_SIZE * 4 );

    // 主要ループカウンタ:ループ内の反復回数の合計
    //IP_TCD->CITTER4.TCD4_CITER_ELINKNO = BUFFER_SIZE;
    IP_TCD -> CITER4 . TCD4_CITER_ELINKNO = BUFFER_SIZE ;
    IP_TCD -> BITER4 . TCD4_BITER_ELINKNO = BUFFER_SIZE ;

/* 3.公式マクロによるハードウェアトリガーのeDMAチャネルアクティベーション */
    //IP_TCD->CH4_CSR |= DMA_TCD_CH4_CSR_ERQ_MASK;
/* 3.ハードウェアトリガーのeDMAチャネル起動(非同期モード有効時)*/
    // ビット 0 (ERQ) = 1 -> ハードウェア トリガーを有効にする
    // ビット 2 (EARQ) = 1 -> 外部ピン (SIUL2 EIRQ) からの非同期要求を有効にします
    IP_TCD -> CH4_CSR |= 3u ; // ERQ=1、EARQ=1

}
 
おそらくここが重要な部分でしょう。
IP_DMAMUX_1 -> CHCFG [ 4 ] = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE ( 7u ); // EIRQ14 は DMAMUX_1 のソース 7 です
どの IP_DMAMUX とどの DMAMUX_CHCFG_SOURCE を使用すればよいのか、また、これに関する適切な情報はどこにあるのか、少し混乱しています。

よろしくお願いします
オンドレイ



 

Re: S32K348-GPIO EIRQ to DMA request

こんにちは、@ OndrejK

つまり、MCUには32のTCDチャネルがあり、TCD 0から15はDMAMUX_0に有効で、TCD 15から31DMAMUX_1に適用されるということですか?"

はい、これらの情報はデータシートに記載されています。参考のためにコピーしておきます。


Senlent_0-1784272853624.png


Re: S32K348-GPIO EIRQ to DMA request

こんにちは、Senlentさん。

ご回答ありがとうございます。

TCDマッピングについてのあなたの意味がどこから出たのか教えてもらえますか?

つまり、MCUは32のTCDチャネルを持ち、TCD 0から15がDMAMUX_0に有効で、TCD 15から31は
DMAMUX_1?
DMAMUXとeDMAに関する情報について、まだ少し混乱しています。

よろしくお願いします
オンドレイ

Re: S32K348-GPIO EIRQ to DMA request

こんにちは、@OndrejK

あなたの理解は正しいです。

PTD6->EIRQ14->DMAMUX1.SOURCE 7.

IP_DMAMUX_1->CHCFG[4] = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(7u);  // EIRQ14 is source 7 for DMAMUX_1

しかし、TDC設定が間違っています。

私の理解では、それらは以下のようになるはずです。

IP_DMAMUX_1->CHCFG[0] ->TCD 16

IP_DMAMUX_1->CHCFG[4] -> TCD4ではなくTCD20


タグ(1)
評価なし
バージョン履歴
最終更新日:
14 時間前
更新者: