開始メモリ アドレスとワード カウントが与えられると、CPU が他のプロセスで動作している間に DMA コントローラがデータを転送します。入出力プロセッサも、開始アドレスとワード数が指定された I/O プロセスを処理します.. (間違っている場合は訂正してください)
では、IOP と DMA コントローラの機能の違いは何ですか?
DMA は、CPU の処理時間を消費することなく、ペリフェラルとメモリ (UART、SPI、DAC、ADC) または 2 つの異なるメモリ アドレス間でデータを転送できるハードウェア モジュールです。一般に、DMA モジュールの構成には、メモリ宛先アドレスとソース アドレスの設定が含まれます。また、ユーザーは、バッファ データ サイズ、自動アドレス インクリメント、循環バッファなどのオプションを構成することもできます。さらに、これらの種類のモジュールは、データ転送の最後に IRQ 信号を送信します。
マイクロコントローラ STM32F373 の DMA 構成例を以下に示します。この例は、シグマデルタ ADC とメモリ バッファ間の DMA 構成を示しています。
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
DMA_DeInit(DMA2_Channel3);
/* DISABLE the DMA SDADC1 channel */
DMA_Cmd(DMA2_Channel3, DISABLE);
/* DMA channel SDADC1 Configuration */
DMA_InitStructure.DMA_BufferSize = bufferSize;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SDADC1->JDATAR;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)memoryAddress;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
/* Avoid interrupt on DMA ENABLE */
DMA_ClearITPendingBit(DMA2_FLAG_TC3);
// Enable DMA2 Channel Transfer Complete interrupt
DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);
/* Enable the DMA channel */
DMA_Cmd(DMA2_Channel3, ENABLE);
I/O プロセッサについては、何を言っているのかよくわかりませんでした。しかし、GPIO ハードウェア モジュールは一般的なデジタル入力/出力をメモリ アドレスにマップできると言えます。つまり、I/OI/O にはメモリ アドレスがありますが、実際には読み取りおよび書き込み操作はペリフェラル レジスタで行われます。