Hallo,
hat jemand eine funktionierende Demo mit STM32H750 und W25Q64 QSPI im
XIP memory mapped mode?
Programm im QSPI und flashloader Programm im internen Flash.
(am liebsten als STM32CubeIDE Projekt)
Danke
Zunächst mal FV oder JV? Und wo soll da das Problem sein?
Man muss vor dem Einschalten des Memory Mapped Mode einmal ein Indirekt
Read mit Instruktion und dem passenden Mode Byte (XIP an, als Alternate
Byte) auslösen und dann beim Memory Mapped Mode keine Instruktion, ein
Alternate Byte (mit dem passenden Mode Byte für XIP an) konfigurieren.
Und zum Ausschalten erstmal ein Abort, dann Indirekt Read ohne
Instruktion, Adresse 0 und passendem Mode Byte (für XIP aus) auslösen.
Adresse 0, weil man u. U. nicht sicher sein kann, ob der Flash im
XIP-Modus ist oder nicht, also das erste Byte der Adresse eventuell als
Instruktion fehlinterpretiert werden könnte. Und 0x00 ist kein gültige
Intruktion.
A. B. schrieb:> Zunächst mal FV oder JV?
JV ... spielt das eine Rolle im Code?
> Und wo soll da das Problem sein?
Also ich habe zuerst ein paar STM32 Beispiele mit dem STM32H750B Disco
Board ausprobiert die mit Program-Code via externem QSPI laufen. Das
funktioniert gut.
Das STM Beispiel-Projekt (ext Flash Booter) für den Code auf dem
internen STM32-Flash lautet "ExtMem_Boot".
Ich habe jetzt ein ähnliches Board, aber mit einem (in China) besser
erhältlichen QSPI von Windbond W25Q64JV (single).
Jetzt habe ich versucht das "ExtMem_Boot" Projekt so anzupassen, dass es
für den W25Q64 passt.
Beim Debuggen verhält es sich jedoch anders, d.h. der externe Flash
zeigt nach der "EnableMemoryMappedMode" Funktion überall den Inhalt
888888888 und das Program geht dann in den void
MemManage_Handler(void).... also irgendwas läuft was falsch.
Anpassungen habe ich im qspi.c und memory_msp.h File durchgeführt.
Das angepasste "ExtMem_Boot" Projekt findet man hier (Code im Bereich
ifdef W25Q64):
https://drive.google.com/drive/folders/1n7dnF52jlO1vyJ8ENyKqWqMjwYVJ1sRY?usp=sharing
Die Anpassungen habe ich gemäss folgendem Projekt versucht zu übernehmen
jedoch mit Pin-Mapping PB2,6, PF6,7,8,9 (das Board/Projekt ist/sollte
für ein W25Q64 chip geschrieben sein):
https://github.com/osos11-https://github.com/osos11-Git/STM32H743VIT6_Boring_TECH_QSPI/tree/main/Memory%20Mapped%20Mode/H743_QSPI_XIP_1> Man muss vor dem Einschalten des Memory Mapped Mode einmal ein Indirekt> Read mit Instruktion und dem passenden Mode Byte (XIP an, als Alternate> Byte) auslösen und dann beim Memory Mapped Mode keine Instruktion, ein> Alternate Byte (mit dem passenden Mode Byte für XIP an) konfigurieren.> Und zum Ausschalten erstmal ein Abort, dann Indirekt Read ohne> Instruktion, Adresse 0 und passendem Mode Byte (für XIP aus) auslösen.>> Adresse 0, weil man u. U. nicht sicher sein kann, ob der Flash im> XIP-Modus ist oder nicht, also das erste Byte der Adresse eventuell als> Instruktion fehlinterpretiert werden könnte. Und 0x00 ist kein gültige> Intruktion.
Die (HAL) Prozedur im Code ist aktuell wie folgt:
das ist witzig .. hatte damit auch meine probleme ...
liegt am interrupt
ich habs dann zum laufen bekommen zwar der W25Q16JV
mit den GPIOs den
HAL_NVIC_SetPriority(QUADSPI_IRQn, 0x0F, 0);
HAL_NVIC_EnableIRQ(QUADSPI_IRQn);
und die dummycycles richtig setzen
achso
das war der bootloader !!
die applikation fässt den QSPI nicht wieder an
ich hab ewig gesucht ...
erst mit aktivieren des QSPI interrupts funktioniert das mit dem memory
mapped...
opzuiziziz schrieb:> erst mit aktivieren des QSPI interrupts funktioniert das mit dem memory> mapped...
Ok, danke schon mal. Bei mir ist der Interrupt aktiviert, aber ich werde
jetzt mal versuchen Schritt für Schritt deine Parameter zu übernehmen...
wichtig ist der adressmode(16/24/32 bit ) und die dummybytes
ich habe das so gemacht das erstmal grundlegend alle schreib / lese
funktionen das tun was sie sollen
Danach erst den memory mapped
epika schrieb:> A. B. schrieb:>> Zunächst mal FV oder JV?> JV ... spielt das eine Rolle im Code?
Da manche Kommandos nur in einem der beiden verfügbar sind, ganz
offensichtlich.
> Das STM Beispiel-Projekt (ext Flash Booter) für den Code auf dem> internen STM32-Flash lautet "ExtMem_Boot".>> Ich habe jetzt ein ähnliches Board, aber mit einem (in China) besser> erhältlichen QSPI von Windbond W25Q64JV (single).>> Jetzt habe ich versucht das "ExtMem_Boot" Projekt so anzupassen, dass es> für den W25Q64 passt.> Beim Debuggen verhält es sich jedoch anders, d.h. der externe Flash> zeigt nach der "EnableMemoryMappedMode" Funktion überall den Inhalt> 888888888 und das Program geht dann in den void> MemManage_Handler(void).... also irgendwas läuft was falsch.
Die 88888888 ist eher ein Symptom, dass 1-Line/4-Line Modi zwischen
QSPI-Interface und Flash nicht passen.
Man man aber strikt zwischen Programmausführung (nur Lesen, und zwar im
Memory Mapped Mode) und Löschen/Schreiben/Konfigurieren unterscheiden.
XIP geht nur,
wenn der Flash ausschließlich Reads bekommt.
> Die (HAL) Prozedur im Code ist aktuell wie folgt:>>
Und das mit XIP? Das KANN so nicht gehen, denn der Flash bekommt dabei
ja gar kein Befehlsbyte mehr. Es muss erst einmal das Read-Kommando
(inkl. Befehlsbyte) geschickt werden, und am Ende des Kommandos gibt das
Mode Byte an "bleibe in diesem Modus". Der erste Lesezugriff muss also
MIT Befehlsbyte, alle weiteren müssen OHNE arbeiten. Also können die
von vornherein nicht mit derselben Konfiguration des QSPI-Interface
arbeiten. Nach dem "Anstoßen" des XIP-Modus muss also das QSPI-Interface
umkonfiguriert werden, und das geht bekanntlich nur im "gestoppten"
Zustand.
opzuiziziz schrieb:> die dummycycles richtig setzen
Jetzt läuft schon mal was, vielen Dank :-D ...
Komisch nur, dass der erste Buchstabe von "Hello..." im Memory nicht
abgebildet wird, aber im readbuf dann schon (siehe Anhang Bild).
Weiss jemand da was??
Änderungen:
Memory Mapped Mode von 0x6B auf 0xEB gewechselt, dummycycles von 8 auf
6, und dann war "gpio_init_structure.Alternate" teils falsch gesetzt,
AF9 statt AF10 oder umgekehrt. Für was ist Alternate überhaupt? Ist das
entscheidend?
Vielen Dank für die Inputs.