STM32 Bootloader Write Command ACK aber kein Write

OP #7642252
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

Angehängte Dateien:
#7642579
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 ...

#7643573
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.