シングルチップマイクロコンピュータの高負荷シリアル通信のための信頼できるソリューションを設計するにはどうすればよいですか?

上の「UncleWheat」をクリックして「Top/ StarPublicAccount」を選択してください

福祉乾物、お早めにお届け

1はじめに

DMAと呼ばれるダイレクトメモリアクセス(ダイレクトメモリアクセス)。DMAは、あるアドレス空間から別のアドレス空間にデータを「転送」(コピー)するために使用されるCPUのコンポーネントです。データコピープロセスはCPUの介入を必要とせず、データコピーが終了するとCPUに通知されます。

したがって、大量のデータがコピーされる場合、DMAを使用するとCPUリソースを解放できます。DMAデータコピープロセスは通常、次のとおりです。

  • メモリ->メモリ、メモリ間でコピー

  • 周辺機器->uart、spi、i2c、その他のバス受信データプロセスなどのメモリ

  • メモリ->uart、spi、i2c、その他のバスデータ送信プロセスなどの周辺機器

2シリアルポートにDMAを使用する必要がありますか?

シリアルポート(uart)は低速シリアル非同期通信であり、低速通信シナリオに適しており、通常使用されるボーレートは115200bps以下です。

ボーレートが115200bps以下でデータ量が少ない通信シナリオでは、通常、DMAを使用する必要がないか、DMAを使用してもDMAの役割が十分に発揮されません。

多数の場合、またはボーレートが増加した場合、ボーレートが高いと次のような問題が発生する可能性があるため、DMAを使用してCPUリソースを解放する必要があります。

  • 送信には、循環送信を使用します。これにより、スレッドがブロックされ、データを「運ぶ」ために多くのCPUリソースが消費され、CPUが浪費される可能性があります。

  • 送信の場合、割り込み送信を使用してもスレッドはブロックされませんが、多くの割り込みリソースを浪費する必要があり、CPUは頻繁に割り込みに応答します。ボーレートが115200bpsの場合、11520バイトが1秒で送信されます。割り込みに応答するための69us。ボーレートがさらに増加すると、より多くのCPUリソースを消費します。

  • 受信の場合、従来の割り込みモードを引き続き受信に使用すると、割り込みが頻繁に発生するため、CPUリソースも大量に消費します。

したがって、高ボーレートのシナリオでは、シリアルポートでDMAを使用する必要があります。

3実施方法

f167e54f63e8f34549109acc3dbca9df.png
全体的なデザイン

4STM32シリアルポートはDMAを使用します

STM32シリアルポートでのDMAの使用に関しては、インターネット上の一部のブロガーによる多くの開発ボードルーチンとチュートリアルがあります。使用手順、プロセス、構成は基本的に同じであり、正確性に問題はありませんが、これらはすべて基本的なデモの例であり、学習プロセスとしては問題ありません。実際のプロジェクトの使用は厳密性に欠け、大量です。データの量が異常なデータになる可能性があります。

テストプラットフォーム:

  • STM32F030C8T6

  • UART1 / UART2

  • DMA1チャネル2:チャネル5

  • ST標準ライブラリ

  • 主周波数48MHz(外部12MHz水晶)

2775dc8f55b55ed8ab8b3a058c699b91.png
ここに画像の説明を挿入

5シリアルポートDMA受信

5.1基本的なプロセス

6a17d9d97ecd30b7ff00f791283f75d3.png
シリアルポート受信フローチャート

5.2関連する構成

キーステップ

【1】シリアルポートを初期化する

[2]シリアルポートDMA受信モードを有効にし、シリアルポートアイドル割り込みを有効にします

[3] DMAパラメータを設定し、DMAチャネルbuf half-full(データの半分を転送)割り込み、bufオーバーフロー(データ転送完了)割り込みを有効にします

DMAチャネルbufハーフフル割り込みを使用する必要があるのはなぜですか?

シリアルポートDMAモード受信の多くのチュートリアルと例では、基本的に「スペース割り込み」+「DMA転送完了割り込み」を使用してデータを受信します。

