【概要】
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にデータ出力されます。データ出力は自動的に繰り返されますので
一定のパターンの繰り返しで出力されます。
目次に戻る