Forum: Mikrocontroller und Digitale Elektronik ARM Luminary LM3S811 GPIO Probleme


von Marko B. (Gast)


Lesenswert?

Ich benutze das EV-LM3S811 Board von Luminary zusammen mit dem 
mitgelieferten Keil Compiler. Für den Anfang will ich nur mal die LED 
blinken lassen. Jedoch scheitere ich bereits daran, die LED 
einzuschalten. Ich habe schon alles mögliche probiert. Vielleicht kann 
mir jemand erklären wo mein Fehler liegt. Hier ist mein Code:
1
#include "hw_types.h"
2
#include "hw_memmap.h"
3
#include "gpio.h"
4
#include "sysctl.h"
5
6
/* LED on PC5 */
7
#define USER_LED GPIO_PIN_5
8
9
int main(void)
10
{
11
  /* run at 20MHz using the PLL */
12
  SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_XTAL_6MHZ | SYSCTL_OSC_MAIN);
13
14
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
15
  GPIOPadConfigSet(GPIO_PORTC_BASE, USER_LED, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
16
  GPIODirModeSet(GPIO_PORTC_BASE, USER_LED, GPIO_DIR_MODE_OUT);
17
  GPIOPinWrite(GPIO_PORTC_BASE, USER_LED, 1);
18
19
  for(;;)
20
    ;
21
}

Das komplette Projekt ist im Anhang.

von Marcus (Gast)


Lesenswert?

Wieso sollte die LED denn mit diesem Code blinken? Die Fkt. GPIOPinWrite 
wird nur einmal aufgerufen und dann wird mit 20Mhz nichts mehr getan 
oder hab ich nen Interrupt übersehen?

Marcus

von Marko B. (Gast)


Angehängte Dateien:

Lesenswert?

Natürlich blinkt die LED nicht, sie soll ja erst einmal nur leuchten, 
was sie aber nicht tut.

An so etwas Komplexes wie blinken wage ich mich dann, wenn ich sie zum 
Leuchten gebracht habe. ;-)

Hier ist auch noch der versprochene Anhang ...

von volltroll.de (Gast)


Lesenswert?

Hmm. man sollte das teil wohl doch eher zum "zocken" benutzen ;)
einige haben probleme mit dem oled, andere koennen nicht das 
beispielprogramm einspielen.


ps: dies ging nicht gegen die nutzer, eher gegen das board

von Marko B. (Gast)


Lesenswert?

Interessanterweise funktioniert der Code mit einem anderen PIN, z.B. 
PA0, einwandfrei. Hmmm ...

von B. K. (bekoeppel) Benutzerseite


Lesenswert?

Guten Abend,
ich habe letzte Woche ebenfalls das Eval Kit erhalten. Allerdings habe 
ich folgendes Problem:

wenn ich die Demo-Programme auf den Controller laden will, zeigt uVision 
zwar an, dass die Übertragung erfolgt sei, allerdings wird nachher kein 
Code auf dem Board ausgeführt.

Ich habe keine Ahnung wie ich dieses Problem lösen könnte, da ich noch 
nie mit uVision gearbeitet habe und zur Zeit auch keinen JTAG-Debugger 
zur Hand habe.

Kennt jemand das Problem und kann mir Hilfe leisten?
Vielen Dank
Benedikt Köppel

von Sascha (Gast)


Lesenswert?

Zum Problem mit PC5, siehe errata:

2 GPIO
2.1 GPIO internal pull-up resistor does not pull up to 3.3 V
Description:
Resetting a Stellaris microcontroller causes configurable I/O signals, 
with the exception of the
JTAG port, to be set to the default mode of a GPIO input with a weak 
internal pull-up resistor. The
intent of this weak pull-up (~200k ohm) is to ensure that configurable 
signals are quiescent during
the period between a reset operation and configuration of the 
microcontroller by the user. In
current Stellaris devices, these pull-up resistors are set too high (~2M 
ohm) and do not guarantee
that the inputs will be biased to a logic '1' as intended. As a result, 
it is possible that a non-driven
input pin could float to a mid-level voltage between a logic 0 and 1. 
This may produce unintended
switching of the input resulting in excessive current draw.
Workaround:
An external pull-up resistor should be used if the system design 
requires that a GPIO input be
biased to a logical '1' after a reset. If a pin is unused or there is no 
requirement for the pin to be a
High after reset, software may enable the internal pull-down resistors 
to prevent excess current
draw on the pad. Note that the internal bias resistors are not intended 
to replace external resistors
for open-drain type applications.
Affected:
C0
2.2 PB6, PC5, and PC6 are not 5-V tolerant
Description:
The pins associated with GPIO signals PB6, PC5, and PC6 are not 5-V 
tolerant. Applying a
voltage to any of these pins that is greater than VDD (3.3 V) will have 
undetermined results.
Workaround:
No workaround is available.
Affected:
C0

Sollte also nicht schalten können.

Mfg Sascha

von Marko B. (Gast)


Lesenswert?

Ich habe den Fehler gefunden. Aus irgendeinem Grund habe ich angenommen, 
daß GPIOPinWrite einen Bitwert als Parameter bekommt, es muß aber ein 
char-Wert sein. Mit PA0 hat das dann zufälligerweise funktioniert, weil 
PA0 eben das nullte Bit ist ... argh!

Übrigens funktioniert das ganz komisch: damit jeder Portpin einzeln 
angesprochen werden kann belegt das GPIODATA Register für jeden Port 256 
Adressen. Der Offset wird dann als Bitmaske benutzt um die zu 
modifizierenden Bits auszuwählen.

Hier der funktionierende Code:
1
#include "hw_types.h"
2
#include "hw_memmap.h"
3
#include "gpio.h"
4
#include "sysctl.h"
5
6
/* LED on PC5 */
7
#define USER_LED GPIO_PIN_5
8
9
int main(void)
10
{
11
  unsigned int i;
12
13
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
14
  GPIOPadConfigSet(GPIO_PORTC_BASE, USER_LED, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
15
  GPIODirModeSet(GPIO_PORTC_BASE, USER_LED, GPIO_DIR_MODE_OUT);
16
17
  for(;;) {
18
    GPIOPinWrite(GPIO_PORTC_BASE, USER_LED, 0xff);
19
20
    i = 1<<20;
21
    while(i--);
22
23
    GPIOPinWrite(GPIO_PORTC_BASE, USER_LED, 0);
24
25
    i = 1<<20;
26
    while(i--);
27
  }
28
}

Benedikt K.: das Programm wird ausgeführt, sobald man die Resettaste auf 
dem Board drückt. JTAG ist auf dem Board integriert, um den Debugger zu 
starten schau mal im Menü "Debug" nach. ;-)

Sascha: das mit den Errata hat mich auch stutzig gemacht, aber ich 
dachte mir, wenn die LED im Demoprogramm funktioniert dann muß das doch 
gehen ...

von B. K. (bekoeppel) Benutzerseite


Lesenswert?

Hallo,

ich versuche es mit folgendem Code:
1
#include "hw_memmap.h"
2
#include "hw_types.h"
3
#include "uart.h"
4
5
int main(void) {
6
  int i;
7
  UARTConfigSet(UART0_BASE, 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
8
  for(i=0; i<=255; i++) {
9
    UARTCharPut(UART0_BASE, i);
10
  }
11
}

Theoretisch müsste ich ja so im Hyperterminal eine Ausgabe erhalten. Ich 
habe das Programm kompiliert ("Project"-"Rebuild all target files") und 
dann auf den Chip geladen ("Flash"-"Download"). Das hat geklappt.
Anschliessend Hyperterminal gestartet, Verbindung aufgebaut, Resetknopf 
gedrückt am Eval Kit. Aber es kommt nichts.

Eine Ausgabe auf den Bildschirm gelingt ebenfalls nicht (mit dem 
Demo-Programm hello versucht).

Woran könnte es noch liegen?





Wenn ich auf "Debug"-"Start/Stop Debug Session" gehe, erhalte ich den 
Fehler:
"MISSING DEVICE (R003: SECURITY KEY NOT FOUND)

Running in Eval Mode"

Anschliessend startet die Debug-Umgebung aber auch so passiert nichts 
auf dem Controller (oder ich merke es nicht :D). Mein eigenes Programm 
(s.o.) gibt keine Ausgabe auf den UART0 und das hello-Demo-Programm gibt 
keine Ausgabe auf den OLED.



Freundliche Grüsse
Benedikt Köppel

von Marko B. (Gast)


Lesenswert?

Benedikt: Du hast da noch ein paar Initialisierungen vergessen. 
Folgender Code funktioniert:
1
#include "hw_types.h"
2
#include "hw_memmap.h"
3
#include "gpio.h"
4
#include "uart.h"
5
#include "sysctl.h"
6
7
int main(void)
8
{
9
  unsigned int i;
10
11
  SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
12
13
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
14
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
15
16
  GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
17
18
  UARTConfigSet(UART0_BASE, 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
19
20
  for(;;) {
21
    UARTCharPut(UART0_BASE, 'H');
22
    UARTCharPut(UART0_BASE, 'e');
23
    UARTCharPut(UART0_BASE, 'l');
24
    UARTCharPut(UART0_BASE, 'l');
25
    UARTCharPut(UART0_BASE, 'o');
26
    UARTCharPut(UART0_BASE, '\r');
27
    UARTCharPut(UART0_BASE, '\n');
28
    i = 1<<20;
29
    while(i--);
30
  }
31
}

Lies dir mal den "Stellaris Driver Library User's Guide" durch.

Zum Debugger: setze zuerst mit F9 einen Breakpoint in deinem Programm, 
z.B. in der ersten Zeile von main(). Dann drückst du (im Debugger) Reset 
und anschließend Run. Dann kannst Du mit Einzelschritten weitermachen 
(Step).

von B. K. (bekoeppel) Benutzerseite


Lesenswert?

Hallo

Marko B. Vielen Dank für den korrigierten Code. Das funktioniert so 
wirklich.
Die Demo-App "hello" geht aber immernoch nicht. Ich glaube nicht dass 
das Display defekt ist, aber kann es auch nicht überprüfen. Jedenfalls 
hat es ganz zu Beginn mit dem Spiel das schon auf dem Chip war sehr gut 
funktioniert.

Wo könnte der Fehler noch liegen?

Freundliche Grüsse
Benedikt Köppel

von Marko B. (Gast)


Lesenswert?

Wenn das "hello" Demo nichts anzeigt dann liegt das mit ziemlicher 
Sicherheit am Display. Mein Display hatte auch dauernd Aussetzer bis ich 
die Kontakte nachgelötet habe. Entweder hat es nach dem Reset nichts 
angezeigt oder es fror später im Betrieb ein. Flashe doch nochmal das 
Spiel und teste es ein paar Minuten lang.

von B. K. (bekoeppel) Benutzerseite


Lesenswert?

Hallo Marko B.

woher kriege ich denn das Spiel nochmals? Es ist ja nirgends als 
Demo-App auf der CD, oder habe ich das übersehen?

Freundliche Grüsse
Benedikt Köppel

von Marko B. (Gast)


Lesenswert?

Es ist im Verzeichnis "qs_ev-lm3s811".

von B. K. (bekoeppel) Benutzerseite


Lesenswert?

Hallo,

das Spiel geht einwandfrei. Nachdem ich das Spiel draufgeladen habe und 
dann den Flash mit "Erase" gelöscht habe, kann ich jetzt auch die 
anderen Demo-Apps drauf tun.
Soweit klappts :D

Vielen Dank

Benedikt Köppel

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.