Столкнулся с такой же проблемой!
Сейчас стоит LPC2468 ‘-’ Initial device revision (но там вроде с DMA ошибок у них не было).
Пробовал для
On-chip RAM 0x7FD00000 - 0x7FD03FFF USB RAM (16 kB) и
Off-Chip Memory 0xA0000000 - 0xAFFFFFFF Dynamic memory bank 0.
Для обоих результат такой-же, как и у
Novichok1 - копируется только первый блок, но память-то я разрешенную для использования DMA использую.
Ели не сложно - взгляните свежим взглядом - где-то я что-то упускаю...
CODE
#define MEMORY_SOURCE 0x7FD00000
#define MEMORY_DESTINATION 0x7FD01000
#define TRANSFER_SIZE 16
int main(void)
{
volatile unsigned int chain_arr[3][4];
unsigned char *temp1_ptr;
unsigned char *temp2_ptr;
unsigned int i;
// set buffers
temp1_ptr = (U8*)MEMORY_SOURCE;
temp2_ptr = (U8*)MEMORY_DESTINATION;
for (i = 0; i < 200; ++i)
{
temp1_ptr[i] = i;
temp2_ptr[i] = 0;
}
// set chain list
chain_arr[0][0] = MEMORY_SOURCE;
chain_arr[0][1] = MEMORY_DESTINATION;
chain_arr[0][2] = (unsigned int)&chain_arr[1][0];
chain_arr[0][3] = (TRANSFER_SIZE & 0x0FFF)//set the transfer size
| (1u << 12) //Source burst size
| (1u << 15) //destination burst size
| (0u << 18) //Source width
| (0u << 21) //destination width
| (1u << 26) //Source increment
| (1u << 27) //Destination increment
| (0u << 31); //interrupt
chain_arr[1][0] = MEMORY_SOURCE + 32;
chain_arr[1][1] = MEMORY_DESTINATION + 32;
chain_arr[1][2] = (unsigned int)&chain_arr[2][0];
chain_arr[1][3] = (TRANSFER_SIZE & 0x0FFF)//set the transfer size
| (1u << 12) //Source burst size
| (1u << 15) //destination burst size
| (0u << 18) //Source width
| (0u << 21) //destination width
| (1u << 26) //Source increment
| (1u << 27) //Destination increment
| (0u << 31); //interrupt
chain_arr[2][0] = MEMORY_SOURCE + 64;
chain_arr[2][1] = MEMORY_DESTINATION + 64;
chain_arr[2][2] = 0;
chain_arr[2][3] = (TRANSFER_SIZE & 0x0FFF)//set the transfer size
| (1u << 12) //Source burst size
| (1u << 15) //destination burst size
| (0u << 18) //Source width
| (0u << 21) //destination width
| (1u << 26) //Source increment
| (1u << 27) //Destination increment
| (1u << 31); //interrupt
// enable GPDMA
PCONP |= (0x1<<29); // Power up the GPDMA
GPDMA_CONFIG = 0x01; // Enable the GPDMA
while (!(GPDMA_CONFIG & 0x01)); // Wait until the GPDMA is operational
// configure and start GPDMA
GPDMA_INT_TCCLR = 0x01; // Clear the interrupt status bits
GPDMA_INT_ERR_CLR = 0x01;
GPDMA_CH0_SRC = chain_arr[0][0]; // Load source start address into Channel 0
GPDMA_CH0_DEST = chain_arr[0][1]; // Load destination start address into Channel 0
GPDMA_CH0_CTRL = chain_arr[0][3]; //set the transfer size and settings
GPDMA_CH0_LLI = chain_arr[0][2]; // next item to transfer
GPDMA_CH0_CFG |= 0x08001; // Start the channel transfer
while (!GPDMA_RAW_INT_TCSTAT); //Wait until the transfer has finished
for(;;);
return 0;
}
Список вроде правильный формируется :
Причина редактирования: Уменьшение видимого размера цитаты исходника.