Witam, zacząłem ostatnio zabawę z arm'ami a dokładniej z procesorem lpc1768, przeczytałem już trochę dokumentacji jednak niektóre aspekty są dla mnie niejasne i byłbym wdzięczny gdyby ktoś obyty z tematem wytłumaczył mi co nieco, ale do rzeczy, na stronie http://msys-mv.blogspot.com/2011/01/dma-in-lpc17xx.html znalazłem fajny opis dotyczący wysyłania danych na port z wykorzystaniem układu dma i timera, program wygląda tak:
LPC_SC->PCONP |= 1 << 2; // włączenie timera
LPC_SC->PCLKSEL0 |= 0x01 << 4; // ustawienie zegara dla timera
LPC_TIM1->MR0 = 1 << 25; // ustawienie wartości do której timer ma zliczać
LPC_TIM1->MCR = 1 << 1; // zresetuj timer gdy timer doliczy do wartości zapisanej w rejestrze MR0
póki co wszystko jasne, teraz ta gorsza część
LPC_SC->PCONP |= 1 << 29; //podłączenie układu dma do zasilania
LPC_GPDMA->DMACConfig |= 1 << 0; //włączenie dma
LPC_GPDMA->DMACSync |= 1 << 10; //pierwsza niejasność
LPC_SC->DMAREQSEL |= 1 << 2; // w momencie dopasowania wartości timera do wartości zapisanej w MR0 wysyłane jest żądanie transmisji do układu dma
LPC_GPDMA->DMACIntErrClr |= 0xff; // wyzerowanie flag błędów przerwań
LPC_GPDMA->DMACIntTCClear |= 0xff; // wyzerowanie flag przerwań
LPC_GPDMACH0->DMACCDestAddr = (uint32_t) &(LPC_GPIO1->FIOPIN3); // ustawienie portu jako adres źródłowy dla układu dma
LPC_GPDMACH0->DMACCSrcAddr = (uint32_t) &data[0]; // ustawienie pierwszego elementu tablicy data jako adres źródłowy dla układu dma
LPC_GPDMACH0->DMACCLLI = 0; // LLI nie wykorzystywane tutaj
LPC_GPDMACH0->DMACCControl = 200 | ( 1 << 26 ); // 200 - ilość bajtów do przesłania, 1<<26 inkrementuj adres źródłowy
LPC_GPDMACH0->DMACCConfig = ( 10 << 6 ) | ( 1 << 11); // druga niejaność, 1<<11 - typ transferu (mem2per)
LPC_GPDMACH0->DMACCConfig |= 1; //włączenie kamału dma
i teraz mam pytanie dotyczące tych dwóch niejasności czyli
a)
LPC_GPDMA->DMACSync |= 1 << 10;
w dokumentacji można przeczytać:
czyli jak mniemam zapisanie 1 do rejestru DMACSync wyłącza logikę synchronizacji na konkretne żądania (tutaj na żądanie timera 1) (?) dlaczego akurat w tym przypadku jest to wyłączane??
oraz
b)
LPC_GPDMACH0->DMACCConfig = ( 10 << 6 )
w dokumentacji odnośnie tych bitów jest napisane: