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
Bei einem Flash kann man nicht einfach etwas hineinschreiben bzw. es hat eben keine Wirkung. Vorher muss der Sektor gelöscht werden (alles 0xFF).
Übernimmt das nicht der integrierte Bootloader?
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 ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.