Forum: Mikrocontroller und Digitale Elektronik Stallaris Prozessor LM3S9B96 mit GCC und GDB


von Jan (Gast)


Lesenswert?

Hallo Zusammen,
ich bin grad dabei, mein Stellaris Evalboard (EK-LM3S9B96) mit dem 
J-Link/Edu in Betrieb zu nehmen. Als Umgebung habe ich die Yagarto-Tools 
installiert und soweit auch zum laufen gebracht. Ich kann mittlerweile 
mein Blinkprogramm erstellen, runterladen und auch zum Teil Debuggen. 
Soweit, so gut. Jetzt fängt aber der Ärger an. Mein Programm kann nicht 
alle Register im Prozessor adressieren. Meinen Port F für die Ethernet 
LEDs kann ich so belegen, dass ich die LEDs anschalten kann.
Wenn ich das gleiche beim Port D mache, springt das Programm in den 
Fehlerinterrupt FaultISR. Mit Eclipse und dem JLink habe ich die 
Möglichkeit, mit der Positionierung des Cursors über einem Register den 
Wert auszulesen. Das habe ich mal für einige Registerblöcke gemacht und 
festgestellt, dass die bei den meisten Registern mit
1
WARNING: Failed to read cacheable memory @ address
 endet.
1
Read 4 bytes @ address 0x00000174 (Data = 0x43A8F44F)
2
Removing breakpoint @ address 0x00000158, Size = 2
3
Read 4 bytes @ address 0x4002551C (Data = 0x00000008)
4
Read 4 bytes @ address 0x40025400 (Data = 0x00000008)
5
Read 4 bytes @ address 0x4002551C (Data = 0x00000008)
6
Read 4 bytes @ address 0x40025400 (Data = 0x00000008)
7
WARNING: Failed to read cacheable memory @ address 0x40007400
8
Read 4 bytes @ address 0x40007400 (Data = 0x00000008)
9
WARNING: Failed to read cacheable memory @ address 0x40006404
10
Read 4 bytes @ address 0x40006404 (Data = 0x00000008)

Kann mir hier jemand einen Hinweis geben, wo ich hier mit suchen 
weitermachen könnte? Die Registerbelegung und die Memorymap scheinen zu 
stimmen. Ein System konnte ich noch nicht ausmache, außer das alle 
relevanten Adressen im Block einer IO-Einheit (z.B. für PortF die 
Register DIR, IS etc.), zu lesen und zu schreiben sind. Bei Port D als 
Beispiel ist dagegen gar keine Adresse lesbar.

Kurzer Codeauszug
1
    GPIO_PORTF_DIR_R = 0x08;
2
    GPIO_PORTF_DEN_R = 0x08;
3
4
    GPIO_PORTF_DIR_R |= 0x04;
5
    GPIO_PORTF_DEN_R |= 0x04;
6
7
8
    GPIO_PORTD_DIR_R = 0x01;

Auszug aus dem Headerfile
1
#define GPIO_PORTF_DATA_R       (*((volatile unsigned long *)0x400253FC))
2
#define GPIO_PORTF_DIR_R        (*((volatile unsigned long *)0x40025400))
3
#define GPIO_PORTF_IS_R         (*((volatile unsigned long *)0x40025404))
4
#define GPIO_PORTF_IBE_R        (*((volatile unsigned long *)0x40025408))
5
6
#define GPIO_PORTD_DATA_BITS_R  ((volatile unsigned long *)0x40007000)
7
#define GPIO_PORTD_DATA_R       (*((volatile unsigned long *)0x400073FC))
8
#define GPIO_PORTD_DIR_R        (*((volatile unsigned long *)0x40007400))
9
#define GPIO_PORTD_IS_R         (*((volatile unsigned long *)0x40007404))


Mehr Ideen habe ich im Moment auch nicht mehr. Ich hoffe, hier kann mir 
jemand den entscheidenden Tip geben.

von Stumpf (Gast)


Lesenswert?

Hallo,

ist der Port enabled?
Benutzt du die Driverlib von Stellaris?
Dort sind die meinsten Befehle scho integriert und brauchst dich nicht 
durch alle Register kämpfen.

War bei mir immer ein Problem wenn der port nicht enabled war, dann 
wirft der Controller eine exeption (FaultIsr).

von Jan (Gast)


Lesenswert?

Hallo,
Also ich mache ja nichts anderes als beim Port F auch. Und da geht es 
ja. Damit scheint es aber nichts zu tun zu haben. Ich kann ja im 
Debugmodus wie oben gesagt, den Registerinhalt anzeigen lassen. Da wo es 
nicht geht, kommmt die "WARNING: Failed to read cacheable memory @ 
address xxx".

