И так.
С флагом dma_m2m понятно. Он здесь не нужен.
Повторю.
Задача прямо с флешки с помощью дма заливать данные на lcd, который подключен к fsmc.
По отдельности все работает. Т.е. нормально считывается с флешки в буфер озу (используется dma2 channel4). Буфер озу успешно заливается в lcd (используется dma 1 channel3). Здесь никаких проблем не возникает. Но как только при конфигурировании дма2 вместо адреса озу задаю адрес lcd, цикл dma завершается? (виснет канал?) после примерно 50 транзакций, хотя задается 256 и больше. Все убирал из программы, оставлял только функции работы с флешкой и лсд - все равно дма отрабатывает только 50 транзакций. А вообще-то я использую канал 5 второго дма, на этот канал этот завис не отражается. Завис, это образно, я не знаю, что происходит с каналом, но цикл полностью не выполняется и флаг завершения обмена не выставляется.
Код функции запуска транзакций:
Код
static void DMA_lcd(u32 *BufferDST, u32 BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4);
/* DMA2 Channel4 disable */
DMA_Cmd(DMA2_Channel4, DISABLE);
/* DMA2 Channel4 Config */
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SDIO_FIFO_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)BufferDST;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel4, &DMA_InitStructure);
DMA_Cmd(DMA2_Channel4, ENABLE);
}