Forum: Mikrocontroller und Digitale Elektronik smt32f4 Bootloader


von Infantil M. (infantil)


Lesenswert?

Hallo,

ich möchte gerne den internen Bootloader des Stm32f4 nutzen. Dazu 
springe ich aus meinem Hauptprogramm in den Bootloader. Dann sende ich 
0x7F an den USART und bekomme das auch mit 0x79 bestätigt.
Jetzt fangen die Abweichungen vom Handbuch an.
Wenn ich einen Befehl, bestehend aus 2 Byte sende, dann bekomme ich 
keine Antwort.
Bei den ersten 3 Befehlen (Get, Get Version und Get ID) bekomme ich eine 
positive Antwort und Daten gesendet, wenn ich zuvor noch eine weiteres 
Byte, egal welchen Inhalts, sende. Bei allen anderen Befehlen bekomme 
ich immer ein NACK.
Die Daten schicken ich über ein Script in Python über die 
COM-Schnittstelle am PC an den Controller. (Einstellungen der 
Schnittstelle: baudrate=9600, bytesize=8, parity="E", stopbits=1, 
timeout=0.5)

Hat jemand eine Idee, was da schief läuft?
Danke

von Alexander I. (a-irrgang)


Lesenswert?

Read Protection aktiviert?

Nähere Infos hierzu in AN3155, Tabelle 2 auf Seite 7, in Anmerkung 2 
unter der Tabelle.

Ich hab zwar noch nicht damit gearbeitet, aber sollte es daran liegen 
musst du nach meiner Lesart das Kommando "Readout Unprotect" senden, 
bevor weitere Kommandos verfügbar werden.

von Infantil M. (infantil)


Lesenswert?

Wahrscheinlich ist es aktiviert. Leider bekomme ich ein NACK zurück, 
wenn ich [0x79 0x92 0x6d] sende. Wenn ich nur [0x92 0x6d] sende, bekomme 
ich keine Antwort.

von Alexander I. (a-irrgang)


Lesenswert?

Versuch mal mit dem "Get Version & Read Protection Status" Kommando 
sicher herauszufinden, ob Read Protection aktiv ist. Dann wissen wir, ob 
die grobe Richtung überhaupt stimmt :)

Dass gar keine ACK bzw. NACK kommt finde ich aber eigenartig. Laut 
AppNote sollte das eher nicht passieren. Ist dein USART stabil (kleiner 
baud rate error, keine langen Drähte, ...)?

von Infantil M. (infantil)


Lesenswert?

Die Antwort auf den Get Befehl:
[ 0x79 0xb 0x31 0x0 0x1 0x2 0x11 0x21 0x31 0x44 0x63 0x73 0x82 0x92 0x79 
]
Der Befehl ist also aktiv.

Den USART würde ich für stabil halten. Ich habe auch schon eine andere 
Kommunikation im Hauptprogramm mit dem selben Aufbau bei einer höheren 
Baudrate durchgeführt und da gab es keine Probleme.

von Alexander I. (a-irrgang)


Lesenswert?

Ok, und dann einmal "Get Version & Read Protection Status" (0x01) als 
Kommando, weil du da die Zähler für Read Protect/Unprotect erfährst.

Ansonsten könnten 0,5s timeout für den Read Unprotect Befehl zu kurz 
sein; immerhin löscht er den gesamten Flash und macht abschließend ein 
System Reset. ACKs bzw. NACKs solltest du natürlich bekommen.

"For most STM32 products, the readout unprotect operation induce a mass 
erase of the flash
memory, so the Host has to wait sufficient time after the second ACK and 
before restarting
connection. To know how much time this operation takes, please refer to 
the mass erase
time in the product datasheet (when relevant)."

"Mass erase command on STM32F40xxx/41xxx takes longer than on other 
STM32
devices due to their memory density. Make sure that the timeout used by 
your host
interface to wait for an acknowledge event after sending a Mass erase 
command is
sufficient."

von Infantil M. (infantil)


Lesenswert?

Get Version Antwort: [ 0x79 0x31 0x0 0x0 0x79 ]

Richtig, das Löschen des gesamten Speichers könnte lange dauern (max. 32 
s).

Nach der AN3155 wird das erste ACK direkt nach dem Empfangen des Befehls 
gesendet wird. Ich bekomme jedoch zügig nach dem senden des Readout 
Unprotect [ 0x0 0x92 0x6d ] ein NACK und auch nach warten über einer 
halben Minute erhalte ich keine weitere Botschaft. Weshalb ich davon 
ausgehe, dass der Befehl nicht erkannt wird. Auf [ 0x92 0x6d ] bekomme 
ich keine Antwort, auch nicht nach langem warten.

