Hi,
私はEmios PWM(OPWMBモード)を使用して、DMAを供給しようとしています。スキャッター ギャザー モードで構成された 2 つの DMA バッファーを持つテスト アプリケーションをセットアップしました。最初のものが再生終了すると、2番目のものが再生されます。現在、バッファを更新していませんが、最終的なアプリケーションでは、バッファが再生されている間、他のバッファが更新され、バッファがループ再生されます。
S32 Design Studio 3.5 と S32K3XX Real-Time Drivers AUTOSAR R21-11 Version 5.0.0 を使用しています。
DMA チャネル 0 を 2 つのエレメント (各 128 エレメントの 2 つのバッファー) を持つスキャッター ギャザー モードに設定しました。ソースは int16 のバッファであるため、"source signed offset" は 2 に設定され、"transfer size" も 2 に設定されます。宛先はEmiosレジスタ(IP_EMIOS_0->CH。UC[1]。B) したがって、"Destination Signed Offset" は 0 に設定され、"Transfer Size" は 2 に設定されます。ソース バッファーには 128 個の要素があるため、"ソースの最後のアドレス調整" は -256 (128 * sizeof(int16)) に設定されます。
PWM は、DMA 要求 (フラグ イベント応答 -> EMIOS_PWM_IP_DMA_REQUEST) をトリガーするように設定されています。
S32K312EVB-Q172ボード上で動作するテストアプリケーションを添付しました。現在、バッファはループで再生されておらず、一度だけ再生されるべきですが、まったく再生されていません。オシロスコープで確認したところ、PWM のデューティ サイクルが変化しません
私の質問は、Emios PWMをDMAチャネル0にリンクするようにDMAMUXをどのように構成するかです。これをどこで設定できるかわかりません。私がやろうとしていることは可能ですか?そうでない場合は、提案する別の解決策はありますか?
ご協力いただきありがとうございます!
ヒューゴ
こんにちはセンレント、
いくつかのテストを行った結果、ISRは、オシロスコープのスクリーンショットとは異なり、私の側で両方のバッファが再生されたとき(~8.72ミリ秒ごと)にのみ呼び出されることがわかりました。「Enable Major Interrupt」チェックボックスがスキャッター/ギャザーチャネル0に設定されていないため、私には正常であるように思われます。設定してみると、今はちゃんと動作し、バッファもちゃんと再生されています。以下は、両方のチャネルでスキャッター/ギャザー構成に対して行った変更です。
誰かが同じことをする必要がある場合に備えて、テストアプリケーションの最終バージョンを添付しました。
ご協力いただき、誠にありがとうございます!!本当にありがたいです!
よろしく
ヒューゴ
こんにちはセンレント、
ご回答ありがとうございます。P_EMIOS_0->CHを書き込むためにPWM周波数で割り込みが発生するのを避けるために、そうしたいと思います。UC[1].B.それぞれに 128 個のサンプルのバッファが 2 つあるため、1 つのバッファを再生しながら 2 つ目のバッファを更新することができます。1つのバッファが再生されると、ISRを取得し、もう1つのバッファに新しいPWM値を埋めることができます。次の ISR では、新しい値が再生され、他のバッファーを更新できます。私が提供したサンプルアプリケーションでは、PWMデューティサイクル値は定数ですが、これはテスト用でした。
今は自宅で仕事をしているので、テストするオシロスコープはありませんが、明日テストします。これまでのご協力に改めて感謝します!
よろしく
ヒューゴ
Hi@h_bouchard
なぜこれをやりたいのかわかりませんが、あなたの考えに従って構成を変更しました
そして、参照比較としてPWM出力を追加しました
こんにちはセンレント、
ご回答ありがとうございます。しかし、それでは本来あるべきことがうまくいきません。マイナーループがすべてのDMA転送を完了し、128に設定されているときに割り込みを取得する必要があります(メジャーループの反復時)。したがって、PWM周期は(1 / 29296.875 KHz)* 128転送= 4.369067 ミリ秒です。あなたのスクリーンショットでは、期間が~3.413 usであることがわかります。
また、DMA はバッファーから読み取られず、最初の要素のみが読み取られて再生されます。TCDx_SADDRがインクリメントされているようには見えません。なぜかわかりますか?
よろしく
ヒューゴ
Hi@h_bouchard
以下のショーのように修正していただけませんか。
こんにちはセンレント、
ご協力いただきありがとうございます。ただし、DMAは正常に機能していないようです。バッファの最初のエレメントは eMIOS チャネルの B レジスタに書き込まれますが、ソース アドレスはインクリメントされず、PWM 周期内で 128 PWM 周期ごとに 1 回割り込みが発生するはずです (2 バイト転送の場合、マイナー ループ サイズは 256 に設定されています)。これを確認するために、DMA ISR 関数にピン トグルを追加しました。
TCD レジスタと eMIOS 設定のスクリーンショットを次に示します。
そして、これがオシロスコープのスクリーンショットです。
ご覧のとおり、0.00436907秒ごとに1回しか取得しないはずの割り込みが数マイクロ秒以内に2回発生します(1 / 29296.875 KHz(PWMフレンクエンシー)* 128)。
なぜかわかりますか?
よろしく
ヒューゴ
Hi@h_bouchard
後で返信して申し訳ありませんが、過負荷になっています。
このオプションを無効にしてください
emios0_ch1->FENを有効にしないと、DMAリクエストは生成されません。
IP_EMIOS_0->CH.UC[1].C = (IP_EMIOS_0->CH.UC[1].C & ~(eMIOS_C_FEN_MASK)) | eMIOS_C_FEN(1);
(FENビットを有効にするためのAPIが必要ですが、MCAL APIは使用していません)
こんにちはセンレント、
すみません、こちらです。
よろしく
ヒューゴ
「テストファームウェアを最新の変更で更新しました(firmware_test2.zipを参照)。"
「firmware_test2.zip」が見えなかったので、再確認してください。
こんにちはセンレント、
ご回答ありがとうございます。私はRMを追加し、あなたが提案したようにそれをセットアップしました:
しかし、EMIOS0 CH 1からDMAリクエストを生成できません。これがDMAチャネルの設定です。どちらのエレメント ID も同じに設定されていますが、エレメント ID 0 がエレメント ID 1 にリンクし、エレメント ID 1 がエレメント ID 0 にリンクして、停止しないダブル バッファリングが作成されます。
「Enable Start」オプションは、両方のエレメントIDに対して設定されています。DMA 割り込みは、DMA チャネルが設定された直後 (Mcl_SetDmaChannelScatterGatherConfig() の呼び出し) にトリガーされます。その後、PWMが初期化されます。PWM_Init 関数をコメント アウトしても DMA 割り込みがトリガーされ、RM に設定されている EMIOS0 CH 1 ではなく、他の何かが DMA をトリガーしていることがわかります。他に何がDMAを引き起こす可能性があるか知っていますか?
テストファームウェアを最新の変更で更新しました(firmware_test2.zipを参照)。
感謝
よろしく
ヒューゴ
私の質問は、Emios PWMをDMAチャネル0にリンクするようにDMAMUXをどのように構成するかです。
これは「RM」で行うことができます