Forum: Mikrocontroller und Digitale Elektronik usart wird überschrieben


von Bernd S. (mms)


Lesenswert?

Hallo,

wie kann man eigentlich die Registeraddresse von der seriellen 
Schnittstelle überschreiben? Also so, dass die Baseaddr von USART nicht 
mehr der eigenltichen BaseAddr übereinstimmt.

Hab einfach mal alle Daten vom internen RAM in den externen RAM gemappt 
- jedoch blieb der Fehler. Als Flash benutze ich auch ein extern 
angeschlossenes.

Dieser Fehler tritt nur dann auf, wenn ich ein zusätzliches C-file mit 
Headerfile (ein paar defines und eine struct) mit einbinde - jedoch 
keinerlei funktion aufrufe (da der Fehler bereits davor passiert).

Auf die USART hab ich einen ptr installiert ( befindet sich im internen 
RAM) - dieser wird nicht überschrieben, besitzt stets die Adresse von 
der seriellen Schnittstelle.

Bernd

von Karl H. (kbuchegg)


Lesenswert?

Gehts nur mir so?

Wovon sprichst du überhaupt?

Welcher Fehler?
Welcher Prozessor?

Die Adressen an denen Hardware im µC zu finden ist, ist
doch normalerweise fix verdrahtet. Da kannste nichts
überschreiben.
Ergo musst du irgendeinen Fehler im Programm haben.
Aber ohne obige Informationen + Programmcode wird dir
niemand helfen können.

von Bernd S. (mms)


Lesenswert?

ich habe übertragungsfehler bei der seriellen schnittstelle -> data 
abort.

Ich hab einen Ptr auf die Base Addr der seriellen Schnittstelle gesetzt 
und vergleiche diesen Ptr während das Programm läuft, ob dieser noch der 
Base Addr entspricht... -> leider ist dies nicht der Fall. Ich 
programmiere mit Keil und während des Debuggens kann man auf die  Werte 
der Variablen und Ptr zugreifen und da sehe ich, dass dieser Ptr aber 
den richtigen Wert besitzt.

Das ganze Programm funktioniert solange gut, bis ich eine weitere 
C-Datei hinzufüge (ohne dass Code aus dieser C-Datei ausgeführt wird). 
D.h. es wird kein neuer Code ausgeführt und trotzdem treten diese Fehler 
auf. Der Code für die serielle Schnittstelle funktioniert auf jeden Fall 
(da ich diesen Code schon bei anderen Programmen verwendet habe und 
funktionierte).

Im Prinzip rufe ich als erstes im Programm die Konfiguration der 
seriellen Schnittstelle auf und anschließend gebe ich mittels printf() 
etwas über diese aus. Und hier passiert schon der Fehler, wenn weitere 
Dateien eingebunden werden.
Erst anschließend wird die init-Funktion (oder würde) der neuen C-File 
aufgerufen.

Arbeiten tue ich mit dem Controller AT91RM9200 von Atmel.

Bernd

von Bernd S. (mms)


Lesenswert?

vielleicht ist auch ein Fehler innerhalb meines Linkerfiles...
1
LOAD_FLASH 0x10000000 0x3FFFFF            ; start address and length 
2
{
3
4
  EXTERN_FLASH 0x10000000 0x3FFFFF   
5
  {
6
    RM9200.o (RESET, +First)
7
    *.o(+RO)
8
9
  }
10
11
  SDRAM 0x20000000 0x3FFFFFF       
12
  {                   
13
    timer.o (+RW,+ZI)
14
  }
15
16
  BUFFER_SDRAM 0x21000000 EMPTY 0x2000000  
17
  {
18
  
19
  }
20
21
  INTERN_RAM 0x200000 0xFFFFF
22
  {
23
    *(+RW,+ZI)
24
  }
25
}

Mein Board hat einen externen SDRAM angeschlossen
0x20 000 000 bis 0x23 FFF FFF

sowie einen externen Flashspeicher
0x10 000 000 bis 0x10 3FF FFF

der interne RAM befindet sich
0x00 200 000 bis 0x00 2FF FFF

Im Buffer_SDRAM möchte ich gerne Daten aus der Peripherie speichern - 
z.B. Daten von der seriellen Schnittstelle oder der USB Schnittstelle.

Bernd

von Gast (Gast)


Lesenswert?

Ich würde vorschlagen, du übst erstmal mit einem kleinen AVR oder PIC 
Controller.

von Bernd S. (mms)


Lesenswert?

d.h. ich gehe richtig in der annahme dass mein linkerfile so noch nicht 
funktionieren kann?

Bernd

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.