Hallo zusammen Ich arbeite derzeit mit dem LPCXpresso. Als Device verwende ich einen LPC1343. Nun ist mir eine Frage bezüglich der GPIO Ports aufgekommen: Was ist der Unterschied/Vorteile von Masked Access beim GPIO Data Register im gegensatz zum direkten Zugriff auf dieses Register? Zur verdeutlichung mal ein Codebeispiel
1 | #include "gpio.h" |
2 | |
3 | int main(void) { |
4 | |
5 | GPIOInit(); //Initialisiere GPIO Ports |
6 | |
7 | LPC_GPIO0->DIR |= (1<<7); //Setze P0_7 auf Output |
8 | |
9 | LPC_GPIO0->DATA &= ~(1<<7); //Setze P0_7 auf 0 |
10 | LPC_GPIO0->DATA |= (1<<7); //Setze P0_7 auf 1 |
11 | |
12 | |
13 | /*
|
14 | LPC_GPIO0->MASKED_ACCESS[(1<<7)] = (1<<7); //Setze P0_7 auf 1
|
15 | LPC_GPIO0->MASKED_ACCESS[(1<<7)] = (0<<7); //Setze P0_7 auf 0
|
16 | */
|
17 | |
18 | // Enter an infinite loop, just incrementing a counter
|
19 | volatile static int i = 0 ; |
20 | while(1) { |
21 | i++ ; |
22 | }
|
23 | return 0 ; |
24 | }
|
Die ausgeklammerte Variante ist der Zugriff via Masked Access. Beide Codevarianten funktionieren. Zur vollständigkeit halber habe ich auch mal den Abschnitt aus dem Datenblatt mit Masked Access als png angehängt. Ich habe das mit dem Masked Access wie folgt verstanden: Wenn das Adress Bit auf 1 steht wird das zugehörige Bit im Dataregister aktualisiert. Wenn das Adressbit auf 0 steht wird es nicht angefasst und bleibt auf dem alten Wert. Dies erreiche ich aber auch durch die Bit Operationen wie man sie vom AVR gewohnt ist. Der einzige Unterschied der mir aufgefallen ist, das Masked Access weniger Code benötigt (Kein ODER oder UND Befehl notwendig und weniger MOV). Gibt es sonst noch Unterschiede die mir jetzt so nicht klar geworden sind?