プライマー
上記の例では、シリアルポートは、我々は、シリアルポートを介してCPUの各文字を送信する必要性を文字列を送信する場合は、全体のデータ転送処理はCPUの関与を必要と見ることができます。場合は、大量のデータを想像してみて、その後、CPUがビジー状態のデータの時間伝送のほとんどは、しかし、我々はそれを行うには良い方法はありませんデータの転送、CPUは他のもっと重要なことを行うことができることを望みますか?
DMAコントローラとして知られているCPUの機能の関与なしメモリ及び周辺装置またはメモリとメモリとの間で直接データ転送を実現することができるDMA(ダイレクトメモリアクセス)があります。
我々はDMAをデザインするのであれば、あなたはそうすることができます。ビッグブラザーは、CPUの出荷(データが)あなたは宅配便(DMA弟)を募集することができ、上海に杭州から輸送する必要があるとすると、彼は商品の複数のバッチが存在する場合に輸送する必要がある、配送先住所、配送先住所、貨物の大きさや緊急性を語りました別の都市に、それはいくつかのストロークの宅配便よりも多い、と宅配会社の管理を設定します。
上記の例では、宅配会社のDMAコントローラとして見ることができる、DMAチャネルは宅配便、配送先住所データ宛先アドレスとみなすことができ、配送先住所は、データの送信元アドレスであり、データサイズが貨物の長さであり、緊急ですソフトウェア優先宅配便の数は、ハードウェアの優先順位です。
DMAのGD32管理
DMAは、彼らが独自のデザインであり、コアのCortex-M3の一部ではありません。、GD32 MDA1チャネル支持体7、共通システムバスとCPUは、従って、示され、競合CPUの存在は、CPUバス調停偏心比較し、少なくとも半分保証CPUバス帯域幅である。ように
DMAの設定手順:
1. 配置外设地址
2. 配置存储器地址
3. 配置传输数据总数
4. 配置软件优先级,传输方向,模式类型,数据尺寸和中断类型
5. 使能DMA
これらの構成は、ほとんどの庭で引用記載されている、理解することは難しいことではありませんが、次の焦点、優先度、タイプ、およびモードの割り込みタイプと
優先度:
-
優先順位2つのレベルの優先順位のソフトウェアとハードウェアの優先順位。ソフトウェアは、ハードウェアの優先順位よりも高い優先度です。
- ソフトウェアは、4つの優先レベルに分かれています
- 以下に示すように、ハードウェアの優先順位が固定され、チャンネル番号、優先順位の高いチャンネル番号です。
モードの種類:
ループモードと通常モード
割り込みタイプ:
各チャネルは、専用の割り込み、割り込みイベントのみ3を持っています転送は、半分と伝送エラーの完了完了です。以下では、
コードの設定
static VOID UART1_DmaRxConfig(IN U8 *buf, IN U32 len)
{
DMA_InitPara DMA_InitStructure;
DMA_Enable(DMA1_CHANNEL5, DISABLE);
/* USART1 RX DMA1 Channel (triggered by USART1 Rx event) Config */
DMA_DeInit(DMA1_CHANNEL5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (U32) &(USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (U32)buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC;
DMA_InitStructure.DMA_BufferSize = len;
DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_BYTE;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORYDATASIZE_BYTE;
DMA_InitStructure.DMA_Mode = DMA_MODE_NORMAL;
DMA_InitStructure.DMA_Priority = DMA_PRIORITY_VERYHIGH;
DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
DMA_Init(DMA1_CHANNEL5, &DMA_InitStructure);
DMA_Enable(DMA1_CHANNEL5, ENABLE);
}