Я думал над этим, но поток нельзя сбросить отдельно, только с контроллером ПДП. Первая и повторная инициализация выполняется одной и той же функцией /* подадим такт на контроллер ПДП2 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
/* запретим работу ПДП */
DMA_Cmd (DMA2_Stream3, DISABLE); /* сначала запретим запись(!!!!) */
while(DMA_GetCmdStatus(DMA2_Stream3) != DISABLE);
DMA_Cmd (DMA2_Stream2, DISABLE);
while(DMA_GetCmdStatus(DMA2_Stream2) != DISABLE);
/* заполняем структуру ПДП по умолчанию */
DMA_StructInit(&DMA_InitStruct);
DMA_InitStruct.DMA_Channel = DMA_Channel_3; /* канал */
DMA_InitStruct.DMA_BufferSize = 4; /* указываем число пересылаемых данных */
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /* инкрементальный адрес перефирии */
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; /* размерность - слово 32 бита */
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /* обмен 8 бит */
DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; /* однократный режим */
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; /* счетчик данных увеличивается */
DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t) &SPI1->DR;
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t) &MPUbuffer; /* задаем адрес источника данных */
/* применяем структуру для чтения */
DMA_InitStruct.DMA_Priority = DMA_Priority_VeryHigh; /* приоретет чтения высокий */
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory; /* порт - источник */
DMA_Init(DMA2_Stream2, &DMA_InitStruct);
/* применяем структуру для записи */
DMA_InitStruct.DMA_Priority = DMA_Priority_High; /* приоретет записи средний */
DMA_InitStruct.DMA_DIR = DMA_DIR_MemoryToPeripheral; /* порт - приемник */
DMA_Init(DMA2_Stream3, &DMA_InitStruct);