STM32U5
DMA：サーキュラバッファリン
グとダブルバッファリング
Rev 1.0

こんにちは。このプレゼンテーションでは、LPDMA と GPDMA がサポートするサーキュラバッファリングとダブルバッファリングについて説明します。

1LP（/GP）DMA チャネル 0：連続 ADC（256 バイトが割り当てられたサーキュラバッファを持つ 12 ビット ADC4）
リセット

リクエスト = ADC4

リクエスト = ADC4

初期化/LLI0

LLI1 は DAR を更新

32 ビット SRAM
16 ビットRDATA&ADC_DR

DMA チャ
ネル 0&Buffer

Sample1

Sample0...

...

Sample127

Sample126チャネル 0
ADC4 サービス
1/2 転送完了

レジスタ

値

転送完了

1/2 転送完了

転送完了

コメント

サーキュラバッファありの連続モードの ADC、オプション 2：内部レジスタ = LLI0DMA_CxCR

0x0000_1F01

HTIE=1、TCIE=1、EN=1

DMA_CxTR10x0009_0001

SINC=0、DINC=1、S/DDW_LOG2=1（ハーフワード）、
PAM=0

DMA_CxTR2

0x0000_0001

TCEM=0b00（ブロック）、リクエスト選択 = ADC4、トリガなし

DMA_CxBR1

0x0000_0100

BNDT = 256 バイト

DMA_CxSAR&ADC_DR

ADC データレジスタのアドレス

DMA_CxDAR&Buffer

SRAM 内のバッファの開始アドレス

DMA_CxLLR

0x0800_0000

UDA=1、UT1=UT2=UB1=USA=ULL=0、LA=0

次のように DMA_CxCR を初期化することで、GPDMA での最適化性能を得ることができる
 ハーフワードのソースデータは、FIFO キューに入れて、ワードにパックすることができる
 DDW_LOG2[1:0]=0b10（ワード）PAM[1:0]=0b1x

サーキュラバッファありの連続モードの ADC、オプション 2：LLI1 は DAR を復元
DMA_CxDAR&Buffer

SRAM 内のバッファの開始アドレス

2DMA を使用して、ADC4 によって取得された 16 ビットサンプルを、128 個のサンプルを含む SRAM のバッファに最小限のソフトウェア介入によって転送します。
バッファの開始アドレスとともに転送先アドレスレジスタを自動的にリロードするために、2 つの LLI を含むリンクリストが実装されます。
LLI0 では必要なすべての初期化が行われ、LLI1 では転送先アドレスレジスタのみが復元されます。
CxLLR レジスタは LLI0 の後に更新されないため、バッファがフルになるたびに、LLI1 は転送先アドレスのみを復元します。
1/2 転送完了と転送完了の 2 つの割込みが有効になります。
ここに、GPDMA と LPDMA の両方に適用される初期化について説明します。
- CxCR レジスタでは、割込みが有効で、チャネルが有効- CxTR1 レジスタでは、アドレッシングモードを選択。転送元アドレスでは固定、転送先アドレスではインクリメントされます。転送元データと転送先のデータ幅も選択され、どちらのケースでも 16 ビットハーフワードです。
- CxTR2 レジスタでは、ブロック転送時に転送完了イベントが発生、リクエスト入力を選択。ここでは、トリガが使用されていない間は ADC4 です。
- CxSAR レジスタでは、ADC データレジスタのアドレスをプログラム- CxDAR レジスタでは、メモリ内のバッファの開始アドレスをプログラム- CxLLR レジスタでは、リンクを設定。DAR レジスタのみがリロードされる
GPDMA が使用されている場合は、設定を変更して性能を向上させることができます。
チャネル FIFO は、ハーフワードをメモリ内のバッファに移動する代わりに、ハーフワードを収集し、ワードにパックして、バッファに書き込みます。これは、転送先データ幅をワードとしてプログラムし、PAM フィールドを 1x にセットして、転送元データの FIFO キューイングと転送先データ幅までのパッキングを有効にすることによって実現されます。

2

サーキュラバッファによる SAR/DAR の更新
リセット

