Forum: Mikrocontroller und Digitale Elektronik LPC11U35 GPIOs


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Andreas B. (bitverdreher)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Vielleicht solltest du den Chip auch mal richtig initialisieren, so GPIO 
clocks usw.

von Andreas B. (bitverdreher)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht lesenswert
Sind das die I2C Pins? Die sind anders als die anderen.

von Andreas B. (bitverdreher)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Andreas B. (bitverdreher)


Bewertung
0 lesenswert
nicht 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;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.