DMAを使用したUART受信について

毎度お世話になっております。

V850ES/JH3-Eを使用しております。

DMA0の転送起動要因としてUARTC3の受信完了割り込み(INTUC3R)を指定しています。

例えば、DMA0の転送回数を5回、5バイトの受信があった場合、最初の1バイトを受信した時点でDMA0が転送を開始し、その後の4バイトで起こる受信割込みは無視される、という認識で正しいでしょうか。

また、このとき無視される受信割込みの割り込み要求フラグ(UC3RIF)は、DMA転送完了割り込み内でクリアする必要があるのでしょうか。

あと、通信速度が遅い場合、UARTC0の受信レジスタが更新されていないのにDMA0がデータの取得に行ってしまう、ということは起こりうるのでしょうか。

毎度質問ばかりで申し訳ありませんが、
以上、よろしくお願いいたします。
Parents
  • dai_toryさん

    DMA転送の前に…UARTCの受信完了割り込みは1フレーム(スタートビット+データビット{8bit or 7bit}+パリティビット+ストップビット)ごとに発生するので、DMA転送トリガにUARTCを指定する場合は、転送回数は基本的に1回となります。

    複数回指定した場合、同じ転送を繰り返し、バス権を占有するため非効率となります。また、転送元、転送先アドレスの設定によっては(データ上書きによる)不具合の原因となります。

    この場合の設定は、転送元:ソースアドレスを受信レジスタ(UC3RX、アドレス固定)、転送先:デスティネーションアドレスをRAM(アドレスインクリメント、もしくは固定)にしておき、DMA転送を行います。転送完了後、DMA転送完了割り込みが発生するので、必要に応じて次の転送アドレスをセットします。


    一方、UARTC受信割り込みでは割り込みが管理するバッファに蓄積しておき、伝文単位の取得を認識した時(CRやLFを受信したなど)にDMAでアプリケーション領域に転送をしたい場合は、転送元をバッファアドレス(インクリメント)、転送先をアプリ領域アドレス(インクリメント)にして、転送回数を受信したバイト数と、ソフトウェアからDMAを起動すれば一括でRAMに転送できます。

    一括転送を行う場合、UARTC受信割り込み内で行うと割り込み処理の時間が長くなってしまう恐れがあるので、伝文単位の受信が完了したかを非割り込み処理中にポーリング確認し、必要に応じてDMA転送したほうがより安全かと思います。
    しかしながら、こちらの場合はDMAの恩恵に与っているのかイマイチ疑問ではありますが…
Reply
  • dai_toryさん

    DMA転送の前に…UARTCの受信完了割り込みは1フレーム(スタートビット+データビット{8bit or 7bit}+パリティビット+ストップビット)ごとに発生するので、DMA転送トリガにUARTCを指定する場合は、転送回数は基本的に1回となります。

    複数回指定した場合、同じ転送を繰り返し、バス権を占有するため非効率となります。また、転送元、転送先アドレスの設定によっては(データ上書きによる)不具合の原因となります。

    この場合の設定は、転送元:ソースアドレスを受信レジスタ(UC3RX、アドレス固定)、転送先:デスティネーションアドレスをRAM(アドレスインクリメント、もしくは固定)にしておき、DMA転送を行います。転送完了後、DMA転送完了割り込みが発生するので、必要に応じて次の転送アドレスをセットします。


    一方、UARTC受信割り込みでは割り込みが管理するバッファに蓄積しておき、伝文単位の取得を認識した時(CRやLFを受信したなど)にDMAでアプリケーション領域に転送をしたい場合は、転送元をバッファアドレス(インクリメント)、転送先をアプリ領域アドレス(インクリメント)にして、転送回数を受信したバイト数と、ソフトウェアからDMAを起動すれば一括でRAMに転送できます。

    一括転送を行う場合、UARTC受信割り込み内で行うと割り込み処理の時間が長くなってしまう恐れがあるので、伝文単位の受信が完了したかを非割り込み処理中にポーリング確認し、必要に応じてDMA転送したほうがより安全かと思います。
    しかしながら、こちらの場合はDMAの恩恵に与っているのかイマイチ疑問ではありますが…
Children
No Data