Re: Flashspeicher löschen Kategorie: Progr. Assembler, TaskingTools, OS (von André H. - 23.09.2004 19:02) | ||
Als Antwort auf Re: Flashspeicher löschen von Thomas - 23.09.2004 16:32 | ||
| ||
Hallo Thomas, > Ich möchte prinzipiell auch nicht den vorhandenen Bootloader modifizieren, sondern meinen > eigenen schreiben um an die Grundlagen der Mikrocontrollerprogrammierung zu gelangen. Das erklärt die Fragen. ;-) > Es geht mir hier auch mehr um theoretisches Verständnis der Abläufe. Dies denke ich habe ich mir auch > mittlerweile schon angeeignet (aber Danke für den Hinweis mit dem SRAM ;-)). Ich habe meinen Bootloader > daher in mehrere Files unterteilt um die Abläufe klarer darstellen zu können. Ich kann auch schon > die Primary und Secondary Loop einwandfrei übertragen. Auch mein eigentliches Programm wird dann > scheinbar ohne Fehler geladen, jedoch nicht ausgeführt. Das stimmt so nicht. Dein Programm wird zwar empfangen, jedoch nicht in den Flash gespeichert. Man kann nicht einfach per mov Daten in den Flash schreiben. Dazu müssen vorher immer bestimmte Sequenzen ausgeführt werden, ähnlich wie das Löschen des Flash. Das sind die Sequenzen im Boot-Loader-Listing mit den ganzen 0xAAAA und 0x5555 usw. . Am besten schaust Du Dir das einmal im OS-Listing an. Die Routine befindet sich an Offset 0x25e4, die Löschroutine an Offset 0x2570. Beide werden vor dem Ausführen in den internen RAM des C164CI kopiert. Die Löschroutine erwartet die Segmentnummer in R12. Die Schreibroutine erwartet ebenfalls die Segmentnummer in R12, sowie die Adresse in R13 und das Datenword in R14. Die Schreibroutine prüft nach jedem geschriebenen Word, ob dieses korrekt geschrieben wurde. Wenn nicht, gibt's einen "BURN ERR". > > Das Hauptprogramm, hier zum Test nur ein kurzes Programm das alle LEDs an P1L leuchten lässt. > > > mov P1L,#06Ch > extr #1 > mov DP1L,#0FFh > endl: jmp endl > Beachte, da� Du nicht einfach ab Adresse 0 das Programm schreiben darfst ! Am Anfang des Speichers eines µControllers befinden sich die Interruptvektoren. Der Interrupt-Vektor an Addr. 0 ist der Reset-Vektor. Von diesem springt man zum eigentlichen Programm. Beim OS der CC2 wäre das ein JMPS 0x2226. Wichtig ist nur, da� das Programm in Segment 0 erst hinter den Interruptvektoren anfängt, und Du dorthin vom Rest-Vektor springen mu�t. Prinzipiell darf das Programm in Seg0 erst ab Offset 0x200 beginnen. Alles dafür ist für Interruptvektoren reserviert. Mehr dazu erfährst Du aus dem Manual zum C164 ab Kapitel 5 "Interrupt and Trap Functions" und über das Listing des OS. Das Listing des OS ist wirklch eine sehr hilfreiche Lektüre ;-), auch wenn es vom Stand des letzten original OS ist. ein kommentiertes Listing zu OSOPT V3.x ist aber in Arbeit ... (Ich wei� allerdings nicht wann ich mit dem Kommentieren fertig werden.) > PS: Habe auch grad bei einem kurzen Blick auf den disassemblierten Code gesehn, dass dort andere > Einstellungen für beispielsweise das SYSCON SFR gemacht wurden. Diese Einstellungen betreffen u.a. die Speicherkonfiguration des C164CI. Ich würde diese 1:1 übernehmen. ;-) > Wie könnte ich z.B. überprüfen, dass mein Code auch tatsächlich an Adresse 0 im Segment 0 steht? Indem man nach jedem geschriebenen Wert die Speicherzelle wieder auslie�t und via RS232 als Echo zurücksendet. So, wie ich es in der boot.hex erkennen kann, wird dies dort ebenfalls gemacht. (Zumindest bekomme ich beimLaden ein Echo ;-) ) MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Flashspeicher löschen (von Thomas - 25.09.2004 15:25) Re: Flashspeicher löschen (von André H. - 26.09.2004 9:29) |