Прямой доступ к памяти

Запросы DMA1 для каждого канала
Периферийное
устройство
Канал 1Канал 2Канал 3Канал 4Канал 5Канал 6Канал 7
ADC1ADC1
SPI/I2SSPI1_RXSPI1_TXSPI/I2S2_RXSPI/I2S2_TX
USARTUSART3_TXUSART3_RXUSART1_TXUSART1_RXUSART2_RXUSART2_TX
I2CI2C2_TXI2C2_RXI2C1_TXI2C1_RX
TIM1TIM1_CH1TIM1_CH2TIM1_CH4
TIM1_TRIG
TIM1_COM
TIM1_UPTIM1_CH3
TIM2TIM2_CH1TIM2_UPTIM2_CH1TIM2_CH2
TIM2_CH4
TIM3TIM3_CH3TIM3_CH4
TIM3_UP
TIM3_CH1
TIM3_TRIG
TIM4TIM4_CH1TIM4_CH2TIM4_CH3TIM4_UP
Запросы DMA2 для каждого канала
Периферийное
устройство
Канал 1Канал 2Канал 3Канал 4Канал 5
ADC3ADC3
SPI/I2S3SPI/I2S3_RXSPI/I2S3_TX
UART4UART4_RXUART4_TX
SDIOSDIO
TIM5TIM5_CH4
TIM5_TRIG
TIM5_CH3
TIM5_UP
TIM5_CH2TIM5_CH1
TIM6/DAC_Channel1TIM6_UP/DAC_Channel1
TIM7/DAC_Channel2TIM7_UP/DAC_Channel2
TIM8TIM8_CH3
TIM8_UP
TIM8_CH4
TIM8_TIG
TIM8_COM
TIM8_CH1TIM8_CH2
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//разрешаем тактирование DMA1
DMA_InitTypeDef  DMA_InitStructure;			//создаем структуру DMA
DMA_DeInit(DMA1_Channel1);				//сбрасываем канал DMA1 в исходное состояние
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;		//канал будет использоваться в режиме memory to memory
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;		//установим нормальный режим (не циклический/кольцевой)
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;	//средний приоритет
//размер данных источника и цели - слово=32bit
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
//разрешаем автоматический инкремент памяти - цель и источник
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;	//назначаем область памяти, связанную с регистром периферии источником
DMA_InitStructure.DMA_BufferSize = ARRAYSIZE;		//chunk of data to be transfered
//стартовые адреса источника и цели
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)source;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)destination;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);		//загрузка значений в регистры DMA
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);		// Enable DMA1 Channel Transfer Complete interrupt
И не забываем о запуске передачи - с помощью инструкции DMA_Cmd(DMA1_Channel1, ENABLE);
Использование DMA для пересылки графической информации на дисплей (на базе примера с сайта microtechnics.ru):
DMA_InitTypeDef dma;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);		// включаем тактирование первого контроллера ПДП

DMA_StructInit(&dma); dma.DMA_PeripheralBaseAddr = (uint32_t)&(????); // адрес регистра граф.памяти контроллера дисплея dma.DMA_MemoryBaseAddr = (uint32_t)&dataBuffer[0]; // адрес буфера-источника dma.DMA_DIR = DMA_DIR_PeripheralDST; // пересылаем данные из памяти в периферию dma.DMA_BufferSize = DMA_BUFFER_SIZE; // размер буфера (в циклах передачи) dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // данные поступают в регистр, поэтому выключаем приращение адреса dma.DMA_MemoryInc = DMA_MemoryInc_Enable; // данные берутся из массива в памяти - инкремент нужен dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // один пиксель - два байта (полуслово) dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // один пиксель - два байта (полуслово) DMA_Init(DMA1_Channel1, &dma); // настраиваем канал ПДП

С сайтов:
О программировании ПДП
Основы ПДП
Примеры программирования ПДП, в т.ч. к памяти LCD
Обсуждение программирования ПДП для рисования на LCD