Forum: Mikrocontroller und Digitale Elektronik STM32 Bootloader Write Command ACK aber kein Write


von Leopold N. (leo_n)


Angehängte Dateien:

Lesenswert?

Hi zusammen,

ich versuche, den Flash eines STM32F107 mit dem integrierten Bootloader 
zu programmieren. Anbei die UART Übertragung. Der Write verläuft wie in 
AN3155 beschrieben.
Folgendes ist im Verlauf zu sehen:
- 0x7F wegen Auto-Baud
- get (0x00 0xFF)
- write (0x31 0xCE) an 0x08000000 und 4 Bytes   (0x00, 0x00, 0x00, 0x20)
- read (0x11 0xEE) an 0x08000000 ergibt 4 Bytes (0x00, 0x00, 0x01, 0x20)
- go (0x21 0xDE) an 0x08000000

Das Problem: Alle Commands werden mit einem ACK (0x79) von dem 
Bootloader beantwortet, dennoch stimmen die ausgelesenen Daten nicht mit 
den geschriebenen überein. Ein Check mit dem CubeProgrammer liest 
ebenfalls die alten Daten aus.
Meine Frage ist also: Warum werden alle Commands mit einem ACK 
beantwortet, dennoch aber nichts geschrieben?

Die Notes aus der AN3155 mit der Write-Protection (wo nicht geschrieben 
wird, wenn write-protected, aber dennoch ein ACK geantwortet) habe ich 
bereits berücksichtigt, indem ich vorher den Befehl write_unprotect() 
ausgeführt habe. Dieser wurde auch mit zwei ACKs beantwortet und 
anschließend automatisch ein MCU Reset durchgeführt. Hat aber am 
Ergebnis nichts geändert.

Vielen Dank im Voraus schonmal

: Bearbeitet durch User
von Andreas B. (abm)


Lesenswert?

Bei einem Flash kann man nicht einfach etwas hineinschreiben bzw. es hat 
eben keine Wirkung. Vorher muss der Sektor gelöscht werden (alles 0xFF).

von Leopold N. (leo_n)


Lesenswert?

Übernimmt das nicht der integrierte Bootloader?

von Andreas B. (abm)


Lesenswert?

AN3155 "USART protocol used in the STM32 bootloader", Figure 13. "Write 
Memory command: device side". Steht da irgendetwas von "erase"???
Wie soll der ärmste auch wissen, ob man nur ein Byte neu schreiben will 
und der Rest des Sektors so ungefragt übern Jordan gehen soll/darf? Die 
Verantwortung wälzt man besser auf den Auftraggeber ab, sonst kommen 
hinterher noch Beschwerden, es seien höchst wichtige und unersetzliche 
Daten ohne Warnung einfach gelöscht worden ...

von Leopold N. (leo_n)


Lesenswert?

Ok, ob das nun sinnvoll ist, bzw. ob das hätte in der Doku stehen 
sollen, ist wohl Ansichts-Sache.
Mit dem Page-Erase und anschließendem Schreiben funktioniert es auf 
jeden Fall.
Danke für den Tipp.

von Rahul D. (rahul)


Lesenswert?

Andreas B. schrieb:
> Wie soll der ärmste auch wissen, ob man nur ein Byte neu schreiben will
> und der Rest des Sektors so ungefragt übern Jordan gehen soll/darf?

Das sollte doch eigentlich im Kapitel "Memory programming" stehen.
Wer auf das FLASH zugreift, sollte egal sein.
Sowohl Bootloader als auch JTAG, Debug-Wire und SPI verwenden die selbe 
Methode. Die muss man dann nur ein Mal nachvollziehen.
Und dazu gehört, dass das FLASH blockweise (neu) beschrieben wird.
FLASH-Speicher verhält sich aufgrund seiner Technoligie so, dass man 
Bits nur löschen kann. Dazu müssen sie aber erst mal gesetzt sein, was 
durch ein Erase passiert.

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.