Forum: Mikrocontroller und Digitale Elektronik LPC11U35 GPIOs


von Andreas B. (bitverdreher)


Angehängte Dateien:

Lesenswert?

Hallo,
gerade bin ich wieder mal am Spielen mit dem LPC11U35 (Eval Board wie 
Embedded Artist) . Mit folgenden einfachen Programm weise ich jetzt 
nach, daß manche GPIOs nicht auf Ausgang geschaltet werden können:
1
/*
2
===============================================================================
3
 Name        : testgpio.c
4
 Author      : $(author)
5
 Version     :
6
 Copyright   : $(copyright)
7
 Description : main definition
8
===============================================================================
9
*/
10
11
#include "chip.h"
12
int i;
13
14
int main(void) {
15
    SystemCoreClockUpdate();
16
17
    // TODO: insert code here
18
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 22); // toggle in ADC IRQ ok
19
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 11); // toggle in ADC IRQ
20
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 12); // toggle in ADC IRQ
21
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 13); // toggle in ADC IRQ
22
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 14); // toggle in ADC IRQ
23
//    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 15); // toggle in ADC IRQ SWDIO
24
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 16); // toggle in ADC IRQ ok
25
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 23); // toggle in ADC IRQ ok
26
27
    // Enter an infinite loop
28
    while(1) {
29
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 22, false);
30
      for (i=0; i<100000; i++){};
31
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 11, false);
32
      for (i=0; i<100000; i++){};
33
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 12, false);
34
      for (i=0; i<100000; i++){};
35
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 13, false);
36
      for (i=0; i<100000; i++){};
37
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 14, false);
38
      for (i=0; i<100000; i++){};
39
//      Chip_GPIO_SetPinState(LPC_GPIO, 0, 15, false);
40
//      for (i=0; i<100000; i++){};
41
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 16, false);
42
      for (i=0; i<100000; i++){};
43
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 23, false);
44
      for (i=0; i<100000; i++){};
45
46
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 22, true);
47
      for (i=0; i<100000; i++){};
48
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 11, true);
49
      for (i=0; i<100000; i++){};
50
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 12, true);
51
      for (i=0; i<100000; i++){};
52
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 13, true);
53
      for (i=0; i<100000; i++){};
54
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 14, true);
55
      for (i=0; i<100000; i++){};
56
//      Chip_GPIO_SetPinState(LPC_GPIO, 0, 15, true);
57
//      for (i=0; i<100000; i++){};
58
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 16, true);
59
      for (i=0; i<100000; i++){};
60
      Chip_GPIO_SetPinState(LPC_GPIO, 0, 23, true);
61
      for (i=0; i<100000; i++){};
62
    }
63
    return 0 ;
64
}
Es funktionieren lediglich GPIO 0-22, 0-16 und 0-23.
GPIO0-15 ist mal ausgeklammert, weil dieser für den SWDIO des BMP 
Adapters zur Programmierung verwendet wird.
Die kompletten Standard LPCopen Libs sind angehängt.
Mache ich hier einen Denkfehler oder ist der uC einfach nur defekt?

: Bearbeitet durch User
von Gaehn... (Gast)


Lesenswert?

Vielleicht solltest du den Chip auch mal richtig initialisieren, so GPIO 
clocks usw.

von Andreas B. (bitverdreher)


Angehängte Dateien:

Lesenswert?

Stimmt, sorry! Da habe ich etwas zu viel reduziert.
Mit Clock kommt GPIO 0-11 dazu. Ich habe jetzt die board lib wieder 
eingebunden. Dort wird, wie ich das sehe, der komplette GPIO 0 
initialisiert.
Jetzt ist also board.h statt chip.h eingebunden. Die drei GIO0 12,13,14 
fehlen immer noch.

von Johannes S. (Gast)


Lesenswert?

Sind das die I2C Pins? Die sind anders als die anderen.

von Andreas B. (bitverdreher)


Angehängte Dateien:

Lesenswert?

Nein, das sind alles die ADC Pins. Anbei noch die Belegung des Boards.
Zur Ergänzung, damit es klar ist. Im Main wird jetzt zuerst:
    Board_Init();
    Board_LED_Set(true);
aufgerufen.
Ich bin darauf gekommen, weil ich GPIO 0-12 als Ausgang schalten wollte 
und es nicht funktioniert hatte.
Der Schaltplan ist hier:
https://www.embeddedartists.com/products/lpc11u35-quickstart/
Die Pins sind alle frei.

: Bearbeitet durch User
von Johannes S. (Gast)


Lesenswert?

P0.11 ... P0.14 sind als default JTAG Funktionen, die müssen erst auf 
GPIO umgestellt werden. Habe den Code jetzt nicht durchgesehen, wird das 
gemacht?

von A. B. (Gast)


Lesenswert?

Die Pins 0-10 bis 0-15 sind für JTAG- bzw. SWD-Interface, und die sind 
nach Reset halt auf diese Sonderfunktion eingestellt. Im RM 7.4.11 bis 
7.4.16.
Einfach mal in den Registern nachsehen, was tatsächlich drin steht ...

von Andreas B. (bitverdreher)


Lesenswert?

A. B. schrieb:
> Einfach mal in den Registern nachsehen, was tatsächlich drin steht ...

Ich habe es gerade mal überflogen. Das wird das Problem wohl sein. Ich 
werde mit das Kapitel mal durchsehen.

Johannes, A.B.
Danke für die Tips!

von Johannes S. (Gast)


Lesenswert?

man erkennt es auch an den Namen: die erstgenannte Funktion ist default 
nach Reset, dann kommen die Alternativen Funktionen.
Oder in der Tabelle 3 im User Manual.

von Andreas B. (bitverdreher)


Lesenswert?

Es hat soweit geklappt. Eingefügt wurde:
    LPC_IOCON->PIO0[12] = 0x01;
    LPC_IOCON->PIO0[13] = 0x01;
    LPC_IOCON->PIO0[14] = 0x01;

Ich hätte ja auch selbst drauf kommen können. Bei den AVRs ist JTAG ja 
auch per default aktiviert.

Die LPCOpen lib ist wirklich halbgar gekocht. Den LPC_IOCON_T typ hätte 
man ruhig etwas ausführlicher definieren können.
typedef struct {            /*!< LPC11AXX/LPC11UXX/LPC11EXX IOCON 
Structure */
  __IO uint32_t  PIO0[24];
  __IO uint32_t  PIO1[32];
} LPC_IOCON_T;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.