von Alexander I. (a-irrgang)


Lesenswert?

Im Moment fällt mir auch nichts weiter ein. Du könntest noch das Script 
hochladen, vielleicht hat sich da ein Fehler eingeschlichen. Aber 
ansonten weiß ich leider auch nicht weiter.

von Infantil M. (infantil)


Angehängte Dateien:

Lesenswert?

Ich habe mein Python Script angehängt.

von Alexander I. (a-irrgang)


Lesenswert?

Mir ist erstmal nichts aufgefallen, aber ich bin auch nicht wirklich 
firm in den Feinheiten von Python.

Du könntest mal https://github.com/jsnyder/stm32loader probieren; 
basiert auch auf Python und ermöglicht dir das Problem in deinem Skript 
auszuschließen.

Ansonsten solltest du es ggf. auch mal via Terminal versuchen. 
Vielleicht hat ja auch die von dir genutzte PySerial Implementierung 
eine Macke.

von Daniel W. (danila)


Lesenswert?

Ich tippe darauf, dass der Parity Bit falsch gesetzt ist. Nimm doch die 
definierte Konstante serial.PARITY_EVEN

von Infantil M. (infantil)


Lesenswert?

Das Script stm32loader.py hatte ich auch schon gefunden. Leider 
funktioniert die bei mir nicht so richtig. Etwas ausgeben funktioniert. 
Die Baudrate habe ich auf 19200 gesenkt. Das Einlesen funktioniert aber 
irgendwie nicht so richtig. Wenn ich mit aber auf dem Oszi die 
Kommunikation ansehe, dann kann ich sehen, dass die Initialisierung 
klappt. Das nächste Kommando Get funktioniert, wenn ich in cmdGeneric() 
einfach zweimal das Kommando sende und damit auch 3 Byte. Also das 
gleiche Problem, welches ich auch schon bei meinem Script habe.

Das Paritätsbit auf serial.PARITY_EVEN statt "E" setzen hilft leider 
nicht. In serialutil.py Zeile 87 wird das sowieso wieder durch 'E' 
ersetzt:
1
PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = 'N', 'E', 'O', 'M', 'S'

von Daniel W. (danila)


Lesenswert?

Liegt es evtl. an deinem COM Port? Funktioniert der Flash loader 
demonstartor von STM?

von Infantil M. (infantil)


Lesenswert?

Der Flash Loader Demonstartor funktioniert leider nicht. Die 
Fehlermeldung lautet: "Unrecognized device" Das zurücksetzen hilf jedoch 
nicht. Wenn ich mir die Botschaften mit dem Oszi ansehe, dann wird 0x7F 
gesendet und der Controller antwortet auch mit 0x79. Genau wie in meinem 
Python Script, nur dass die Flanken weniger steil sind bei den STM FLD 
Botschaften.
Einstellungen STM FLD: Baud Rate: 19200, Data Bits: 8, Parity: Even, 
Echo: Disabled, Timeout(s) 10

Ich habe es auch zusätzlich anstatt des COM Ports es über ein USB to COM 
Adapter angeschlossen, aber da ist keine Veränderung aufgetreten.

von leluno (Gast)


Lesenswert?

ich hatte das gleiche Problem mit dem bootloader beim LPC1768. 
Stundenlange Suche, hat nie funktioniert.

Kauf Dir für 10€ einen jtag-link-programmer, das klappt dann auf Anhieb 
und du hast einen Debugger. Der Murks mit dem bootloader ist den Aufwand 
nicht wert.

von Daniel W. (danila)


Lesenswert?

Wie ist dein STMf4 beschaltet? Mit dem STM32f4-discovery kit hatte ich 
bis jetzt keine Probleme mit dem bootloader. Verwende auch einen FT232RL 
basieren TTL Wandler.

von Infantil M. (infantil)


Lesenswert?