トリガ

リクエスト

初期化/メイン

トリガ

リクエスト

SAR/DAR を更新リセットまたはトリガ

無効

リクエスト

サーキュラメインチャネル x1/2 転送完了

転送完了

1/2 転送完了

1/2 転送完了

転送完了

トリガ

リクエスト

転送完了

SAR/DAR を更新
転送完了
チャネル x3

このスライドでは、固有のサーキュラバッファ使用時の、転送元または転送先アドレスレジスタの自動更新について説明します。
固有のバッファが使用されるため、DMA が新しいサンプルで上書きする前に、ソフトウェアが受信したサンプルを処理できるように、1/2 転送完了割込みが必要です。
転送元または転送先アドレスの自動復元は、2 つの異なる手法で実行できます。
左の図に対応する最初の手法については、前のスライドで説明しています。メインの LLI0 は、チャネルのリンクリストのレジスタを直接設定します。LLI0 データ構造はメモリ内にありません。
転送元または転送先アドレスを復元し、実行されるのは、メモリ内の LLI1 のみです。
もう 1 つの手法は、チャネル x のリンクリストのレジスタではなく、LLI1 を指す LLR レジスタによって記述されたデータ転送を行うことです。
LLI1 は、メモリ内のメインのデータ構造であり、レジスタファイルで直接初期化されず、LLI2 データ構造を指します。
転送元または転送先アドレスを復元し、実行されるのは、LLI2 のみです。
共有 DMA チャネル x での他の任意の転送の後にサーキュラバッファリングを実行する必要がある場合は、この 2 番目の手法が必要です。
最初のブロック転送を設定するには、メモリ内の最後から 2 番目の LLI N-1 が必要です。
また、最後の LLI N がメモリの転送元または転送先の開始アドレスを復元します。

3ピンポンバッファによる SAR/DAR の更新
リセット

トリガ

無効

リクエスト

ピン

リセット

トリガ

リクエスト

トリガ

ピン

転送完了

リクエスト

ポン

転送完了

転送完了

またはトリガチャネル x

リクエスト

ポン

トリガ

転送完了

チャネル x

リクエスト

ピン

転送完了

4

固有のサーキュラバッファよりも、ピンポンバッファのペアの管理が好まれる場合があります。
左の図は、レジスタファイルを介した最初のデータ転送を行わず、LLI ピンのデータ構造をロードするためにリンク転送のみを行う実装を示しています。
最初のリクエストと、場合によってはトリガを受信すると、ピンバッファに関連する LLI が実行されます。
このバッファがフルになると、転送完了割込みが生成され、ピンバッファに処理する準備ができたデータがあることをソフトウェアに知らせます。
ポンバッファに関連する LLI をロードするためのリンク転送は、ピンバッファがフルのときにも発生します。
このピンポンバッファが完全に実行されると、転送完了割込みはポンバッファに処理する準備ができたデータがあることをソフトウェアに知らせます。
ピンバッファに関連する LLI へのリンクは、ポンバッファがフルのときにも発生します。その後、同じシーケンスが繰り返されます。
右の図は、LLI0 が DMA を直接設定してピンバッファを実行し、その後メモリからLLI ポンバッファをロードするというシーケンスを示しています。
ダブルバッファ管理のケースでは、ポンバッファがフルの場合、メモリ内の 2 番目の LLI がピン転送を記述するために必ず必要です。

4© STMicroelectronics - All rights reserved.
ST logo is a trademark or a registered trademark of STMicroelectronics International NV or its affiliates in the EU and/or other countries.
For additional information about ST trademarks, please refer to www.st.com/trademarks.
All other product or service names are the property of their respective owners.

このプレゼンテーション以外に、GPDMA および LPDMA に関する他のプレゼンテーションを参照できます。
- DMA の概要
- DMA 転送のハードウェアビューとソフトウェアビュー
- 自律 DMA と低消費電力モード- DMA のリンクリスト- DMA の 2 次元アドレス- DMA のレジスタファイル- DMA のエラーレポート- DMA の入出力 LLI 制御

5