Dank bplaced.net habe ich den Einstieg in die M4-Welt geschafft - Leds
blinken im Sekundentakt.
ich möchte über die DCMI-Schnittstelle Bilddaten an das sd-ram senden.
Ich habe dcmi-D5 gegenüber Uwes Beispielcode von B6 auf D3 verlegt, da
ich in erster Linie das sd-Ram nutzen will. Jetzt stört dcmi den
RGB-TFT. Bei dem winzigen Bildschirm wäre spi völlig ausreichend. Wie
stelle ich den Bildschirm von RGB auf SPI um?
Bernd N schrieb:> Keil
danke, werde ich suchen. Die hardware kann man auf der Unterseite
sb22-25 einstellen. Es gibt vier spi-modi. Richtig müsste wohl
4wire-8bit-sda sein: im1+im2 setzen.
Grundschüler schrieb:> Bei dem winzigen Bildschirm wäre spi völlig ausreichend.
max SPI-Clock für das Display ist 10MHz
(so weit ich noch in Erinnerung habe)
320 x 240 Pixel und 16bit Farbe sind 153.600 Byte/Screen
per SPI dauert das ca. 120ms
der max refresh ist also ca. 8 Bilder/sec
reicht dir das ?!?
(per TFT-Bus geht das ca 100mal so schnell)
und eine fertige Lib für das ILI9341 (unter CoIDE) per SPI gibt es hier
da musst du nur die SPI Leitungen anpassen
(habe es aber auf dem STM32F429 nicht getestet)
http://mikrocontroller.bplaced.net/wordpress/?page_id=3071
läuft jetzt etwa so schnell wie beim M3, nicht ganz 2Bilder/sec. Viel
mehr habe ich auch nicht erwartet. für Text aber völlig ausreichend.
Uwe B. schrieb:> fertige Lib
habe ich auch versucht, Anpassung ist aber nicht ganz so einfach, weil
es ein etwas anderer spi-modus iist.
Bildaufbau lcd jetzt 4Bilder/sec,also alles ok und ausreichend schnell.
Problem bei der Einbindung des DCMI-Projekts:
Ich ziehe im Projekt-explorer z.B. die Datei stm32f4xx_fsmc.c in den
cmsis_lib/source ordner. Es kommt eine Fehlermeldung weil FSMC_Bank3
usw. nicht definiert ist.
ich benenne stm32f4xx_fsmc.c in stm32f4xx_fsmc_c.err um, weil ich den
Fehler erst später suchen will. Die Fehlermeldung kommt weiter, d.h. die
Datei wird trotz Umbenennung als c-Datei kompiliert. wenn ich die Datei
nun im Windows-explorer suche, finde ich sie nicht obwohl sie im
Projekt-explorer angezeigt wird.
Wie mache ich Coox klar, dass der Suchpfad genau so sein soll wie es der
P-Explorer anzeigt?
beim STM32F429 gibt es kein FMSC sondern nur ein FMC !!
kann es sein das du das File für den STM32F407 benutzt ?
das funktioniert natürlich nicht
Die Peripheral-Repository darf beim STM32F429 NICHT benutzt werden !!
ich mache das immer so in der CoIDE :
1. per Win-Explorer die notwendigen Peripheral Files
(also hier stm32f4xx_fmc.c und stm32f4xx_fmc.h)
in den Projektordner kopieren . In den CMSIS_LIB Ordner
2. in CoIDE im Projekt-Explorer unter CMSIS_LIB per "Add Files"
die Files hinzufügen
Das funktioniert bei mir immer zuverlässig
und man hat alle notwendigen File im eigenen Projektordner
Uwe
der M4 schreibt 1MByte in 130ms auf das SDRam - auf Anhieb ohne
Änderungen an Uwes code. Langsam macht das mit dem Wechsel m3 zu m4
Sinn.
Mit den Stm-Structuren habe ich noch Probleme. Ich möchte die DCMI
Schnittstelle aktivieren, habe aber die Einstellung des pinouts noch
nicht gefunden. Wäre für einen Tipp - insbesondere von Uwe - dankbar.
Grundschüler schrieb:> habe aber die Einstellung des pinouts noch> nicht gefunden
was meinst du mit "nicht gefunden" ?
wenn du die Pinbelegung an der CPU meinst,
gibt es hier eine Übersicht über alle Pins
vom STM32F429 (DCMI ist die Spalte ganz rechts)
http://mikrocontroller.bplaced.net/wordpress/wp-content/uploads/2013/10/Pinbelegung_f429_v100.html> der M4 schreibt 1MByte in 130ms auf das SDRam
ich mache gerade tests für einen Logic-Analyzer
und da komme ich per DMA und (GPIO -> SDRAM)
auf ca. 48MByte/sec
bin aber noch nicht sicher ob die Daten konsistent sind :-)
Gruss Uwe
ich habe jetzt das pinout in P_OV9655_InitIO entsprechend meiner
20-pin-Schnittstelle angepasst. A8 liefert xClk. der ov7670 arbeitet und
generiert Signale. Die Configuration des ov habe ich erst einmal
weggelassen.
Ich müsste jetzt den DMA-Stream auf das SDram umleiten und dann vom
sdram an das spi-lcd Schicken.
Grundschüler schrieb:> Wo finde ich die Adresse des SDRAM?
die ergibt sich aus der Hardwarebeschaltung der Adress- und CS-Leitungen
#define SDRAM_START_ADR ((uint32_t)0xD0000000)
Wieso ist das SDRam memory, es ist doch extern, also Peripheral?
Wieso werden die Daten nicht übereinander geschrieben da doch
DMA_MemoryInc_Disable-d ist?
Wird das SDRam wie Memory behandelt?
"Peripheral" bedeutet nicht "extern" sondern
damit sind die einzelnen "Module" innerhalb der CPU gemeint
also "GPIO, TIMER, ADC, DCMI, DMA, UART" usw
"DMA_DIR_PeripheralToMemory" ist also hier schon richtig
die Ziel-Adresse entscheidet schlussendlich
ob internes oder externes RAM als "Memory" angesprochen wird
und "DMA_MemoryInc_Disable" ist meiner Meinung nach falsch
bist du dir sicher das die Daten richtig gespeichert werden ?
"Buffer_Size=1" und
"DMA_MemoryDataSize" != "DMA_PeripheralDataSize"
kommt mir auch komisch vor
Das ist 100% dein Code mit geringen Änderungen für den ov7670 und der
geänderten DestAdr. DataSize kann Sinn machen, weil DCMI immer 4Bytes
ansammelt.
> bist du dir sicher das die Daten richtig gespeichert werden ?
Ziemlich sicher. Wenn ich den Sensor abdunkle, ändern sich alle drei
Daten nicht mehr. Das lässt sich eigentlich nur so erklären, das die
Daten ab SDRAM_START_ADR fortlaufend gespeichert werden. Als nächstes
werde ich die Daten vom Ram in das Lcd einlesen. Ich bin guter Hoffnung,
dass dann ein brauchbares Bild rauskommt.
Grundschüler schrieb:> Das ist 100% dein Code
das kann ja sein....aber "mein" Code hat die Daten der Camera nicht
in ein RAM kopiert sondern an ein LCD gesendet
und das LCD inkrementiert seinen internen Adresspointer
nach jedem Schreibzugriff
daher das "DMA_MemoryInc_Disable"
warum das beim SDRAM auch funktioniert ist mir nicht ganz klar
(aber man muss auch nicht alles verstehen ;.)
Gruss Uwe
nach einigen Versuchen tauchte völlig unerwartet eine Schrift auf dem
Bildschirm auf. Es funktioniert. Danke für Uwes Unterstützung. Schluss
für heute.
Grundschüler schrieb:> Es funktioniert.
zu früh gefreut. Dieses merkwürdige Testbild stammt nicht vom ov7670.
Die DCMI-DMA funktioniert, allerdings werden nur die ersten 4bytes des
SDRAM beschrieben. Macht eigentlich auch Sinn, denn der DMA-Transfer
läuft immer für 4Bytes ab. Dann fängt er anscheinend mit der angegebenen
DestAdr für das nächste int wieder von vorne an. Dest-Increment ist
eanabled, ansonsten wird nur das erste Byte beschrieben.
Die DestAdr muss also incrementiert werden oder die Daten müssen aus der
DestAdr abgeholt und auf das SDRam verteilt werden.
Kann ich DestAdr mittels Zeiger auf eine Adresse verweisen, die mittels
px-interrupt hochgezählt wird?
Kann ich DestAdr direkt durch einen px-interrupt hochzählen?
Muss ich den Inhalt von DestAdr mittels m2m-DMA auf das sdram verteilen?
Irgendwelche andere Ideen?
Grundschüler schrieb:> Grundschüler schrieb:>> Kann ich DestAdr mittels Zeiger auf eine Adresse verweisen, die mittels> px-interrupt hochgezählt wird?>> Kann ich DestAdr direkt durch einen px-interrupt hochzählen?>
das hochzählen vom Adresspointer macht der DMA...dafür ist der da
stellt mal "DMA_InitStructure.DMA_BufferSize"
auf die Größe von einem Bild der Camera ein
also : X-Auflösung * Y-Auflösung
dann sollten zumindest alle Bildpunkte der Camera im SDRAM landen
und nicht nur einer
Uwe B. schrieb:> stellt mal "DMA_InitStructure.DMA_BufferSize"> auf die Größe von einem Bild der Camera ein> also : X-Auflösung * Y-Auflösung
es tut sich was. es wird zwar nicht der ganze Bildschirm gefüllt -
640*480/jedes 4.pixel _ gefüllt, aber es wird zumindest incrementiert.
Jetzt kann ich über den Zeilen-Intrrupt die DestAdr nach jeder Zeile
neu festsetzen. Das ist das nächste, was ich versuche.
Grundschüler schrieb:> 640*480
stell doch erstmal in der Kamera eine Auflösung ein die
1. das Display auch anzeigen kann und
2. der DMA in einem Rutsch kopieren kann
also z.B. QQVGA mit 160×120 Pixel
(das sind 19200 Transfers)
da kannst du den DMA einmal Triggern und wenn er fertig
ist gemütlich die Daten ans Display senden
ohne groß Klimzüge machen zu müssen
und für die max Auflösung vom Display (320 x 240)
kannst den DMA auf "double Buffer-Mode" stellen
und zweimal 36400 Pixel transferieren...das sollte auch gehen
den DCMI-frame auf dem sdram.
Verbleibendes Problem ist, dass vom ov7670 noch keine brauchbaren
rgb-daten kommen. Der SCCB-Bus scheint noch nicht zu funktionieren.
geschafft, 640x480px auf sdram und von da verkleinert auf das tft.
Nichts ist einfach. Selbst der SCCB-Code bereitet Schwierigkeiten, die
es bei NXP und AVR nicht gab.
Danke nochmals für Uwes Unterstützung. Als nächstes kommt die SD-Karte
und dann Ethernet.
STM32F429 schrieb:> mit welcher IDE hast du Programmiert?
das ist - wie hier im thread beschrieben - ub_coox. Sehr zu empfehlen.
Du kannst den kompletten Code gerne haben, ich möchte nur vorher den
sccb-Teil neu strukturieren, bevor ich ihn hier einstelle.
Der Projektcode mit dem Sensor OV3640-XGA. Der OV7670 müsste auch noch
gehen, habe ich aber nicht mehr getestet. Wie man sieht, ist ein
Stepdown-Wandler erforderlich, da die 2,9Volt vom board für den OV3640
und für den ENC nicht ausreichen. Die Enbindung des ENC steht noch an.
Wäre hier für Unterstützung dankbar. Nochmals Dank an Uwe für seine
tolle Projektseite, die den Einstieg in die STM-Welt -mit all ihren
Structure-Merkwürdigkeiten - sehr erleichtert hat.