DMA制御関数


【概要】

DMA(Direct Memory Access)モジュールを設定制御する関数および
マクロ命令です。
DMAは多種の周辺とメモリ間の高速転送を行うことが可能で、多くの
設定項目があります。

【高位レベルDMA制御関数一覧】

主なDMA制御関数およびマクロ命令には下記のようなものが含まれます。

関数、マクロ名 機能内容
DmaChnOpen 指定のDMAチャネルを使用状態にする関数
《書式》
  void DmaChnOpen(int chn, DmaChannelPri chPri, DmaOpenFlags oFlags);
    chn  :オープンするDMAチャネル番号
    chPri :チャネルの優先順位(0〜3)
    oFlags :オープンするモードの指定で下記からOR指定
      DMA_OPEN_DEFAULT   :デフォルト動作とする
      DMA_OPEN_AUTO     :自動開始とする
      DMA_OPEN_CHAIN_LOW :下位チャネルに追加
      DMA_OPEN_CHAIN_HI   :上位チャネルに追加
      DMA_OPEN_DET_EN    :イベント動作を有効化
      DMA_OPEN_ENABLE   :オープン後すぐ有効化
      DMA_OPEN_MATCH    :パターンマッチで停止
《使用例》
  DmaChnOpen(3, DMA_CHN_PRI2, DMA_OPEN_AUTO | DMA_OPEN_MATCH);
DmaChnEnable
DmaChnDisable
指定チャネルのDMAを動作開始、動作停止する関数
《書式》
  void DmaChnEnable(int chn);
  void DmaChnDisable(int chn);
DmaChnSetTxfer DMA転送を行う転送元と転送先の設定
《書式》
  void DmaChnSetTxfer(int chn, const void* vSrcAdd, void* vDstAdd,
                int srcSize, int dstSize, int cellSize);
    chn    :DMAチャネル番号
    vSrcAdd :DMA転送元のアドレス(仮想アドレス)
    vDstAdd :DMA転送先のアドレス(仮想アドレス)
    srcSize  :転送元のバッファサイズ(バイト)
           1〜DmaGetMaxTxferSize() 自動折り返しされる
    dstSize  :転送先のバッファサイズ(バイト)
           1〜DmaGetMaxTxferSize() 自動折り返しされる
    cellSize :転送単位のサイズ 1〜DmaGetMaxTxferSize()
《使用例》
  DmaChnSetTxfer(3, &U2RXREG, dstBuff, 1, sizeof(dstBuff), 1);
DmaChnSetMatchPattern 指定DMAチャネルのパターンマッチデータの指定
《書式》
  void DmaChnSetMatchPattern(int chn, int pattern);
   chn   :チャネル番号
   pattern :DMA転送を終了させるビットパターン
《使用例》
   DmaChnSetMatchPattern(3, '\r');
DmaChnGetMatchPattern 指定DMAチャネルの現状のマッチパターンのデータを取得する
《書式》
  int DmaChnGetMatchPattern(int chn);
   chn  :チャネル番号
   戻り値:パターンデータ
《使用例》
  int stopPattern = DmaChnGetMatchPattern(3);
DmaChnStartTxfer 指定DMAチャネルを有効としDMA転送を開始する
《書式》
  DmaTxferRes DmaChnStartTxfer(int chn, DmaWaitMode wMode,
                       unsigned long retries);
   chn   :DMAチャネル番号
   wMode :ウェイトモードの指定
         DMA_WAIT_NOT   :直ぐ戻る
         DMA_WAIT_CELL  :1転送単位ごとに戻る
         DMA_WAIT_BLOCK :全転送完了後に戻る
   retries :再送回数指定(0は無制限)
   戻り値 :転送エラー状況を返す
         DMA_TXFER_OK  :正常完了
         DMA_TXFER_ADD_ERR :アドレスエラー発生
         DMA_TXFER_ABORT  :転送が中止された
         DMA_TXFER_BC_ERR  :ブロック終了がセットされなかった
         DMA_TXFER_TMO    :タイムアウト発生
《使用例》
  DmaTxferRes = DmaChnStartTxfer(3, DMA_WAIT_BLOCK, 0);
DmaChnAbortTxfer 指定チャネルのDMA転送を強制中止する
《書式》
  void DmaChnAbortTxfer(int chn);
DmaChnSetEvEnableFlags
DmaChnClrEvEnableFlags
DmaChnWriteEvEnableFlags
DmaChnGetEvEnableFlags
DmaChnClrEvFlags
DmaChnGetEvFlags

