Вот такую функцию исследую, пока не дожусь конца передачи, дальше не иду. (Не показана установка режима работы, и разрешение тактирования, это делается однократно в начальной установке). Тогда все работает. Иначе, если программа пишет туда, откуда читает DMA, появляется прерывание TEIFx Channel x transfer error flag. А прерывания, что дошло до конца, уже нет.
Если все так, то ценность такого DMA уменьшается. Почти то же можно реализовать, как у меня в закомментированном коде.
Код
void ExtDpy2LCD_copy(uint32_t Offset, uint32_t Size)
{
LED_On();
DMA2->IFCR |= DMA_IFCR_CTCIF1;
DMA2_Channel1->CCR &= ~0x00000001; // запретить пересылку
DMA2_Channel1->CPAR = EXTDPY + Offset; // начальный адрес буфера экрана
DMA2_Channel1->CMAR = 0x6c020000 + Offset; // начальный адрес памяти ЖКИ
DMA2_Channel1->CNDTR = Size; // 16-битовые пересылки
DMA2_Channel1->CCR |= 0x00000001; // разрешить пересылку
while (!(DMA2->ISR & DMA_ISR_TCIF1));
LED_Off();
/*
uint16_t *pSour = (uint16_t *)(EXTDPY + Offset);
uint16_t *pDist = (uint16_t *)(0x6c020000 + Offset);
LED_On();
for (uint32_t i=Size; i--; ) {
*pDist++ = *pSour++;
}
LED_Off();
*/
}
{
LED_On();
DMA2->IFCR |= DMA_IFCR_CTCIF1;
DMA2_Channel1->CCR &= ~0x00000001; // запретить пересылку
DMA2_Channel1->CPAR = EXTDPY + Offset; // начальный адрес буфера экрана
DMA2_Channel1->CMAR = 0x6c020000 + Offset; // начальный адрес памяти ЖКИ
DMA2_Channel1->CNDTR = Size; // 16-битовые пересылки
DMA2_Channel1->CCR |= 0x00000001; // разрешить пересылку
while (!(DMA2->ISR & DMA_ISR_TCIF1));
LED_Off();
/*
uint16_t *pSour = (uint16_t *)(EXTDPY + Offset);
uint16_t *pDist = (uint16_t *)(0x6c020000 + Offset);
LED_On();
for (uint32_t i=Size; i--; ) {
*pDist++ = *pSour++;
}
LED_Off();
*/
}
Еще один факт для размышлений. Измерил осциллографом время работы показанной выше функции. Для Size = 320*240/2.
С DMA имею 20ms, без DMA 21.5ms.
Естественно, польза от DMA будет, если, пока байты перекидываются с места на место, процессор будет занят чем-нибудь другим. Например, принимать данные по другим интерфейсам и складывать во внутреннее ОЗУ. Надеюсь, это не притормозит работу DMA.