Hallo,
auf einer Platine, die schon im Einsatz ist, muss ich die Firmware ändern/debuggen. Mit dem SAM4S2A habe ich bisher noch nichts gemacht.'
Mit Atmel Studio 7 und ICE3 wird debuged.
Die Firmware wird geflashed und Code läuft. Aber main()-Breakpionts werden nie erreicht. Er bleibt in einer Schleife (Disassembly),
bei Adresse 0x00800E7A ist Rücksprung.
Ich habe schon gesehen, dass es in den GPNVM Bits eine Boot Mode Einstellung gibt. Wenn ich mit Tools-Device Programming diese Bits auslese,
stehen sie auf 0x00.
Wenn ich in die Checkbox "Value" ein Häkchen setze, wird darunter im Feld
GPNVMBITS 0x02 angezeigt. Wenn ich nun versuche diesen Wert zu programmieren, wird der Fehler "One or more registers differs" angezeigt.
Auch wenn ich versuche den Wert 0x01 zu programmieren, wird Fehler
"WriteRegister() failed to write at 0" angeziegt.
Dies ist auch so, wenn ich vorher mit ERASE-Pin Betriebsspannung an-aus-an
den Flash lösche.
Im DaBla:
=> The GPNVM bit can be cleared or set respectively through the commands “Clear GPNVM Bit” and “Set GPNVM
Bit” of the EEFC User Interface.
Was/wo ist das "EEFC User Interface"?
=> Setting GPNVM1 selects the boot from the Flash.
Also müsste ich in GPNVMBITS den Wert 0x01 programmieren?
Warum geht das nicht?
=> Setting the GPNVM2 selects Flash 1,...
Wo landet den mein Programm? Flash 1 oder 0?
Ist ein Bereich für eine Bootloader-Routine vorgesehen?
Wenn mir jemand helfen und aufklären könnte, ware das sehr nett.
Also wenn dein Code läuft, dann sind die GPNVM Bits richtig eingestellt.
Das du keine Breakpoints setzen kannst, wird dann wohl ein anderes Problem sein.
GPNVM2 existiert beim SAM4S2 nicht, siehe S.45 oben im Datenblatt.
GPNVM0 ist das Security Bit, das willst du jetzt nicht setzen, sonst kannst du weder auf den µC schreiben noch lesen. Dann bleibt nur ein Erase mit dem Pin.
GPNVM1 sorgt dafür das entweder aus dem Flash gebootet wird oder der SAM-BA aus dem ROM. Steht so auch im DB, S.44.
Das sind Register über die man den Flash "steuern" kann oder halt die GPNVM Bits.
Enhanced Embedded Flash Controller (EEFC), S.352.
Befehle für das EEFC, S.372.
Wie man es verwendet musst du dir im entsprechenden Abschnitt selber mal durchlesen.
Welches Interface nutzt du mit dem ICE3: JTAG?
GPNVM1 sorgt dafür das entweder aus dem Flash gebootet wird
oder der SAM-BA aus dem ROM. Steht so auch im DB, S.44.
Ich vermute halt, dass in main() keine Breakpoints möglich sind, kommt daher, dass die Routine die läuft, im ROM steht. Es wird da kein Quellcode angezeigt.
Im Device Programming Tool ist nur GPNVM angegeben mit einem Hex-Eingabefeld.
Welchen Wert muss ich da schreiben? 0x02 müsste doch dem GPNVM1 = 1 entsprechen?
Ich vermute halt, dass in main() keine Breakpoints möglich sind, kommt
daher, dass die Routine die läuft, im ROM steht.
Da versteh ich nicht was du mir damit sagen möchtest.
Im ROM liegt der SAM-BA, der aber bei GPNVM = 0x02 NICHT ausgeführt wird.
Somit kannst du das ROM mal voll vernachlässigen.
Aber auch ohne Optimierung sind Breakpoints in main() ungültig.
Sie sind nicht "ungültig". Sie werden nur nicht erreicht.
Lass die Optimierung ruhig an, sonst debuggst du was völlig anderes.
Es wird dir nichts anderes übrig bleiben als zu verstehen, was vor main() alles passiert und warum er in dieser Schleife hängt. Letztlich hast du auch den Sourcecode dafür irgendwo da liegen, der wird zu deinem Projekt gehören. Bei Atmel ist der Startup-Code sogar in C.
Im ROM liegt der SAM-BA, der aber bei GPNVM = 0x02 NICHT ausgeführt
wird.
Wenn ich den Wert 0x02 schreiben will, kommt aber der ganz zuerst beschriebene Fehler "One or more registers differs".
Das bedeutet doch dass er zwar schreibt, aber das nicht klappt?
Deshalb vermute ich die ROM-Routine.
Im Release siehst du nämlich wirklich nur das Disassembly und kannst
keine Breakpoints setzen.
Eiderdaus! das wusste ich nicht. Ja habe tatsächlich die Release eingestellt. Bei der Solution Configuration gibt es für Debug die richtige FW-Version gar nicht! Probiere einfach mal die ähnlichste...
Ok, ein kleines Stückchen weiter.
Jetzt akzeptiert er die Breakpoints, erreicht sie aber nicht.
Wie kann ich nachforschen, wo er im Startup-Code hängt?
Jetzt akzeptiert er die Breakpoints, erreicht sie aber nicht.
Wie hast es denn nun eingestellt?
Evtl. reicht es wenn du in deiner Release Konfiguration die Einstellung für Debug Level von "None" auf "Maximum (-g3)" setzt.
Dann müsstest du nicht eine neue Konfig. erzeugen.
Also ich verwende die Debug-Konfiguration mit -O3 Einstellung.
Breakpoint auf/ innerhalb "void Reset_Handler(void)" wird auch nicht
erreicht!
Also ich habe bei mir Debug -g3 mit Optimierung -O3 probiert und kann Breakpoints setzen.
Dann gehe jetzt mal her und erstell dir wirklich mal ein neues kleines Projekt um das mal zu testen.
Ist wohl das einfachste um Grundsätzlich mal zu schauen ob es evtl. am Projekt liegt oder an deinem ICE.
Also ich habe ein neues Projekt erstellt.
Breakpoints auf main() und void Reset_Handler(void) und void SystemInit( void ).
Keiner der Breakpoints wird erreicht.
Also ich würde vermuten, dass doch GPNVM gesetzt werden müsste?
Kannst du denn nicht einfach mal ab Reset single steps machen. Dann
weißt du, in welchem Adressbereich du herum wuselst
Ok ich mache "Start Debugging and Break".
Da bleibt er aber auf Status "Running".
Wenn ich auf || "Break All" gehe, ist er an Adresse 00800E6A.
Und grob in diesem Bereich hängt er dann in einer Endlosschleife.
Im Disassembly Fenster wird kein Quelltext angezeigt nur die Assembler-Anweisungen.
Nein. Weil im Device Programming das Programmieren des Wertes 0x02
einen Fehler bringt - "One or more registers differs".
Wenn ich danach lese, steht der Wert wieder auf 0x00.
Das ist das Problem.
Also euch allen für eure Hilfe schon mal vielen Dank!
im CMD-Fenster:
C:\Program Files (x86)\Atmel\Studio\7.0\atbackend>atprogram -t atmelice -i jtag -d atsam4s2A write -fs -o 0 -v --values 02
[ERROR] Failed to connect. Error=0x1001. (TCF Error code: 131103)
Was mich schon gewundert hat, die NRST-Leitung des Prozessors ist auf der Platine gar nicht angeschlossen, geht also nicht zum ICE3...
Aber die Platinen sind getestet und da braucht es ja die Firmware drauf.
Nur ist da das Secutity gesetzt und ich muss mit ERASE-Pin vorher löschen.
@ Adam P.
Ja, Erase habe ich schon oft probiert. Nützt nix.
Im Device Programming Tool versuche ich zuerst die Device signature auszulesen um damit die Verbindung zu testen. Wenn das geht, weiß ich, dass kein Security gesetzt ist.
@ Adam P.
Ja, Erase habe ich schon oft probiert. Nützt nix.
Im Device Programming Tool versuche ich zuerst die Device signature
auszulesen um damit die Verbindung zu testen. Wenn das geht, weiß ich,
dass kein Security gesetzt ist.
Ok gut...
und kannst du dann die Firmware flashen? Oder kommt da auch ein Fehler?
und kannst du dann die Firmware flashen? Oder kommt da auch ein Fehler?
Wenn ich (Device: Erase Chip) auf Memories Program xyz.elf drücke,
kommt da nach einiger Zeit (Fortschrittsbalken fast am Ende) auch ein Fehler: "Verifying Flash...Failed! address=0x400000 expected=0xc0 actual=0xff"
Wenn ich aber im Studio auf "Start debugging" drücke, wird das Programm ohne Fehler aufgespielt...
Naja, JTAG wird normalerweise mit einem eigenen Takt betrieben, solange du den nicht völlig überziehst, muss zumindest eine Verbindung gehen. (Stärkere Restriktionen kann es ggf. beim Debuggen geben.)
Wackelkontakt in den JTAG Leitungen zwischen (ICE <-> Controller)
Dafür sind die 10-Pin-Kabel des AtmelICE leider recht anfällig. Die dünne Litze hat nur wenige Drähte, und wenn man zu viel Kraft beim Ziehen der Stecker anwendet, reißt da schnell mal was ab.
Oder ist evtl. an den Datenleitungen irgendeine Peripherie
angeschlossen, die man erst per jumper oder sonstiges abkoppeln muss?
Normalerweise macht man sowas nicht, aber das müsste dir der Schaltplan des uns unbekannten Geräts verraten.
P.S.
Wer ist denn mal wieder die Witzfigur hier, die alles mit -1 bewertet?
Irgendjemand gefällt sich darin, dass er es geschafft hat, einen Bot zu zimmern, der sowas querbeet macht. Wenn man halt mit seiner Energie sonst nichts anfangen kann, kann man sich an so einem Quatsch sicher erfreuen.
Oder ist evtl. an den Datenleitungen irgendeine Peripherie
angeschlossen, die man erst per jumper oder sonstiges abkoppeln muss?
An allen 4 Leitungen sind 10k gegen Ground - also SWCLK, SWDIO, SWO, TDI.
Das sollte kein Problem sein, denn andere, gleiche Platinen lassen sich ja mit dem Serienprogrammierer beschreiben.
Habe jetzt auch die 1,2V VDDCORE geprüft - sind in Ordnung.
Der Programmierstecker auf der Platine ist problematisch. Werde jetzt einzelne JTAG-Leitungen direkt anlöten, eine 10pol-Wannenstiftleiste dran machen und mein funktionierendes Standardkabel verwenden.
Was ich mich halt frage ist, wenn ich die Device ID auslesen kann,
müsste doch die Verbindung zum Debugger OK sein?
Mit einem Erase lösche ich doch auch alle Fuses auf ihren Standardwert?
PS:
Ich habe auch schon den JTAG-Clock auf 100kHz herabgesetzt. Bringt nichts.
Äh, ja. Ich habe bisher JTAG nicht benutzt, deshalb bin ich da nicht firm drin. Danke für den Hinweis wie die benutzten JTAG-Leitungen heißen - TDI, TMS, TCK, TDO.
TMS -> (SWDIO),TDO->(SWO), etc.
Den Knoten verursachenden Horror finde ich die falsche Belegung der Debugger-Buchse, deren Pinnummern nicht den Standard-Wannenleisten entsprechen. Zum Glück gibt es im Inet gute Bilder dazu.
Den Knoten verursachenden Horror finde ich die falsche Belegung der
Debugger-Buchse, deren Pinnummern nicht den Standard-Wannenleisten
entsprechen.
Pah.
Eigentlich gibt es bei Cortex-M zwei Belegungen (alt, 20polig, 2,54 mm Raster und neu, 10polig, 1,27 mm Raster), aber noch was anderes als das sollte man nicht erfinden.
Prinzipiell stimme ich dir zu, dass das Auslesen der Signatur ausreichen Beweis für die Verbindung zum JTAG sein müsste, aber irgendwas ist halt foul.
Du könntest natürlich noch einen Logicanalysator bemühen und schauen, was da auf dem JTAG passiert, wenn du das GPNVM1 setzen willst.
Du könntest natürlich noch einen Logicanalysator bemühen und schauen,
was da auf dem JTAG passiert, wenn du das GPNVM1 setzen willst
Uff, von diesem Protokoll habe ich keinerlei Ahnung.
Ich habe das hauseigene Debug-Kabel geprüft. Das ist in Ordnung.
Habe mittlerweile eine neuere Platine mit höherer Version bekommen und da funktioniert das GPNVM und das Programm flashen.
Die einzige Möglichkeit, die ich noch sehe ist, dass tatsächlich der SAM eine Macke hat. Muss also ausschließlich den Flash betreffen.
Tja, Sachen gibt's.
Jedenfalls bedanke ich mich nochmal bei euch für eure geduldige Unterstützung und schließe meine Anfrage damit ab.
Schönen Tag noch.