本質的に、これは危険です。DMA転送データが完了すると、CPUが介入してDMAチャネルbufデータのコピーを開始します。この時点でシリアルポートにデータが引き続き入力されると、DMAはデータを次の場所に転送し続けます。 CPU割り込みをオフにしても、DMAデータが転送されるため、buf、およびデータが上書きされる可能性があります。CPUによって制御されません。

厳密なアプローチではダブルバフを実行する必要があり、CPUとDMAはそれぞれメモリの一部、つまり「ピンポンキャッシュ」に交互にアクセスします。処理フローの手順は次のとおりです。

[1]最初のステップであるDMAは、最初にデータをbuf1に転送し、転送の完了後にbuf1データをコピーするようにCPUに通知します。

[2] 2番目のステップでは、DMAはデータをbuf2に転送します。これは、buf1データをコピーするCPUと競合しません。

[3] 3番目のステップでは、buf2データ転送が完了し、CPUにbuf2データをコピーするように通知されます。

[4] 3番目のステップが実行された後、DMAは最初のステップに戻り、ループを続けます

10e470ab54f09cf535e02070e0e6f25b.png
ダブルバッファDMAデータ転送プロセス

STM32F0シリーズDMAは、ダブルバッファー(特定のモデルによる)メカニズムをサポートしていませんが、bufを提供します"半满中断"

つまり、データがbufの半分のサイズに転送されると、割り込み信号を生成できます。このメカニズムに基づいて、bufスペースを少し大きくするだけで、ダブルバッファリング機能を実装できます。

[1]最初のステップでは、DMAがデータをbufの前半に転送すると、「ハーフフル割り込み」が生成され、CPUがbufデータの前半をコピーします。

[2] 2番目のステップでは、DMAはbufの後半にデータを転送し続けます。これは、bufデータの前半をコピーするCPUと競合しません。

[3] 3番目のステップでは、bufの後半のデータが完了し、「オーバーフロー割り込み」がトリガーされ、CPUがbufの後半のデータをコピーします。

[4] 3番目のステップが実行された後、DMAは最初のステップに戻り、ループを続けます

9880a85ee305da43a81984cc60ffff41.png
ハーフフルを使用して、DMAデータ転送プロセスを中断します

UART2 DMAモードの受信構成コードは次のとおりです。これは基本的にDMAを使用する他の周辺機器の構成と同じですが、主要な構成に注意してください。

  • シリアルポート受信、DMAチャネル動作モードが連続モードに設定されている

  • DMAチャネルがbufハーフフル割り込み、オーバーフロー(転送完了)割り込みを受信できるようにします

  • 初めてカオスデータ送信を防ぐために、DMAチャネルを開始する前に関連するステータスフラグをクリアしてください

b1381c2d9fd4450c75be8535c7bf388d.png

DMAエラー割り込み“DMA_IT_TE”は、通常、DMAエラーの数を確認するための初期デバッグに使用されます。リリースソフトウェアは、この割り込みを有効にしない場合があります。

5.3受信処理

上記の説明メカニズムに基づいて、シリアルポートデータはDMAによって受信され、CPUがbufデータをFIFOにコピーする必要がある3つの割り込みシナリオがあります。

  • DMAチャネルbufオーバーフロー(転送完了)シナリオ

  • DMAチャネルbufハーフフルシーン

  • シリアルポートアイドル割り込みシナリオ

最初の2つのシナリオは、前の記事で説明されています。シリアルポートのアイドル割り込みとは、データ送信が完了した後、シリアルポートが一定期間データが入っていないことを監視し、生成された割り込み信号をトリガーすることを意味します。

5.3.1受信データサイズ

データ送信プロセスはランダムであり、データサイズも不確定です。状況にはいくつかのタイプがあります。

  • データは、DMA受信bufの整数倍であり、理想的な状態です。

  • データ量がDMA受信buf未満、または受信bufの半分未満の場合、シリアルポートアイドル割り込みがトリガーされます。

したがって、それ“DMA通道buf大小”、“DMA通道buf剩余空间大小”、“上一次接收的总数据大小”に基づいて現在受信しているデータサイズを計算する必要があります。

