www.mikrocontroller.net

Forum: Compiler & IDEs Timing-Problem beim Schreiben von internem Flash (AT91SAM7S256)


Autor: Siddhartha (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

ich versuche gerade ein paar Funktionen zusammenzustellen, die es mir 
auf einem AT91SAM7S256 erlauben, ins interne Flash zu schreiben. Habe 
dafür zuerst mal das Kapitel über den Embedded Flash Controller (EFC) 
gelesen und mich dann ans Programmieren gemacht. Was dabei rausgekommen 
ist, könnt ihr im Anhang sehen (zumindest das C Source File).

Nur leider funktioniert das noch nicht so ganz, wie ich gerne möchte. 
Irgendwie springt der Programmverlauf aus der IntFlash_Write() Funktion 
immer zur Adresse 0x0 und kommt dann halt wieder in die main() Funktion 
(Soft Reset sozusagen). Ich habe dann mal angefangen die Quelle des 
Übels zu suchen und hab mich durch die Funktion durchgesteppt.... und 
lustigerweise lief dabei alles einwandfrei, ich konnte problemlos 
mehrere Pages des internen Flashs beschreiben. Ein bisschen verwirrt hab 
ich das Programm nochmals komplett (ohne Steps und Breakpoints) 
durchlaufen lassen und da ist es sofort wieder "abgestürzt". Durch 
setzen verschiedener Breakpoints konnte ich das Problem dann auf die 
_IntFlash_Ready() Funktion reduzieren (Zeile 73):

// Warten bis Schreib-Routine fertig
statreg = _IntFlash_Ready();

Solange ich VOR dem Ausführen dieser Funktionen einen Breakpoint setze, 
funktioniert alles einwandfrei. Nehme ich den Breakpoint raus, springt 
er von dort zu 0x0.

Hat jemand einen Hinweis, woran das liegen könnte? Ich nehme mal an, 
dass meine _IntFlash_Ready() Funktion zu wenig lange wartet und der 
Prozessor eigentlich noch am Schreiben der Daten ist. Durch den 
Breakpoint hat er jedoch genug Zeit den Schreib-Vorgang zu beenden. Ist 
sowas möglich? Und wenn ja wie bzw was mache ich falsch? Ich prüfe 
eigentlich einfach das Ready-Flag im Status-Register des EFCs (da ich 
keine Interrupts zur Verfügung habe).

Falls zusätzliche Informationen zum Umfeld oder zu Code-Ausschnitten 
benötigt werden, sagt einfach Bescheid. Bin für jeden Tipp und jede 
Hilfe sehr dankbar!

Grüsse

Sidd

Autor: Siddhartha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok konnte das Problem endlich lösen. Hatte vergessen die FMCN (Flash 
Micro Cycle Number) für den Write-Vorgang korrekt zu setzen. Der Wert 
blieb immer auf 48 sprich Anzahl Cycles pro Microsekunde. Das ist auch 
ok so, wenn man Lock und NVM Bits setzt. Für das Ausführen eines anderen 
Befehls wie Write muss der Wert aber auf 72 Cycles pro 1.5 Microsekunden 
gesetzt werden, hatte ich übersehen.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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