Moin Moin liebe µC-Community,
ich habe mal wieder ein paar Probleme mit meinem LPC1837. Ich wollte
mich mal mit der DMA Geschichte auseinander setzen weil ich den ja
offensichtlich für meinen integrierten Ethernet-Controller brauche.
Daher wollte ich mal ein kleines Programm schreiben und einfach nur
versuch via DMA-Controller (bei mir heist das Ding General Purpose DMA)
ein 32bit wort in einen register GPIO Register zu schreiben, die dann -
ihr ahnt es sicherlich schon - eine LED zum leuchten bringen soll.
Kleine Anmerkung und Auszug aus dem Datenblatt: "The GPIO block, the
WWDT, and the Timers can be accessed by the GPDMA as memory-to-memory
transfers."
Leider passiert bei mir genau garnix. Die Register werden alle
beschrieben. Aber nachdem Channel-enable hat sich im GPIO Register
absolut nix getan!
Hier ist mein Quelltext:
1 | #include "chip.h"
|
2 | #include <cr_section_macros.h>
|
3 |
|
4 | static uint32_t source, dest;
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | volatile static int i = 0 ;
|
9 | source=0xFFFFFFFF; //probier-daten
|
10 | dest=(uint32_t)&LPC_GPIO_PORT->SET[0]; //mein Kopierziel
|
11 |
|
12 | LPC_SCU->SFSP[1][0]=0b00010000;
|
13 | LPC_GPIO_PORT->DIR[0]=0xFFFFFFFF; //PORT auf output gesetzt
|
14 |
|
15 | LPC_GPDMA->CONFIG=0x1; //
|
16 |
|
17 | LPC_GPDMA->CH[0].SRCADDR=(uint32_t)&source; //Setze die Source Address auf meine "source" variable
|
18 | LPC_GPDMA->CH[0].DESTADDR=dest; //Setze die Dest Address auf "DIR[0]" register
|
19 |
|
20 | #define TRANSFERSIZE 0x004 /*4 byte sollen übertragen werden*/
|
21 | #define SBSIZE 0x4 /*Sicherheitshalber auf 4 bytes gesetzt*/
|
22 | #define DBSIZE 0x4
|
23 | #define SWIDTH 0x2 /*Ein 32bit word soll übertragen werden*/
|
24 | #define DWIDTH 0x2 /*Ein 32bit word soll übertragen werden*/
|
25 | #define S 0x0 /*AHB-Master ausgewäht, da M2M Transfer*/
|
26 | #define D 0x0 /*AHB-Master ausgewäht, da M2M Transfer*/
|
27 | #define SI 0x0 /*not incremented*/
|
28 | #define DI 0x0 /*not incremented*/
|
29 | #define PROT1 0x0 /*usermode*/
|
30 | #define PROT2 0x0 /*not bufferable*/
|
31 | #define PROT3 0x0 /*not cacheable*/
|
32 |
|
33 | LPC_GPDMA->CH[0].CONTROL= TRANSFERSIZE + SBSIZE + DBSIZE + SWIDTH + DWIDTH + S + D + SI + DI + PROT1 + PROT2 + PROT3;
|
34 | LPC_GPDMA->CH[0].CONFIG=0x1;
|
35 |
|
36 | //infinite loop
|
37 | while(1){
|
38 | i++ ;
|
39 | }
|
40 | return 0 ;
|
41 | }
|
Wenn ihr mir dabei weiterhelfen könntet dann wäre das absolut der
Oberknaller!