/* 获取DMA通道接收buf剩余空间大小 */
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);

DMAチャネルbufオーバーフローシナリオの計算

接收数据大小 = DMA通道buf大小 - 上一次接收的总数据大小

DMAチャネルbufオーバーフロー割り込みハンドラー:

bd4c50c0b80123482db1eface3c00449.png

DMAチャネルbufハーフフルシナリオの計算

接收数据大小 = DMA通道接收总数据大小 - 上一次接收的总数据大小
DMA通道接收总数据大小 = DMA通道buf大小 - DMA通道buf剩余空间大小

DMAチャネルbufハーフフル割り込みハンドラ:

60f6141626f4d36cf5101ecd887dc4c1.png

シリアルポートアイドル割り込みシナリオの計算

シリアルポートアイドル割り込みシナリオでの受信データの計算方法は、「DMAチャネルbufハーフフルシナリオ」と同じです。

シリアルポートアイドル割り込みハンドラ

注:シリアルポートアイドル割り込み処理機能は、fifoを受信するシリアルポートにデータをコピーするだけでなく、シリアルポートデータ送信完了フラグや無期限データ処理などの特殊な処理を追加することもできます。

5.3.2受信データオフセットアドレス

有効なデータをFIFOにコピーするには、有効なデータのサイズを知ることに加えて、データがDMA受信bufに格納されているオフセットアドレスも知る必要があります。

実効データオフセットアドレスは、最後に受信した合計サイズを記録するだけで済みます。つまり、次のデータはbufの先頭から格納されるため、値はDMAチャネルbufフル割り込みハンドラによってクリアされます。

DMAチャネルbufオーバーフロー割り込みハンドラのデータオフセットアドレスをクリアします。

4e7cb5ff820f1919a​​406895a2631b317.png

5.4シリアルポートデータ方式を読み取るためのアプリケーション

前の処理ステップの後、シリアルポートデータは受信側FIFOにコピーされ、アプリケーションタスクは処理のためにFIFOからデータを取得するだけで済みます。処理効率は、データを受信および転送するDAMの効率よりも高くなければならないという前提があります。そうしないと、データが失われたり上書きされたりします。

6シリアルポートDMA送信

6.1基本的なプロセス

6a51b1e36c591611f023db252bce8157.png
シリアルポート送信フローチャート

6.2関連する構成

キーステップ

【1】シリアルポートを初期化する

【2】シリアルポートDMA送信モードを有効にする

[3] DMA伝送チャネルを設定します。この手順では、初期設定は必要ありません。送信するデータがある場合にのみ、DMA伝送チャネルを設定してください。

UART2 DMAモードの伝送構成コードは次のとおりです。これは基本的にDMAを使用する他の周辺機器の構成と同じですが、主要な構成に注意してください。

  • シリアル送信はyes​​で、DMAチャネルの動作モードはシングルショットモード(通常モード)に設定され、データを送信する必要があるたびにDMAが再構成されます。

  • DMAチャネル転送完了割り込みを有効にし、割り込み情報を使用して、送信状態のクリアや次の転送の開始など、いくつかの必要なタスクを処理します。

  • 初めてカオスデータ送信を防ぐために、DMAチャネルを開始する前に関連するステータスフラグをクリアしてください

6.3送信処理

送信されるシリアルポートデータは送信FIFOに保存されます。送信処理機能が実行する必要があるタスクは、送信FIFOにデータがあるかどうかを周期的に照会することです。データがある場合は、データをDMA送信bufにコピーします。その後、DMA送信を開始します。

最後のDMA転送が完了するまで待つ必要があります。つまり、DMAはDMA転送完了割り込み信号を受信し"DMA_IT_TC"ます。

シリアルポート送信処理機能:

d8df0c6dce0206b1d1b321b729179f8b.png

  • 送信ステータスフラグに注意してください。最初に「送信ステータス」に設定してから、DMA転送を開始する必要があります。手順を逆にすると、転送するデータ量が少ない場合、DMA転送時間が短くなり“DMA_IT_TC”、「送信ステータスフラグが設定される」前に割り込みが実行され、DMAが送信されたと誤判定される場合があります。送信状態を処理しています(送信フラグをクリアすることはできません)。

注:DMA送信データ開始機能に関しては、DMA送信bufのサイズを変更するだけでよいとのブログ記事があります。テストの結果、送信データ量が少ない場合にこの方法が実行可能であることがわかりました。DMAをトリガーする完了割り込みを送信します。したがって、信頼できる方法は、DMA送信が開始されるたびにDMAチャネルのすべてのパラメータを再構成することです。このステップは単なる構成登録プロセスであり、本質的にCPUの実行時間はそれほどかかりません。

DMA転送完了割り込みハンドラー:

fa0f195a334e056d09b8bd5dcccb5683.png

上記のシリアルポート送信処理関数は、いくつかの状況で呼び出すことができます。

  • メインスレッドのタスク呼び出し。ただし、スレッドを他のタスクでブロックできない場合は、FIFOオーバーフローが発生します。

    44e91a3f675757deea1786315562e641.png

  • タイマー割り込みによって呼び出されます

    bf3d649ddf209b600473fc3e53c11018.png

  • DMAチャネル転送完了割り込みで呼び出されます

    8bc59e4854c2663b82fef440e8ecb57c.png

毎回bufを送信するためにDMAにコピーされるデータの量:

この問題に関しては、特定のアプリケーションシナリオに関連しています。従うべき原則は次のとおりです。fifoに送信されるデータの量がDMA送信bufのサイズ以上である限り、DMA送信bufは次のようになります。がいっぱいになると、DMAのパフォーマンスを十分に発揮できるように、DMA送信が開始されます。

したがって、各DMA送信の効率とシリアルデータフローのリアルタイムパフォーマンスを考慮し、いくつかのタイプの実装を参照する必要があります。

  • 定期的にFIFOデータを照会および送信し、DMA送信を開始し、DMA送信効率を最大限に活用しますが、シリアルデータフローのリアルタイムパフォーマンスを低下させる可能性があります

  • 理想的な方法であるFIFOデータを送信するためのリアルタイムクエリとタイムアウト処理

  • DMA転送完了割り込みで処理され、リアルタイムの継続的なデータフローを保証します

7シリアルデバイス

7.1データ構造

7.2外部インターフェース

8完全なソースコード

コードリポジトリ:

https://github.com/Prry/stm32f0-uart-dma

圧力試験:

  • 1.5Mbpsのボーレート、シリアルアシスタントは1ミリ秒あたり1kバイトのデータを送信し、stm32f0 DMAはデータを受信して​​から、圧力をかけずにDMAを介してシリアルアシスタントに送り返します。

  • 1.5Mbpsのボーレートで、大きなファイルのテストを送信し、受信したデータをファイルとして保存し、ソースファイルと比較できます。

  • シリアルポートの高ボーレートテストでは、USBtoTLLツールとシリアルポートアシスタントの両方のサポートが必要です。CP2102およびFT232チップのUSBtoTTLツールをお勧めします。

feed1dd5b2686a872e6c0fc4f2042bb7.png
1.5Mbpsシリアルポートループバックストレステスト
原文地址:blog.csdn.net/qq_20553613/article/details/108367512

公開番号から転送:Embedded Intelligence Bureau

著作権に関する声明:この記事はインターネットからのものであり、著作権は原作者に帰属します。著作権の問題については、お問い合わせください。

- 終わり -

過去に推奨

量子充電、9秒で車を充電!これは神秘主義ですか?

GD32はSTM32を置き換えますが、違いは何ですか?これらの穴を踏まないでください...

最も実用的な方法であるシングルチップ通信プロトコルの効率的な分析

シングルチップマイクロコンピュータに最適な通信プロトコル、設計方法は?

4,600万本販売!ラズベリーパイへの道

良いツールです、隠さないでください!効率を改善するためのツールを導入する

下のカードをクリックしてフォローしてください

おすすめ

転載: blog.csdn.net/u010632165/article/details/123836318