Ich versuche heute mal, die ROM-internen Funktionen zu nutzen. Mal 
sehen, wie es da geht.

Grüße,
Jan

von Jan (Gast)


Lesenswert?

Hallo,
Als kurze Anmerkung möchte ich noch hinzufügen, dass ich mit der 
Driverlib, mit den ROM-Funktionen sowie mit der Keil-Umgebung zum 
gleichen Ergebnis komme. Ich bekomme keinen anderweitigen 
Speicherzugriff außer auf die Basisadresse vom Port F + 4096Byte. Warum 
und Wieso -> ????

Jan

von Steffen (Gast)


Lesenswert?

Auf meinem EVA Board ist ein recht altes Derivate. Daher ist
 TARGET_IS_TEMPEST_RB1=1
zu setzen. Hier mußt Du ggf. im Prozessor nachsehen.
Dies hat Einfluß darauf, ob die ROM-Funktionen genutzt werden oder 
"gleichwertige" im Flash. (In Rev. B waren einige im ROM buggy.)

Damit ein Port benutztbar ist, muß auch diese auch aktiv sein:

MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

GPIO sollte zwar default sein, aber wer weiß. Pass auf, dass Du keine 
Alternate Functions aktiviert hast.

GPIOPinConfigure(...);

Ist zwar default, doch Du gibst leider nicht an, was Du alles machst:
 - GPIO Digital Enable (GPIODEN) muß aktiv sein

Der Vollständigkeit halber: Greifst Du über den APB oder AHB Bus zu?

Zu einem Fault düfte meiner Meinung nach nur der fehlende Takt oder eine 
falsche Adresse führen.

von Steffen (Gast)


Lesenswert?

Hab noch Code gefunden, jedoch nicht getestet:
1
 #include "lm3s9b96.h"
2
3
(This is part of revision 6852 of the Stellaris Firmware Development Package.)
4
5
    //
6
    // Enable the GPIO port that is used for the on-board LED.
7
    //
8
    SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOD;
9
10
    //
11
    // Do a dummy read to insert a few cycles after enabling the peripheral.
12
    //
13
    ulLoop = SYSCTL_RCGC2_R;
14
15
    //
16
    // Enable the GPIO pin for the LED (PD0).  Set the direction as output, and
17
    // enable the GPIO pin for digital function.
18
    //
19
    GPIO_PORTD_DIR_R |= 0x01;
20
    GPIO_PORTD_DEN_R |= 0x01;
21
22
 #define OFF_LED(x) (GPIO_PORTD_DATA_R &= ~(0x01))
23
 #define ON_LED(x)  (GPIO_PORTD_DATA_R |= 0x01)

von Jan (Gast)


Lesenswert?

Hallo Steffen,
um den Thread mal abzuschließen, hier noch meine gefundene Antwort. Die 
Lösung war das obige SYSCTRL-Register.

Eigentlich war das schon im Demoprogramm mit drin, bei Dir oben auch,

SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOD;

Mit dem Eintrag schaltet man erst einmal den Takt an die entsprechenden 
GPIO-Register. Sinn des Register ist die Zuschaltung vom Takt zwecks 
Stromsparoption. Das war mir so noch nicht ganz klar. Aber ohne den Takt 
ist das Register bzw. der Registerblock wohl ganz tot.

Mal sehen, wie weit ich nun komme ;-)

Schöne Feiertage,
Jan

von Stefan (Gast)


Lesenswert?

Hallo!

ich bin auch gerade am Aufsetzen meiner Toolchain zur Entwicklung auf 
meinem LM3S9D96 (also nur doppelter Flash vgl. mit B96).
Habe jetzt die folgendes installiert; Yagarto + Eclipse + StellarisWare 
Packet.

Nun möchte ich von Grund auf ein einfaches 'Blink' runterspielen und 
debuggen (Code ist ja von TI schon vorhanden), jedoch schaffe ich es 
nicht, die Toolchain einzurichten, damit alles funktioniert.

Ich vermute, ich habe noch mehrere Probleme: also mit Makefile, 
Einstellungen in Eclipse, Linkerscript, (Brauche ich das Scatterfile?)

Könntest du mir ein paar tips geben, wie und was ich wo einstellen muss? 
Oder eventuell ein kleines Beispielprojekt schicken, dann kann ich mir 
anschauen, wie man das alles richtig konfiguriert!


Vielen Dank schon im vorraus!!

Grüße,
Stefan

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.