Forum: Mikrocontroller und Digitale Elektronik STM32F429: Flash-Löschen/Programmieren bringt seltsame Fehler


von Frank Roggel (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine STM32-Firmware für einem STM32L4R5ZI geschrieben, die auf 
Flash-Bank1 läuft, und Flash-Bank2 löschen/programmieren kann. 
Funktioniert auf dem STM32L4R5ZI einwandfrei.
Jetzt wollte ich diese Firmware auf einen STM32F429ZI portieren, krieg 
es aber nicht zum Laufen. Ich bekomme sowohl beim Löschen als auch beim 
Programmieren von Bank2 immer die Fehlerflags "PGSERR" (Programming 
Sequence error) und/oder "PGPERR" (Programming Parallelism error) 
gesetzt, und kann mir nicht erklären, warum.

Beispielcode:
1
FLASH_EraseInitTypeDef EraseInit;
2
EraseInit.TypeErase   = FLASH_TYPEERASE_MASSERASE;
3
EraseInit.Banks   = FLASH_BANK_2;
4
EraseInit.Sector  = 0;
5
EraseInit.NbSectors  = 0;
6
EraseInit.VoltageRange   = FLASH_VOLTAGE_RANGE_3;
7
uint32_t SectorError = 0;
8
HAL_StatusTypeDef status0 = HAL_FLASH_Unlock();
9
uint32_t error0 = HAL_FLASH_GetError();
10
HAL_StatusTypeDef status1 = HAL_FLASHEx_Erase(&EraseInit, &SectorError);
11
uint32_t error1 = HAL_FLASH_GetError();
12
HAL_StatusTypeDef status2 = HAL_FLASH_Lock();
- HAL_FLASH_Unlock() gibt HAL_OK zurück, FlashError = 0
- HAL_FLASHEx_Erase() gibt HAL_ERROR zurück, FlashError = 2 (PGSERR)
- HAL_FLASH_Lock() gibt wieder HAL_OK zurück

Habe FLASH_VOLTAGE_RANGE 1, 2 und 3 probiert, kein Unterschied.

In den OptionBytes ist keine Read- oder WriteProtection gesetzt.
Der STM32F429ZI ist nach meinem Verständnis immer im DualBank 
konfiguriert, jedenfalls kann ich in OptionBytes nichts einstellen 
(anders als beim STM32L4R5ZI).

Weiß jemand weiter?
von leo (Gast)


Lesenswert?

Frank Roggel schrieb:
> EraseInit.NbSectors  = 0;

Number of sectors to be erased. This parameter must be a value between 1 
and (max number of sectors - value of Initial sector)

0 Sektoren loeschen ist auch eher sinnlos.
leo
von Frank Roggel (Gast)


Lesenswert?

leo schrieb:
> 0 Sektoren loeschen ist auch eher sinnlos.

EraseInit.TypeErase   = FLASH_TYPEERASE_MASSERASE;
EraseInit.Banks   = FLASH_BANK_2;

Ich will keine Sektoren löschen, sondern die ganze Bank.
von Frank Roggel (Gast)


Lesenswert?

Falls es jemanden interessiert:
Ich habe festgestellt, dass diese Fehlerflags (PGPERR und PGSERR) 
anscheinend unberechtigerweise gesetzt werden.
Wenn ich diese Flags einfach ignoriere und lösche, funktioniert alles 
einwandfrei, d.h. das Flash wird korrekt gelöscht und auch programmiert. 
Der neue Flash-Inhalt ist danach korrekt.
von Stefan F. (Gast)


Lesenswert?

Frank Roggel schrieb:
> Ich habe festgestellt, dass diese Fehlerflags (PGPERR und PGSERR)
> anscheinend unberechtigerweise gesetzt werden.
> Wenn ich diese Flags einfach ignoriere und lösche, funktioniert alles
> einwandfrei

Dann schau doch mal, ob du dazu etwas im Errata findest.

Ich bin auf ein ähnliches Problem bei einer I²C Schnittstelle gestoßen, 
das war im Errata beschrieben.

Normalerweise denkt man ja, dass diese Bugs nur in ganz speziellen 
Konstellationen auftreten, von denen man selbst nur selten betroffen 
ist. Aber ich gehöre scheinbar zu der Sorte Mensch, deren Weg mit 
Fettnäpfchen regelrecht gepflastert ist. Was schief gehen kann, geht 
auch schief. Glück haben immer nur die anderen. Kennt Ihr das Gefühl?
von Frank Roggel (Gast)


Lesenswert?

Stefanus F. schrieb:
> Dann schau doch mal, ob du dazu etwas im Errata findest.

Ins Errata Sheet hatte ich als erstes geschaut und nichts dazu gefunden. 
Deswegen war ich auch sehr skeptisch, ob es wirklich sein kann, das 
diese Fehlerflags unberechtigterweise gesetzt werden sollten (das müßte 
doch irgendjemandem aufgefallen sein?!). Aber nach einer Woche 
Trial-and-Error scheint dies die einzige plausible Erklärung...
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.