2017949_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2017949_ja-JP

2017949_ja-JP

DMAが機能しないEmios PWMをフィードする

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をどのように構成するかです。これをどこで設定できるかわかりません。私がやろうとしていることは可能ですか?そうでない場合は、提案する別の解決策はありますか?

ご協力いただきありがとうございます!
ヒューゴ




Re:DMAが機能しないEmios PWMを供給する

こんにちはセンレント、

いくつかのテストを行った結果、ISRは、オシロスコープのスクリーンショットとは異なり、私の側で両方のバッファが再生されたとき(~8.72ミリ秒ごと)にのみ呼び出されることがわかりました。「Enable Major Interrupt」チェックボックスがスキャッター/ギャザーチャネル0に設定されていないため、私には正常であるように思われます。設定してみると、今はちゃんと動作し、バッファもちゃんと再生されています。以下は、両方のチャネルでスキャッター/ギャザー構成に対して行った変更です。

h_bouchard_0-1737044280053.png

誰かが同じことをする必要がある場合に備えて、テストアプリケーションの最終バージョンを添付しました。

ご協力いただき、誠にありがとうございます!!本当にありがたいです!

よろしく
ヒューゴ

Re:DMAが機能しないEmios PWMを供給する

こんにちはセンレント、

ご回答ありがとうございます。P_EMIOS_0->CHを書き込むためにPWM周波数で割り込みが発生するのを避けるために、そうしたいと思います。UC[1].B.それぞれに 128 個のサンプルのバッファが 2 つあるため、1 つのバッファを再生しながら 2 つ目のバッファを更新することができます。1つのバッファが再生されると、ISRを取得し、もう1つのバッファに新しいPWM値を埋めることができます。次の ISR では、新しい値が再生され、他のバッファーを更新できます。私が提供したサンプルアプリケーションでは、PWMデューティサイクル値は定数ですが、これはテスト用でした。

今は自宅で仕事をしているので、テストするオシロスコープはありませんが、明日テストします。これまでのご協力に改めて感謝します!

よろしく
ヒューゴ

Re:DMAが機能しないEmios PWMを供給する

Hi@h_bouchard

なぜこれをやりたいのかわかりませんが、あなたの考えに従って構成を変更しました

そして、参照比較としてPWM出力を追加しました

Senlent_2-1736849996377.png

Senlent_0-1736848226636.png

Senlent_1-1736848276566.png


Re:DMAが機能しないEmios PWMを供給する

こんにちはセンレント、

ご回答ありがとうございます。しかし、それでは本来あるべきことがうまくいきません。マイナーループがすべてのDMA転送を完了し、128に設定されているときに割り込みを取得する必要があります(メジャーループの反復時)。したがって、PWM周期は(1 / 29296.875 KHz)* 128転送= 4.369067 ミリ秒です。あなたのスクリーンショットでは、期間が~3.413 usであることがわかります。

また、DMA はバッファーから読み取られず、最初の要素のみが読み取られて再生されます。TCDx_SADDRがインクリメントされているようには見えません。なぜかわかりますか?

よろしく
ヒューゴ

Re:DMAが機能しないEmios PWMを供給する

Hi@h_bouchard

以下のショーのように修正していただけませんか。

Senlent_0-1736762224024.png

Senlent_1-1736762252732.png


Senlent_2-1736762447652.png

Re:DMAが機能しないEmios PWMを供給する

こんにちはセンレント、

ご協力いただきありがとうございます。ただし、DMAは正常に機能していないようです。バッファの最初のエレメントは eMIOS チャネルの B レジスタに書き込まれますが、ソース アドレスはインクリメントされず、PWM 周期内で 128 PWM 周期ごとに 1 回割り込みが発生するはずです (2 バイト転送の場合、マイナー ループ サイズは 256 に設定されています)。これを確認するために、DMA ISR 関数にピン トグルを追加しました。

TCD レジスタと eMIOS 設定のスクリーンショットを次に示します。

h_bouchard_0-1736511805565.png

h_bouchard_2-1736512200807.png


そして、これがオシロスコープのスクリーンショットです。

h_bouchard_1-1736511911998.png

ご覧のとおり、0.00436907秒ごとに1回しか取得しないはずの割り込みが数マイクロ秒以内に2回発生します(1 / 29296.875 KHz(PWMフレンクエンシー)* 128)。

なぜかわかりますか?

よろしく
ヒューゴ

Re:DMAが機能しないEmios PWMを供給する

Hi@h_bouchard

後で返信して申し訳ありませんが、過負荷になっています。


このオプションを無効にしてください

Senlent_0-1736247215316.png


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は使用していません)

Senlent_1-1736247284630.png


Re:DMAが機能しないEmios PWMを供給する

こんにちはセンレント、

すみません、こちらです。

よろしく
ヒューゴ

Re:DMAが機能しないEmios PWMを供給する

Hi@h_bouchard

テストファームウェアを最新の変更で更新しました(firmware_test2.zipを参照)。"

firmware_test2.zip」が見えなかったので、再確認してください。

Re:DMAが機能しないEmios PWMを供給する

こんにちはセンレント、

ご回答ありがとうございます。私はRMを追加し、あなたが提案したようにそれをセットアップしました:

h_bouchard_0-1735919002338.png

しかし、EMIOS0 CH 1からDMAリクエストを生成できません。これがDMAチャネルの設定です。どちらのエレメント ID も同じに設定されていますが、エレメント ID 0 がエレメント ID 1 にリンクし、エレメント ID 1 がエレメント ID 0 にリンクして、停止しないダブル バッファリングが作成されます。

h_bouchard_1-1735919117751.png

「Enable Start」オプションは、両方のエレメントIDに対して設定されています。DMA 割り込みは、DMA チャネルが設定された直後 (Mcl_SetDmaChannelScatterGatherConfig() の呼び出し) にトリガーされます。その後、PWMが初期化されます。PWM_Init 関数をコメント アウトしても DMA 割り込みがトリガーされ、RM に設定されている EMIOS0 CH 1 ではなく、他の何かが DMA をトリガーしていることがわかります。他に何がDMAを引き起こす可能性があるか知っていますか?

テストファームウェアを最新の変更で更新しました(firmware_test2.zipを参照)。

感謝
よろしく
ヒューゴ

Re:DMAが機能しないEmios PWMを供給する

Hi@h_bouchard

私の質問は、Emios PWMをDMAチャネル0にリンクするようにDMAMUXをどのように構成するかです。

これは「RM」で行うことができます

Senlent_0-1735029393132.png


Tags (1)
No ratings
Version history
Last update:
‎01-06-2026 01:25 AM
Updated by: