Als LPC-Nutzer ist man auf den Import von Dateien aus anderen Projekten
angewiesen. Dies führt in der Regel zu Fehlermeldungen, weil der Zugriff
auf Register unterschiedlich gehandhabt wird.
Beispiel CodeRed:
Zugriff über LPC17xx.h/CMSIS-Library:
1 | LPC_PINCON_TypeDef LPC_PINCON;
|
2 | // Set P1_24, P1_25, P1_28, P1_29 to 00 - GPIO
|
3 | LPC_PINCON->PINSEL3 &= (~0x0F0F0000);
|
4 | // Set GPIO - P1_24, P1_25, P1_28, P1_29 - to be outputs
|
5 | LPC_GPIO1->FIODIR |= ((1 << 24) | (1 << 25) | (1 << 28)| (1 << 29))
|
6 | }
|
Beispiel Keil:
Zugriff erfolgt über Strukturen, die in diversen Dateinen abgelegt sind,
z.B. lpc17xx_pinsel.h,lpc17xx_gpio
1 | PINSEL_CFG_Type PinCfg;
|
2 |
|
3 | PinCfg.Funcnum = 0;
|
4 | PinCfg.OpenDrain = 0;
|
5 | PinCfg.Pinmode = 0;
|
6 | PinCfg.Portnum = 3;
|
7 | PinCfg.Pinnum = 25;
|
8 | PINSEL_ConfigPin(&PinCfg);
|
9 | PinCfg.Pinnum = 26;
|
10 | PINSEL_ConfigPin(&PinCfg);
|
11 | GPIO_SetDir(3, (1<<25) | (1<<26), 1);
|
Bei Fehlermeldungen wegen Registerzugriffs müssen die Entsprechenden
Bibliotheken eingebunden oder der Code geändert werden. Ich bevorzuge
den Registerzugriff über LPC176x.h, weil die dort definierten
Registernamen den Bezeichnungen im Handbuch entsprechen. Ein Blick ins
Manual und man weiß, welche Funktion Registernamen verkörpern:
1 | // Set P1_24, P1_25, P1_28, P1_29 to 00 - GPIO
|
2 | PINSEL3 &= (~0x0F0F0000);
|
3 | // Set GPIO - P1_24, P1_25, P1_28, P1_29 - to be outputs
|
4 | FIO1DIR |= ((1 << 24) | (1 << 25) | (1 << 28)| (1 << 29))
|
Dass Pinsel3 für Port1 zuständig ist, liegt daran dass jeder Pin über
4Bit beschrieben wird und demzufolge für 32Pins insgesamt 4
32Bit-Register erforderlich sind. Übersichtlicher wird es mit Macros:
1 | #define pinSEL(p,b,v) PINSEL[(p) * 2 + (b) / 16] = (PINSEL[(p) * 2 + (b) / 16] & ~(3 << ((b) * 2 % 32))) | (v << ((b) * 2 % 32))
|
Damit werden die Register über
pinSEL(PortNr,PinNr,Funktionsnummer)aufgerufen, ohne dass man
rückrechnen muss, welches Pinsel-Register dem Pin zugerdnet ist.
LPC176x.h enthält Fehler. Das Register CCR ist doppelt definiert und
kann daher bei der RTC nicht funktionieren. RxFliterCtrl müsste wohl
richtig RxFilterCtrl heißen. Das führt bei Anpassung von
importiertem Code zu Fehlermeldungen.