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

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

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

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

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

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

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

毎度質問ばかりで申し訳ありませんが、
以上、よろしくお願いいたします。
Parents
  • スタッフのチョコです。

    dai_tory様の質問に回答させていただきます。

    V850ES/JH3-EのDMAコントローラは1回のDMA転送要求で,1回の転送を行ったら,バスを解放します。その後DMA要求があれば,再度DMA転送を行います。

    また,UARTC3の受信完了割り込みをDMA起動要因に設定された場合,UARTC3は受信完了により通常の割り込み要求とDMA転送要求を同時に発生させます。つまり,DMA転送要求と割り込み要求が同時に発生してしまいます。

    そのため,DMA転送を使用する場合には,UARTC3の割り込み要求をマスク(UC3RMK=1;)しておく必要があります。UARTC3の(通常の)割り込み要求はマスクしたことで,ペンディングされた状態になっていますから,指定回数のDMA転送が完了してDMA転送完了の割り込みの中でUARTC3の割り込み要求フラグをクリア(UC3RIF=0;)してください。(なお,UARTC3の割り込みを全く使用しないのであれば,UC3RMK=1に設定したままでUC3RIFを無視しても問題はありません。)

    DMAはUARTC3の受信完了割り込みでDMA転送を開始し,転送完了後にバスを解放して,DMA転送要求があるかを確認します。この時点ではUARTC3では次のデータの受信は完了していないので転送要求は発生していないため,DMAは起動しません。
    つまり,DMAの転送回数を5回に設定しておくと,UARTC3での受信完了ごとに5回のDMA転送が行われます。ご心配されている,UARTC3の受信データが更新されていないのにDMAが転送を行うことはありません。


Reply
  • スタッフのチョコです。

    dai_tory様の質問に回答させていただきます。

    V850ES/JH3-EのDMAコントローラは1回のDMA転送要求で,1回の転送を行ったら,バスを解放します。その後DMA要求があれば,再度DMA転送を行います。

    また,UARTC3の受信完了割り込みをDMA起動要因に設定された場合,UARTC3は受信完了により通常の割り込み要求とDMA転送要求を同時に発生させます。つまり,DMA転送要求と割り込み要求が同時に発生してしまいます。

    そのため,DMA転送を使用する場合には,UARTC3の割り込み要求をマスク(UC3RMK=1;)しておく必要があります。UARTC3の(通常の)割り込み要求はマスクしたことで,ペンディングされた状態になっていますから,指定回数のDMA転送が完了してDMA転送完了の割り込みの中でUARTC3の割り込み要求フラグをクリア(UC3RIF=0;)してください。(なお,UARTC3の割り込みを全く使用しないのであれば,UC3RMK=1に設定したままでUC3RIFを無視しても問題はありません。)

    DMAはUARTC3の受信完了割り込みでDMA転送を開始し,転送完了後にバスを解放して,DMA転送要求があるかを確認します。この時点ではUARTC3では次のデータの受信は完了していないので転送要求は発生していないため,DMAは起動しません。
    つまり,DMAの転送回数を5回に設定しておくと,UARTC3での受信完了ごとに5回のDMA転送が行われます。ご心配されている,UARTC3の受信データが更新されていないのにDMAが転送を行うことはありません。


Children
No Data