So Leute,
hier kommt ein kleines Programmier-Tool, das ich mir zum Brennen der
STM32Fxxx Controller über deren eingebauten Bootlader geschrieben habe.
Es ist noch recht frisch, ich hab's erst seit ein paar Tagen in
Benutzung. Eine kleine Beschreibung als PDF ist dabei, es sollte also
keine wirklichen Probleme damit geben.
Der Hintergrund ist ganz einfach, daß man als J-Link-Edu Besitzer ja
leider auf J-Flash verzichten muß und das Gehampel mit dem Debugger via
IDE mir nicht schmecken will - UND: daß die originale
Bootlader-PC-Software von ST mir mißfällt.
Viel Spaß beim Basteln
W.S.
W.S. schrieb:> Windows-App versus Kommandozeilen-Tool.> Überleg dir selbst, was du lieber magst.
Ich bin mir ganz ganz sicher daß ich das Kommandozeilentool bevorzuge.
Denn das kann ich ganz simpel in meinen make-Prozess integrieren und bei
Bedarf einfachst fernsteuern.
Die Klickerei kann ich dagegen nicht automatisieren und muss sie immer
von Hand machen.
So, es gibt ein Update.
Ich hab ein bissel am Programm gefeilt. Es ist jetzt etwas schneller,
aber man kann keine Wunder erwarten. Auch das Synchronisieren mit dem
Bootlader geht jetzt deutlich schneller, man kann das Read- und
Write-Entsperren jetzt übergehen, spart auch Zeit.
Testeshalber hab ich mal bis zu 160 kBaud mit einem STM32F302
ausprobiert. Es geht, aber ohne spürbaren Geschwindigkeitszuwachs
gegenüber 115 kBaud.
W.S.
Danke, das du dich dem leidigen Problem des Bootloaders beim STM32
annimmst!
Bei dem von dir vorgestellten Programm komme ich leider auchnur bis
zum Chiptest(Chip-ID:3200).
Die Verbindung über den virtuellen COM-Port kommt also zustande.
Ein Löschen oder Programmieren scheitert mit "keine Verbindung zum
Chip".
Ich habe hier ein "Olimex E407-Board" mit einem ESP8266 wifi to serial
an den Bootpins(TX,RX,GND) ohne zusätzliche DTR,RTS.
Zum booten habe ich B0-1/B0-0 gebrückt(selbe Vorgehensweise wie mit
USB-seriell Adapter und da funktionierts mit dem Demo-Flasher von ST..)
e-d schrieb:> Hier noch ein Bild des Verbindungstests..
Wähle mal "entsperren und löschen". Vielleicht ist irgendwas in den
Options gesetzt. Nebenbei: die Options sind bei meinem Programm erstmal
außen vor.
Als nächstes solltest du dir deinen Chip in die Liste (targets.cfi)
aufnehmen. Ein Chip mit PID 3200 steht da noch nicht drin. Deshalb
fehlen eigentlich alle Parameter, insbesondere Flash-Start und Länge.
Also, probier noch mal und laß uns die Ergebnisse wissen.
W.S.
Der ESP-Wifi to ser.Port ist fest auf 115200 Bd eingestellt.
Irgentwie liest dein Programm die PID falsch(richtig wäre 0x0413);
Könnte default bei dir die hälfte sein?
Beim virt.COMport ist unbedingt unter"settings" die "NVT enabled"
rauszunehmen.(dazu login)
Da der neue Flasher von ST o.B. funktioniert, bleibe ich zunächst dabei.
Danke für dein Programm! Aber:
"Never change a winning team .."
So kann ich den STM32F407 drahtlos flashen.
So, wieder ein Update. Diesmal wegen des offensichtlichen Bedürfnisses,
ohne BOOT und RESET auskommen zu wollen.
Und da ich schon mal dabei war, hab ich auch noch bin und s19 als
Dateiformate mit aufgenommen.
Ich denk mal das war's bis auf weiteres.
W.S.
Was bedeutet den beim löschen "no proc eex 00Fehler beim EraseMemExt" ?
Ich benutze nicht die Leitungen für BOOT Mode und Chip Reset!
Der Prozessor ist ein STM32f407 1024K.
Habe zum Testen auch mal die Baudrate geändert, ohne Erfolg.
Ich hätte ich da noch so ein paar kleine Wünsche.
1. Funktion sonst bringt mir das andere ja nichts
2. Eine Möglichkeit zum abbrechen beim leer test, das dauert ja ewig.
3. Entweder der GCC liefert mist oder etwas ist mit der HEX lese Routine
nicht richtig Fehler"ausserhalb: 08000000" werde ich selber mal testen.
VG, Uli
Uli schrieb:> Was bedeutet den beim löschen "no proc eex 00Fehler beim EraseMemExt" ?
Daß das Kommando $43 also Extended Erase Memory zwar vom Bootlader
akzeptiert und mit ACK (also $79) quittiert wurde, aber nach 5 Sekunden
noch immer nicht vollzogen und mit einem zweiten ACK quittiert worden
ist. Hätte dort das NAK ($1F anstelle 00) gestanden, dann hätte der
Bootlader die Ausführung abgelehnt. Ist aber nicht. Der Bootlader
braucht schlichtweg zu lange - und zwar SEHR zu lange. Normal ist eine
Dauer für's extended Bulk-Erase von so etwa 40..60 ms, bei größeren
Flashs vielleich auch etwas länger, aber nie und nimmer geschlagene 5
Sekunden.
Wenn du hingegen 'no cmd eex ' gesehen hättest, dann würde das bedeuten,
daß der µC das betreffende Kommando $43 nicht akzeptiert hätte.
Ich hab bei diesem Programm erstmal ohne separate Threads gearbeitet,
also mußt du dich beim Auslesen oder Leertest eben gedulden. Der
Bootlader kennt nur memory read oder write aber kein compare oder nen
Leertest. Also muß man zum Leertest alles erstmal lesen und auf $FF
prüfen.
Zu Hexfile-Inhalten außerhalb des Flashroms: Da gibt es eigentlich nur
das Feld mit den Options und die sind einstweilen außen vor. Guck mal
bei deinem Eintrag für ARM-NONE-EABI-OBJCOPY, was da so alles kopiert
wird. Ich bin mir ziemlich sicher, daß du in deinem Projekt die Options
mit irgend welchen Readout-Sperren gesetzt hast. Nimm das raus, es wird
einstweilen nicht unterstützt. Steht auch so in der Beschreibung. Ob ich
das Beschreiben der Options einbaue, weiß ich zZ noch nicht. Mal sehen,
ob genug danach geschrieen wird... Ich selbst brauche sowas nicht.
Nochwas: hast du auch deinen µC in der Liste eingetragen oder einen
kompatiblen Typ ausgewählt? Die Lage und Größe des Flashes nimmt das
Programm aus dieser Liste und wenn dort bunte Knete drinsteht, geht es
nicht.
Ach ja - ich habe "nur" 2 MB Puffer für den Flash vorgesehen.
Und der Hex-Lader spuckt auch bei:
Record 2 (Extended Segment Address Record)
Record 3 ( CS:IP Address Record)
weil die in so eine Firmware nicht hineingehören. Obendrein spuckt er
auch bei Nichtvorhandensein von Record 1 (Ende-Record)
Du brauchst also ein wirklich fehlerfreies Hexfile für und NUR FÜR den
Flashrom.
Mal sehen, vielleicht mach ich mal ne Liste der vorhandenen
Fehlermeldungen.
W.S.
Ich hatte einen Typ aus der liste genommen (05 07 ....).
Also ist irgendwas zu langsam im / um dem stm. Nur was? Der 8 MHz Quarz
sollte es doch nicht sein, zumal die Kommunikation ja läuft.
Die gcc -> hex Ausgabe schaue ich mir morgen genauer an. War von der IDE
angelegt worden, ist ja anscheinend fehlerhaft. Nunja bis zur
Programmierung komme ich noch nicht wegen dem löschen. Aber das sollte
zum Glück ja einfach zu finden sein.
Vg, Uli
So, ich hab das Ganze jetzt mal mit einem Discovery nachvollzogen. Also
ein älteres mit STM32F407VGT6 drauf, stammt von einer früheren Embedded.
Anschluß geht nur über USART3, PB10+11.
Der USART1 ist anderweitig verbraten und deshalb unbenutzbar.
Der Bootlader weist sich als Rev. 3.1 aus, klingt soweit gut.
Aber: beim Löschen akzeptiert er zwar das Kommando für's Bulk-Erase
(Extended Erase Memory, Special case 0xFFFF, also "global mass erase"),
aber er gibt anschließend KEINERLEI Mucks von sich.
Ich habe mal die Wartezeit auf satte 15 Sekunden erhöht - ebenfalls
nichts.
Der Flash ist jedoch schon nach 1 Sekunde brav gelöscht.
Zu bemerken war, daß der BL beim nächsten Reset und anschließendem
Synchronisieren 2x nicht will und erst beim dritten Anlauf sich endlich
meldet. Ob das ein Fehler im Bootlader ist oder eine häßliche
Interferenz durch den auf dem Board befindlichen ST-Link, ist fraglich.
Auf alle Fälle verhält sich dieser Bootlader nicht konform zum AN3155,
dort Kap. 3.8. Er müßte in jedem Falle entweder ein ACK oder ein NAK von
sich geben. Ich hab allerdings die diversen Errata noch nicht
durchforstet.
Der Rest geht eigentlich problemlos über die Bühne. Hab das Teil mit
160000 Baud betrieben und Auslesen, Programmieren, Verifizieren geht
ohne Makel. Lediglich beim Bulkerase hapert es.
W.S.
Ich bin also doch nicht zu blöd, Glück gehabt, Puh!
Und der Bootloader will nicht richtig wie schon immer befürchtet.
Habe mir das Hex File angesehen.
:020000040800F2
:1000000000000220C54E0008D54F00081931000835
:10001000D94F0008DD4F0008E14F00080000000044
...
:045A500089010008C0
:04000005080001DC12
:00000001FF
Der Inhalt könnte stimmen.
Der Aufruf ist: arm-none-eabi-objcopy -O ihex test.elf test.hex
Also auch irgendwie ganz normal.
Kann es sein das Du mit dem "Extended Linear Address Record (Typ 04)"
nicht klar kommst?
Ich werde nachher mal das BIN Format testen.
Mit "arm-none-eabi-objcopy -O binary test.elf test.bin"
VG, Uli
Uli schrieb:> Kann es sein das Du mit dem "Extended Linear Address Record (Typ 04)"> nicht klar kommst?
Ach wo, dieser Block wird benötigt, um über die 64K Grenze zu kommen und
ist implementiert.
Aber wo ich sowas lese: "ausserhalb: 08000000" kommt mir der Verdacht,
daß du deine Firmware nicht auf 0 sondern auf 0x08000000 gelinkt hast.
Das ist ein Fehler. Der Flash geht laut ST zwar ab 0x08000000 los, aber
das gilt erstmal nur für's Flashen. Die eigentliche Abarbeitung findet
normalerweise ab 0 statt, wohin der Flash gespiegelt wird.
Wahrscheinlich kann man sich auch ne Abarbeitung ab 0x08000000 denken,
denn SP und PC werden ja beim Reset aus den Vektoren geladen, aber das
Normale bei einem ARM ist eben das Abarbeiten ab 0. Also linke dein
Zeugs mal auf Null.
W.S.
So, mal wieder ein Update.
Ich habe nun ein sektorweises Löschen eingebaut. Wer also einen Chip
hat, der sich nicht per Bulkerase löschen läßt, der kann es jetzt
sektorweise tun.
Ausprobiert habe ich das Ganze mit einem steinalten Discovery, das ich
mal auf der Embedded in die Hand gedrückt bekam. Es geht, aber das
sektorweise Löschen ist teilweise schnarchlangsam.
W.S.
Hallo,
danke für das Programm; ist nach einigem Frust mit dem STMFlashLoader
genau das was ich suche ;)
Ich habe gerade mal versucht, mit dem Programm einen STM32F100VB zu
flashen. Das ist ein Chip der Klasse "STM32_Med-density-value_128K", ist
in der targets.cfi also mit 128kB Flash angegeben.
Wenn ich jetzt ein .bin File der Größe 131072 (also genau 128k) flashen
will, sagt mir das Programm "Datei ist zu groß für diesen Chip".
Es gibt von dem Chip mehrere Varianten, die dieselbe PID 420 haben;
möglicherweise bringt das STM32Prog da was durcheinander...
Grüße,
Ulrich
Ich hab da ohnehin ein mentales Problem mit den aus dem ST-Zeugs
maschinell (per Script) entnommenen Daten. Zum einen die verwirrenden
Typbezeichnungen, zum anderen die mehrfach vergebenen PID's, dann die
derzeit zwar unbenutzten aber dennoch fischigen Sektorlängen, die bei
einigen Typen auch mal unterschedlich lang sind bis hin zu den nur
teilweise vorhandenen Options.
Mein Rat: schmeiß alles, was du nicht brauchst, aus der targets.cfi
gnadenlos raus, gib dem verbleibenden Rest sinnvolle Namen (konkrete
Typbezeichnungen) und probier einfach mal als "Schweinereiversuch", bei
der Spalte "FLASH-END" anstelle 0801FFFF; eben 08020000; hinzuschreiben
oder nen größeren Chip anzuwählen - vorausgesetzt, dein Chip beherrscht
das Bulkerase.
Ansonsten werde ich in den nächsten Tagen in die Quellen gucken, mal
sehen, ob mir da was auffällt. So langsam nimmt das Ganze ungeahnten
Umfang an.
W.S.
OK, ich habe jetzt mal aus der targets.cfi alle Einträge außer dem
Eintrag für STM32_Med-density-value_128K gelöscht; das Flash-End habe
ich auf 0801ffff gelassen. Damit läßt sich das Binary einwandfrei
flashen. :)
Soweit also alles wunderbar. Das STM32Prog läuft in meinem Aufbau
übrigens auch ohne den Chip-Reset wesentlich stabiler als der
STMFlashLoader.
Danach habe ich noch etwas mit Hexfiles experimentiert und da ist mir
doch noch was aufgefallen: Meine GNU-Toolchain generiert im Hexfile
offenbar Extended Segment Address Records und damit scheint das Programm
nichts anfangen zu können. Fehlermeldung: "unerwarteter Record 2 auf
Zeile 4097".
Hier der Kontext:
O manoman, das wird ja lustig..
Also
Record:
0 = Daten (benötigt)
1 = Enderecord (benötigt)
2 = Extended Segment Addr -> Fehler, da nur für I386
3 = Extended CS:IP -> Fehler, ebenso nur für I386
4 = Extended Linear Addr (benötigt)
5 = EIP unbenutzt
6..Rest = Fehler
Dein Fromelf sollte also nur die Records 0, 1 und 4 erzeugen.
Für den Record 2 gilt m.W. die alte Regel, daß die Segmentadressen sich
überlagern, also ein Segment 16 Bytes groß ist (vom 8086 herrührend).
Schema:
SSSSSSSS0000 Segmentadresse
AAAAAAAA Adresse
-------------
XXXXXXXXXXXX Summe
20 Bit Gesamtadresse (640K sollten nach B.Gates ausreichen..)
W.S.
Nachtrag:
Bei mir sieht sowas so aus
:020000040001F9
:02 Länge
0000 leer
04 Record 4
0001 High-Adressteil
F9 Psum
(hoffentlich hab ich mich hier nicht vertippt)
W.S.
Guck lieber nochmal in die Doku zu deinem "FromElf" (also dem
GCC-Pendant dazu) wegen -Intel und so. Normalerweise überlappen sich bei
CS:IP beide Register ja um 4 Bit. Nicht daß der Nächste sich dann
wundert, daß bei seinem Projekt die Firmware wegen solcher Dinge nicht
läuft.
Aber ein bissel wundern muß ich mich schon darüber, daß das GCC-Zeugs
solch einen Lapsus produziert - immer vorausgesetzt, daß da nicht doch
noch ein finsterer Parameter falsch ist. Ich erinnere mich mit größtem
Ärger daran, daß der GCC-Assembler bei Code, der mit .thumb assembliert
wurde, die im Code enthaltenen Labels fröhlich als ARM-Labels in den
Objektcode gepackt hat, anstelle die eben auch als .thumb auszuweisen.
Das ließ sich erst mit zusätzlichem .thumbfunc oder so ähnlich
ausmerzen. Und das Schärfste war, daß dieser fette Bug den GCC-Leuten
seit langem bekannt war - sie haben ihn nicht ausgemerzt, sondern nen
Workaround per .thumbfunc dazu erfunden. Naja, mich selbst hat's ja
nicht wirklich getroffen, denn ich benutze den Keil und da kommt sowas
nicht vor.
W.S.
Also da gibt es leider keine Möglichkeit.
GNU objcopy unterstützt mit -O ihex zwar die Ausgabe als Hexfile, aber
weitergehende Optionen zur Steuerung des Ausgabeformats sind nicht
implementiert...
Grüße,
Ulrich
Dann haben wir es mit nem Bug zu tun. Wieder mal...
Abhilfe: das Ganze als Binärdatei ausgeben oder als Motorola S19. Ich
glaub, das hieß -O mhex.
W.S.
Ich würde nicht sagen, dass es ein Bug ist:
:020000021000EC
und
:020000040001F9
sollten lt. Spezifikation des Intel-Hex Formats das gleiche bewirken,
nämlich einen Offset von 0x10000 für die nachfolgenden Adressen. Ob das
jetzt für einen I386 ist oder für einen ARM, spielt m.E. überhaupt keine
Rolle auch wenn es auf letzterem keinen richtigen Sinn ergibt.
Für Motorola Srecord muss objcopy mit "-O srec" aufgerufen werden.
Jörg
Joerg W. schrieb:> sollten lt. Spezifikation des Intel-Hex Formats das gleiche bewirken,> nämlich einen Offset von 0x10000 für die nachfolgenden Adressen.
Nein, eben nicht. Es ist stattdessen ne "extended Segment Addr", also
für die Segment-Register des '86 gedacht. Für den linearen Adreßraum ist
Record Nr. 4 gedacht. Der ist dafür da, die Bits 2^16 bis 2^31 zu
setzen.
Der Keil macht das genau richtig, da gibt's nichts zu meckern. Ich
könnte jetzt zwar mein Programm entsprechend ändern, so daß es nen
Workaround um den Fehler des Gnu-Dingens macht, indem es Record Nr. 2
genauso behandelt wie Record Nr. 4, aber eigentlich gehören Bugs an
ihrer Wurzel beseitigt - anstelle eines Workarounds.
Also, was nun?
W.S.
Nachtrag (aus Wikipedia):
"Extended Segment Address Record (Typ 02)
Der Datensatz enthält die Basisadresse des Speichersegments. Er wird
verwendet, wenn der Umfang eines 16-Bit-Adressraums (also 64 kByte)
nicht ausreicht. Die im Datensatz enthaltene Adresse wird mit 16 (24)
multipliziert und bei den folgenden data records (Typ 00) zu der dort
enthaltenen 16-Bit-Adresse addiert."
Merke: Die enthaltene Adresse wird mit 16 (sechzehn!) multipliziert und
dazu der PC wert addiert. Also GENAU SO, wie ich das weiter oben
skizziert habe.
Fazit: Es IST ein Bug, hier den Record Nr. 2 zu verwenden.
Leute, gebt euer Zeugs als binär oder Motorola aus und fertig ist die
Laube.
W.S.
Habe das Verhalten mal in den GCC-ARM-Embedded Bugtracker eingegeben.
https://bugs.launchpad.net/gcc-arm-embedded/+bug/1595152
Viel verspreche ich mir davon aber nicht; die meisten Tools scheinen ja
mit den Typ 2 Records klarzukommen.
Das S-Record Format scheidet für mich als Alternative aus, da ich auch
die Flashtools von ST verwende, z.B. das STM32 ST-LINK Utility.exe, und
die können nur Binary und Intelhex. Ich denke, ich bleibe erst mal bei
der Methode, das Hexfile nach dem Compilieren durch srec_cat zu jagen.
Grüße,
Ulrich
U.B. schrieb:> die meisten Tools scheinen ja> mit den Typ 2 Records klarzukommen.
Mag ja sein. Ich könnte dafür nen Workaround einbauen, das wäre
programmiertechnisch gar kein Problem. Aber es ist einfach eine fette
Unsauberkeit, einen Bug mit einem weiteren Quasi-Bug zu umschiffen.
Das ist der Punkt.
Ich hab schon geschludert, als ich beim Synchronisieren ein korrektes
NAK als ein Quasi-ACK umgedeutet habe, bloß weil manche partout kein
Reset haben anschließen wollen. Mir ist unwohl dabei, denn sowas ist
nicht der korrekte Weg.
Wenn das so weitergeht, dann besteht das ganze Programm nur noch aus
Workarounds, anstatt daß die Fehler an ihrer Wurzel beseitigt werden.
Aber wo ist für dich das Problem, sowohl Hex als auch Bin oder Motorola
ausgeben zu lassen? Dann hast du beides...
W.S.
Nachtrag:
Ich hab mir das aus deinem Bugreport mal näher angeschaut:
:020000021000EC <-- Error
also
:02 Länge
___0000 leer
_______02 Record 2
_________1000 Nutzinhalt
_____________EC Psum
Mit anderen Worten: 1000h * 16 --> 100000h
Das ist genau die CS:IP Rechnung wie weiter oben beschrieben. Wenn man
es wie der 8086 rechnet, dann kann man damit einen Adressraum von 1 MB
überstreichen. (genauer gesagt 1 MB + 64K) wie zu MSDOS Zeiten. OK, das
reicht für die meisten Bastelprojekte aus, obwohl es eigentlich für eine
andere Architektur als ARM gedacht ist.
Ich hätte da ne Bitte an dich: Erzeuge mal mit irgendwas eine Firmware,
die mindestens etwas mehr als 512K groß ist und gelegentliche Lücken von
einigen KB mittendrin hat. Würde mich interessieren, was für Record 2
Inhalte die Gnu-Toolchain dabei erzeugt.
W.S.
W.S. schrieb:> Mag ja sein. Ich könnte dafür nen Workaround einbauen, das wäre> programmiertechnisch gar kein Problem. Aber es ist einfach eine fette> Unsauberkeit, einen Bug mit einem weiteren Quasi-Bug zu umschiffen.>> Das ist der Punkt.
Du hast ja Recht, aber gibt Dir dennoch einen Ruck und mache es einfach.
Es muß ja nicht jeder erneut auf die Nase fallen, nur weil er keine
S-Records kann oder kennt.
Ich habe mal mit einem modifizierten Linkerfile getestet (Binutils
2.25.1). Solange das Ganze unter 1MB bleibt, werden Typ 02 Records
erzeugt, darüber dann Typ 04. War auch nach dem bisher Gelesenen nicht
anders zu erwarten und entspricht auch der Intel-Hex Spezifikation.
Wenn ich z.B einen Block bei 0x0c0000 losgehen lasse und einen anderen
bei 0x1c0000, dann erscheinen im Hexfile die folgenden Records:
:02000002C0003C
<Code 1. Teil>
:020000020000FC
:02000004001CDE
<Code 2. Teil>
Vor dem Extended Linear Address Record wird das Segment wieder auf 0
zurückgesetzt. Lt. Spezifikation wäre das nicht notwendig, schadet aber
auch nicht. Da ich für die STM32 nach 0x08000000 linke bzw. S-Records
verwende, ist mir das bisher gar nicht aufgefallen.
Jörg
Joerg W. schrieb:> Ich habe mal mit einem modifizierten Linkerfile getestet (Binutils> 2.25.1). Solange das Ganze unter 1MB bleibt, werden Typ 02 Records> erzeugt, darüber dann Typ 04.
Manchmal frag ich mich "warum bloß so ein Zinnober...?"
Mit dem Record 4 kann man den gesamten 32 Bit Adresßraum erreichen und
er trägt kein bißchen mehr auf als dieser knöselige Record 2, der ja
eigentlich NUR für die i8086-Architektur vorgesehen ist, wo sich
Segmentregister und IP überlappen - sowas gibt's nirgendwo sonst, erst
recht nicht bei ARM. Was sind das bloß für kranke Hirne, die im selben
Programm beides zwar können, aber feinsäuberlich einen Bug
hineinprogrammieren, wenn die Adresse unter 1MB liegt...
Mir ist sowas auch nicht vorher aufgefallen, schließlich macht Fromelf
vom Keil die Sache richtig. Und jetzt soll ich an die verkehrt
programmierte Gnu-Krücke noch eine zweite Gehhilfe dranbauen.
Mittlerweile hab ich den Eindruck, daß ich bei jedem Kontakt mit
Gnu-Zeugs irgendeine häßliche Stinkbombe unter die Nase kriege. Ging mir
bei der Lernbetty schon so. Bislang hab ich den GCC bloß als zu
verquaast empfunden, aber so langsam krieg ich ne GCC-Allergie.
Na mal sehen.
Aber heut ist es mir zu heiß dafür.
W.S.
So, bevor es mir heute auch zu heiß wird, hab ich auf die Schnelle (!!)
diesen elendigen Record 2 eingepflegt, neue Version anbei - und einiges
Unwohlsein meinerseits angesichts dieses ***** dazu.
ABER: Bitte umgehend mit euren Gnu-Tools ausprobieren, ob es wirklich so
klappt. Ich hab zwar die olle Yagarto aus Lernbetty-Zeiten noch
herumstehen, aber seitdem nie wieder benutzt.
W.S.
Kurt P. schrieb:> Schade, nur WIN10 - bin Linux Maker.
Bist Du lediglich Linux User oder wirklich Unix Maker? Wenn Maker, dann
make Dir ein Programm doch selbst unter Linux. Den STM32-Bootloader zu
bedienen ist wirklich kein Hexenwerk.
Hi Frank.
Maker, habe ich so nicht gemeint. Bin Linux User!
Unter Linux habe ich selbstverständlich die entsprechenden Tools.
Das h i e r erwähnte Programm unter Linux wäre schön gewesen.
Also wer denn nun: Kurt Pieper oder Kurt(Gast)?
Ich habe es in der zugehörigen Dokumentation ja schon erwähnt: Wenn ein
Linuxer ernsthaft das Programm nach Linux umsetzen will, kann er von
mir die Quellen kriegen. Eine Lazarus-Version hab ich ja schon selber
gepostet. Also sollte man das als interessierter Linuxer auch
hinkriegen.
W.S.
Kleine Anmerkungen zu deinem schönen Programm:
- ein "About" sollte nicht fehlen auch wenn es nur ein
Synonym ist (man merkt dass du als Person die Öffentlichkeit
scheust). Gleiches gilt für das Doku-PDF.
- Das Programm-Fenster positioniert sich bei mir immer unten
rechts, das ist gelinde gesagt "gewöhnungsbedürftig". So einen
grossen Bildschirm wie du habe ich offensichtlich nicht.
Vielleicht andere auch .... Zwei Koordinaten (x, y) in einer
Config-Datei und alles ist in Butter.
Hallo W.S,
danke für die Info.
Habe das Projekt STM32 in die Schublade gelegt.
Ich entwickle zur Zeit mit ATMEL-Mikrocontroller Decoder (Licht +
Signale) am CAN Bus für eine Märklin Eisenbahn.
https://www.youtube.com/watch?v=pjQ7-ROPI28STM32 war ein kleiner Ausflug!
Viel Erfolg.
Gruß
Kurt und Gast
So, dem zuvorigen Mosern folgend, gibt es hier ein Update.
Inhaltlich hat sich NICHTS geändert, es ist nur Kosmetik dahingehend,
daß das Programm sich jetzt seine Bildschirmposition merkt. Obendrein
merkt es sich nun, ob man die COM-Ports scannen will oder nicht. Aber
kein About-Button u.dgl. Wozu auch, zum Benutzen braucht man sowas
nicht.
Es ist nur die reine EXE, also ohne Dokumentation.
W.S.
ich habe den gerade mal ausprobiert..bei STM32F373 gehts nicht..
Beu AUTO erkennt er STM32F3_7x_8x_256K, 128 Pages
Wenn ich dann programmieren klicke kommt. außerhalb 08000000
Frank t- schrieb:> Wenn ich dann programmieren klicke kommt. außerhalb 08000000
Dann hast du Code im Bereich außerhalb der zulässigen Adreßbereiche. Ich
selber linke meine Projekte immer ab Null, weil das der übliche Bereich
für den Flash bei den Cortexen ist.
Deshalb die eingebaute Regel:
- Code, der im Bereich von 0 bis Codemax (hier wohl 256K) liegt, wird
auf den Programmierbereich ab 0x0800:0000 bis 0x0800:0000 + Codemax
transponiert.
- Code im Programmierbereich ab 0x0800:0000 bis 0x0800:0000 + Codemax
wird so wie ist programmiert
- und alles, was außerhalb liegt, wird bemeckert.
Mache aus deinem Hexfile mal ein Binärfile und brenne das. Wenn das auch
nicht klappt, dann poste mal das Ergebnis hier.
btw: du kannst mit dem Bootlader nicht die Codeprotect-Bits brennen. Die
liegen außerhalb und du kannst sie nur aus deiner Firmware heraus
setzen. Das braucht auch ein gewisses spezielles Procedere.
W.S.
Nachtrag:
Ich habe selber mit dem Brenner die STM32F302RBT6 gebrannt. Also mit
dieser Reihe sollte es eigentlich gehen.
Notfalls setze einen eigenen Eintrag in die targets.cfi hinein - falls
dieser Chip ungewöhnlich sein sollte.
W.S.
So, nochmal ein Update.
Inhaltlich hat sich nichts geändert, lediglich werden jetzt beim Laden
der Hexfiles die Anzahl geladener Bytes angezeigt und die erlaubten
Bereiche sind jetzt eingeengt, aber variabel (wenn man die targets-Datei
editiert).
Also, der erlaubte Code darf jetzt in folgenden Bereichen liegen:
von 0 bis Codegröße des Chips - oder vom in der targets-Datei
angegebenen Bereichsanfang für das Flashen bis Bereichsanfang +
Codegröße.
W.S.
Hi,
ich habe ein kleines Feedback zusammengeschrieben.
kann man einen Adressoffset angeben?
Wenn nicht (ich habs nicht gefunden), bitte die Möglichkeit den
Adressbereich anzugeben hinzufügen. Ich arbeite mit dem SPWF01SA und das
hat selbst noch einen Bootsektor ab 0x08000000. Wenn ich diesen
Überschreibe funktioniert das Modul nicht mehr. Somit kann ich deine
Software nicht zum Updaten verwenden. Die Software muss ich ab
0x08002800 flashen.
Und bei Teste Verbindung+Chip findet wechselt das Programm immer meine
Einstellung des Chips. Der Prozessor ist ein STM32 High destiny mit 512k
und es wird immer nach dem Test Verbindung+Chip auf den mit 256k
gewächselt.
Beim Programmiervorgang hat sich das Programm dann aufgehängt. Nach
einiger Zeit war es wieder da. Der Programmiervorgang hat aber
funktioniert.
Ansonst super Programm!
Sg Simon
Simon schrieb:> kann man einen Adressoffset angeben?
Nein, wieso und wofür?
Sowohl in einer Hex Datei als auch in einer Motorola Datei stehen die
absoluten Adressen drin. Das reicht doch aus, um jeglichen Code präzise
zu positionieren.
Allenfalls könnte ich mir sowas für eine reine Binärdatei vorstellen, wo
ja keinerlei Adressierung enthalten ist. Hab sowas aber bislang nicht
eingebaut.
Ansonsten noch eine Anmerkung von mir:
Warum bloß binden hier so viele Leute ihren Code auf 0x0800:0000 ? Das
ist der Bereich, auf dem der Flash zum Programmieren erreichbar ist.
Aber ein Cortex erwartet sein Zeugs ab Adresse 0 und deshalb kann man
seinen ganzen Code ab Adresse 0 linken, denn der Bereich von 0x0800:0000
erscheint gleichermaßen im Adressbereich 0x0000:0000, von wo aus er ohne
jegliche Probleme ausgeführt werden kann.
Nochwas:
Beim Testen von Verbindung und Chip sucht das Programm in seiner Liste
der Chips nach der ID des Chips. Die ID's stammen von ST's
"Demonstrator" und ich erinnere mich duster, an manchen Stellen schon
Doppelbelegungen gesehen zu haben. Ich hatte nicht ohne Grund
geschrieben, diese Liste zu editieren, und alles, was man nicht braucht
einfach rauszuschmeißen.
W.S.
W.S. schrieb:> Warum bloß binden hier so viele Leute ihren Code auf 0x0800:0000 ?
Weil das in den Linkerscripten von ST auch schon so drinsteht
Dies wiederum vermutlich, um die ganzen Anfragen zu ersparen, die
entstünden, wenn man zwar ab Adresse 0 linkt, aber dieses Image dann ab
0x08000000 zu flashen ist.
Zudem ist es auch denkbar, daß nicht alle Toolchains beim Hexfile-Export
so gut klarkommen, wenn die Linkadresse eine andere als die Flashadresse
ist.
Nop schrieb:> Zudem ist es auch denkbar, daß nicht alle Toolchains beim Hexfile-Export> so gut klarkommen, wenn die Linkadresse eine andere als die Flashadresse> ist.
Ist für mich nicht denkbar, denn da gibt es nicht allzuviele Toolchains,
die für Cortexe den Code erzeugen. Was haben wir denne? Keil, IAR, GCC
und das war's schon fast. FPC erzeugt Win32 Format oder nur ELF. Evtl.
noch Mikroe. Sonst noch was?
Und ja, der GCC baut bei der Ausgabe von Intel-Hex einen Bockmist
dahingehend, daß er das nur für den Intel 8086 vorgesehene CS:IP Modell
benutzt. Dabei gibt es EXTRA für 32 Bit Plattformen das passende Modell
auch im Intel-Hex-Code. Aber das berührt deine Bedenken gar nicht. Siehe
Diskussion weiter oben im Thread.
W.S.
W.S. schrieb:> Der Hintergrund ist ganz einfach, daß man als J-Link-Edu Besitzer ja> leider auf J-Flash verzichten muß
Dafür gibts den Commander, da kann man bequem aus ner Batchdatei heraus
flashen.
W.S. schrieb:> Und ja, der GCC baut bei der Ausgabe von Intel-Hex einen Bockmist
Und 0x08000000 ist oberhalb des 1MB-Adreßraums, beginnt quasi ab 128 MB.
Damit umgeht man eventuell das Problem. Ich lasse mir das beim GCC
sowieso als Bin ausgeben und habe dahinter noch eine eigene Toolchain,
um s_record nicht benutzen zu müssen.
Aber der Kern ist wohl, daß es in den Linkerfiles von ST auch schon so
ist.
Es funktioniert auch beides gleichermaßen, auch von der
Ausführungsgeschwindigkeit her. Allenfalls wäre ein Nachteil des Linkens
zu 0x08000000, daß man das zum Debuggen nicht ins RAM legen kann
(zusammen mit Boot0/Boot1). Aber das ist ja ohnehin nur eine Option,
wenn man so wenig Code und Data hat, daß das alles zusammen noch ins RAM
paßt.
W.S. schrieb:> Warum bloß binden hier so viele Leute ihren Code auf 0x0800:0000 ?
weil man dann die unteren 128MB mittels MPU komplett ausblenden kann und
NULL-Pointer fangen kann. Wenn ST das Flash bei 0 eingebaut hätte, würde
ich für den Zweck 64k (oder so) Flash verschenken. Pascal-Programmierer
kennen sowas natürlich nicht ;)
Außerdem finde ich es natürlicher und übersichtlicher, wenn die Adressen
beim Linken, beim Flashen und zur Laufzeit immer gleich sind.
W.S. schrieb:> Warum bloß binden hier so viele Leute ihren Code auf 0x0800:0000
Warum sollten sie nicht, was spricht dagegen? Beim Flashen mit J-Link
gibts einen Fehler wenn man versucht direkt nach 0x0 zu flashen, also
wenn man eh nach 0x8000000 flashen muß warum soll man dann nicht auch
direkt dorthin linken? Dann kommt auch ein hex oder ein srec raus das
direkt dort hin geflasht werden will wohin es auch gelinkt worden ist
und alles funktioniert sofort und ohne irgendwelche Handstände.
Gegeg J. schrieb:> warum grrr?> ich hatte als mini mauis gefragt
eben darum.
Mit wievielen Namen bist du eigentlich in diesem Forum unterwegs? Ich
kann ja ne Menge verstehen, aber manches verwirrt denn doch.
W.S.
Hallo,
Gute Arbeit, bei mir funktioniert das Tool ohne Probleme (STM32F72X).
Mich würde auch der Quellcode interessieren. Könntest du ihn mir bitte
senden?
Danke
f.glaser19@protonmail.com
Hallo,
Echt genial das Program. Ich habe die letzten Tagen nicht wirklich das
STM Software programmieren können.
Bei mir funktioniert nach Änderung der targets.cfi das Tool mit
STM32L011x4 auch.
Mich würde auch der Quellcode interessieren ;-). Könntest du ihn mir
bitte
senden?
Merci
alonso3786@gmail.com
Peter Pander schrieb:> Konnte ich nie senden, da nie was angekommen ist
Naja, auch wenn das mittlerweile lang her ist:
es macht offenbar einen Unterschied, ob man das Ganze an
f.glaser19@protonmail.com
oder an
svkgroup@freenet.de
schickt. Gelle?
W.S.