Ich benutze ein STM32VLDISCOVERY mit einem STM32f415.
Die für den Boot Mode nicht verwendeten Kommunikations-Pins (PA10, PC11, 
PB05, PA 11 und PA 12) habe ich alle mit GND verbunden. Betrieben wird 
es über ein Netzteil an 5 V und GND, damit nicht über USB noch Störungen 
vom PC kommen können. Boot0 Pin habe ich mit dem 3 V Pin verbunden und 
PB2 (Boot1) mit GND verbunden. Bei RX und TX wird es etwas 
komplizierter. TX und RX sind an einem LIN Transeiver (TPIC1021) 
angeschlossen. Damit der TPIC1021 funktioniert ist der Enable Pin auf 3 
V gelegt. Die LIN Seite wird dann mit einem LIN zu COM Adapter 
(RS232-LIN V3, 
http://www.freitag-elektronik.de/pdf_en/RS232-LIN%20%20User%20Documentation.pdf) 
an den PC angeschlossen.

von Daniel W. (danila)


Lesenswert?

Aber du hast gesagt es funktioniert auch nicht direkt am PC... Hast du 
es auch vom PC direkt über USART1 probiert?

von Uwe Bonnes (Gast)


Lesenswert?

Daniel W. schrieb:
> Wie ist dein STMf4 beschaltet? Mit dem STM32f4-discovery kit hatte ich
> bis jetzt keine Probleme mit dem bootloader. Verwende auch einen FT232RL
> basieren TTL Wandler.

Und warum brueckst Du nicht Boot0 nach VDD, und PB2 (Boot1) nach GND, 
steckts einen Micro USB Stecker in das Boardund verwendest DFU?

von Infantil M. (infantil)


Lesenswert?

Der Wechsel zum USART 1 ändert nichts.

Über USB kann ich im Moment natürlich auch ein Programm laden, z.B. ST 
Link Utility, aber ich möchte den Chip später ohne Discovery Board 
benutzen.

von Daniel W. (danila)


Lesenswert?

Gemeint war der DFU Modus des STM32-seitigen USB Ports. Wenn der 
Bootloader in den System Memory boot Space startet, sucht er automatisch 
nach einem passenden Interface. In deinem Fall ist es momentan USART3, 
kann aber auch der USB-OTG port sein. Da du mit Python arbeitest, kannst 
du dir das mal anschauen: https://github.com/vpelletier/python-dfu

von Infantil M. (infantil)


Lesenswert?

Von der zukünftigen Schaltung ist mir vorgegeben, dass ich den USART3 
nutzen muss.

Ich habe jetzt mal noch einen anderen Test gemacht und zwar lese ich mit 
einem weiteren LIN zu COM Wandler (+ COM zu USB Wandler, da ich nur 
einen COM Anschluss habe) die Signale auf dem LIN ein. Man sieht, dass 
beim Zweiten gesendeten Byte Unterschiede zwischen gesendeten und auf 
LIN zu lesenden Signalen zu sehen ist. Wenn ich die Transitive Leitung 
nicht verbinde, dann gibt es keine Unterschiede, aber auch keine 
Antworten ;-). Ich vermute, dass der Controller anfängt zu senden nach 
dem ersten Byte.

Hier die das Ergebnis:
Gesendet von PC [Gelesen auf LIN]
0x0 0x0 0xff [ 0x0 0x0 0xff 0x79 0xb 0x31 0x0 0x1 0x2 0x11 0x21 0x31 
0x44 0x63 0x73 0x82 0x92 0x79 ]
0x0 0x1 0xfe [ 0x0 0x0 0xfe 0x79 0x31 0x0 0x0 0x79 ]
0x0 0x2 0xfd [ 0x0 0x2 0xfd 0x79 0x1 0x4 0x13 0x79 ]
0x0 0x11 0xee [ 0x0 0x10 0xee 0x79 ]
0x0 0x21 0xde [ 0x0 0x21 0xde ]
0x0 0x31 0xce [ 0x0 0x30 0x4c ]
0x0 0x44 0xbb [ 0x0 0x4 0xbb 0x1f ]
0x0 0x63 0x9c [ 0x0 0x3 0x9c 0x1f ]
0x0 0x73 0x8c [ 0x0 0x13 0x8c 0x1f ]
0x0 0x82 0x7d [ 0x0 0x2 0x7d 0x1f ]
0x0 0x92 0x6d [ 0x0 0x12 0x6d 0x1f ]
0x0 0xff [ 0x0 0x1f ]
0x1 0xfe [ 0x1 0x3e ]
0x2 0xfd [ 0x2 0x3c ]
0x11 0xee [ 0x11 0xe ]
0x21 0xde [ 0x21 0x1e ]
0x31 0xce [ 0x31 0xe ]
0x44 0xbb [ 0x44 0x1b ]
0x63 0x9c [ 0x63 0x1c ]
0x73 0x8c [ 0x73 0xc ]
0x82 0x7d [ 0x82 0x3c ]
0x92 0x6d [ 0x92 0x2c ]

von Rainer S. (rsonline)


Lesenswert?

Der Lin Transceiver könnte das Problem sein.
Der Sendet nämlich jedes Byte auch direkt zum Sender wieder zurück, 
soweit ich das sehe.

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.