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


von Siddhartha (Gast)


Angehängte Dateien:

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):

1
// Warten bis Schreib-Routine fertig
2
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

von Siddhartha (Gast)


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.

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.