指定DMAチャネルのイベントフラグを制御する 複数イベントの指定可能
《書式》
  void DmaChnSetEvEnableFlags(int chn, DmaEvFlags eFlags);
    chn   :DMAチャネル番号
    eFlags :下記から指定(OR可能)
      DMA_EV_ERR   :アドレスエラーイベント
      DMA_EV_ABORT :転送中止イベント
      DMA_EV_CELL_DONE :1単位転送終了イベント
      DMA_EV_BLOCK_DONE :1ブロック転送終了イベント
      DMA_EV_DST_HALF  :転送先が半分終了したイベント
      DMA_EV_DST_FULL  :転送先バッファ一杯イベント
      DMA_EV_SRC_HALF  :転送元半分終了イベント
      DMA_EV_SRC_FULL  :転送元全部終了イベント
      DMA_EV_ALL_EVNTS :全イベント
《使用例》
  DmaChnSetEvEnableFlags(3, DMA_EV_ERR | DMA_EV_ABORT);  
DmaChnIntEnable
DmaChnIntDisable
mDmaChnIntEbanle
mDmaChnIntDisable
指定DMAチャネルの割り込みを有効化、無効化する関数、マクロ命令
《書式》
   void DmaChnIntEnbale(int chn);
《使用例》
   mDmaChnIntDisable(3);

【高位レベルの補助関数】

DMAを使った高速データ転送を行うために用意された関数があります。
文字列や大量のデータを高速で転送するのに役立ちます。

関数名 機能内容
DmaChnMemcpy メモリブロックを転送元から転送先へDMAでコピーする
《書式》
  DmaTxferRes DmaChnMemcpy(void* s1, const void* s2, int n,
                      int chn, DmaChnnelPri chPri);
   s1  :転送先のポインタ
   s2  :転送元のポインタ
   n   :転送バイト数
   chn :DMAチャネル番号
   chPri:DMA優先順位(0〜3)
   戻り値 :下記のいずれか
      DMA_TXFER_OK  :正常完了
      DMA_TXFER_ADD_ERR :アドレスエラー発生
      DMA_TXFER_ABORT  :転送が中止された
      DMA_TXFER_BC_ERR  :ブロック終了がセットされなかった
      DMA_TXFER_TMO    :タイムアウト発生
《使用例》
  DmaChnMemcpy(srcBuf, dstBuf, sizeof(dstBuf), 0, DMA_CHN_PRI3);
DmaChnStrcpy 転送元の文字列を転送先へDMAでコピーする
《書式》
  DmaTxferRes DmaChnStrcpy(void* s1, const void* s2,
                    int chn, DmaChnnelPri chPri);
   s1  :転送先のポインタ
   s2  :転送元のポインタ
   chn :DMAチャネル番号
   chPri:DMA優先順位(0〜3)
   戻り値 :下記のいずれか
      DMA_TXFER_OK  :正常完了
      DMA_TXFER_ADD_ERR :アドレスエラー発生
      DMA_TXFER_ABORT  :転送が中止された
      DMA_TXFER_BC_ERR  :ブロック終了がセットされなかった
      DMA_TXFER_TMO    :タイムアウト発生
《使用例》
  DmaChnStrcpy(str1, str2, 0, DMA_CHN_PRI3);  


【低位レベルDMA制御関数一覧】

低位レベルとして用意されているDMA制御関数の内主なものには
下記の関数およびマクロ命令があります。

関数、マクロ名 機能内容
DmaChnSetEventControl 指定DMAチャネル転送を開始、停止するトリガイベントの設定
《書式》
   void DmaChnSetEventControl(int chn, DmaEvCtrlFlags dmaEvCtrl);
     chn      :DMAチャネル番号
     dmaEvCtrl :DMAイベント指定 下記で指定
        DMA_EV_ABORT_IRQ_EN :IRQで中止
        DMA_EV_START_IRQ_EN :IRQでDMA開始
        DMA_EV_MATCH_EN   :パターン一致で中止
        DMA_EV_START_IRQ(irq) :DMAを開始するIRQ番号指定
        DMA_EV_ABORT_IRQ(irq) :DMAを中止するIRQ番号指定
《使用例》
  DmaChnSetEventControl(3, DMA_EV_START_IRQ(_UART2_RX_IRQ));


【使用例】

DMAを実際に使用したプログラム例です。
DMAでRAMにあるデータをポートに直接出力するプログラムです。
LED_pattern[]という変数に8ビットのデータ配列を用意しておき、その中の
データを順番にLATAに出力します。
出力トリガをタイマ23のタイムアップIRQとしていますので、タイマ23の一定
周期でLATAにデータ出力されます。データ出力は自動的に繰り返されますので
一定のパターンの繰り返しで出力されます。







目次に戻る