Hallo allerseits,
ich habe eine kleine Kamera Demo Plattform für den MT9D111-Sensor von
Aptina auf einem STM32F7-discovery Board entwickelt. Ich habe mich dabei
an die Beispiele aus der HAL-Library von ST gehalten.
Der Datenfluss für die Preview ist wie folgt:
DCMI-Interface -> DMA -> Frame Ringbuffer im SDRAM (0xC0260000). Nach
jeder übertragenen Zeile gibt es ein Interrupt, wo dann der DMA2D
benutzt wird, um die Zeile von RGB565 in ARGB8888 zu wandeln und in den
Display Buffer (0xC0130000) zu kopieren.
Außerdem habe ich eine Fotofunktion implementiert, bei der ein Bild mit
höherer Auflösung (VGA) in einen weiteren Bereich des SDRAMs
(0xC0390000) gepeichert wird. Dieses Bild kann auch wieder über den
DMA2D in den LCD Framebuffer kopiert werden, damit man es sich ansehen
kann.
Das funktioniert alles wunderbar, daher nun zum eigentlichen Problem:
Ich möchte nun ein Bild aus der Fotofunktion als Bitmap auf einer FAT
formatierten SD-Karte speichern, um es mir am PC anzugucken.
Hier der Code dafür:
1
voidSD_write_image(void)
2
{
3
uint8_tsd_check=SD_Check();//check if SD card is inserted
Kurze Erklärung dazu:
Ich hole immer eine Zeile des Bildes via DMA2D aus dem SDRAM und
speichere sie im onchip SRAM. Pixel Format Conversion ist hier nicht
notwendig, da der BMP-Header entsprechend angepasst ist (alles RGB565,
2Byte/pixel).
*Nun bekomme ich aber offensichtlich nicht die richtigen bzw.
unvollständige Daten aus dem SDRAM. Das BMP sieht aus wie im Anhang.*
Teilweise sind schon Bilddaten zu sehen, aber was mich am meisten
verwundert sind die schwarzen Balken. Diese kommen daher, dass ich den
Zeilenpuffer im SRAM vor der DMA2D-Aktion mit Nullen beschreiben.
Nach meinem Verständnis sollten die aber später alle wieder
überschrieben werden.
Habt ihr vielleicht eine Ahnung, wo der Fehler liegen könnte?
Ich stehe gerade echt auf dem Schlauch, vor allem da zwei ähnliche
Funktionen ohne Probleme funtionieren.
Hätte ich auch gedacht und habe es deswegen auch erst so probiert.
Da bekomme ich dann allerdings eine Hard Fault exception (auch wenn ich
das zeilenweise mache).
Adrian O. schrieb:> Da bekomme ich dann allerdings eine Hard Fault exception (auch wenn ich> das zeilenweise mache).
Das liegt vermutlich daran, dass du einen unaligned Zugriff auf den
SDRAM machst (d.h. Halfword-Zugriff mit ungerader Adresse, oder
Word-Zugriff mit Adresse die kein Vielfaches von 4 ist). Wenn du die
f_write Routine dementsprechend korrigierst, solltest du direkt aus dem
SDRAM schreiben können, ohne das erst per DMA umkopieren zu müssen.
Hm ok, die f_write gehört zu der FATFS Library und da wollte ich
eigentlich ungerne drin rumfuhrwerken. Zumal ich auch nur rudimentär
verstehe, was da drin passiert.
Ich muss auch nicht direkt aus dem SDRAM schreiben. Es würde mich schon
glücklich machen, wenn das mit dem DMA funktionieren würde.
Irgendwelche Datan bekomme ich da ja, es ist nur rätselhalft wieso es
nicht die richtigen sind.
Edit:
Habe mal im Debugging die Speicheradressen ab 0xC0390000 mit meiner
ersten Zeile in img_buf verglichen. Siehe dazu die beiden Screenshots.
Das komische ist ja auch, dass bei Adresse 0xC0390000 der richtige Wert
drin steht (passt von der Farbe her zu meinem Bild), aber er den in
img_buf nicht überschreibt...Da bleibt einfach die Null mit der ich
vorher initialisiert habe.
Ab Adresse 0xC039001C passt es dann und irgendwann kommen dann wieder
ein paar Nullen usw.
Woran kann es denn liegen, dass schon das nicht korrekt funktioniert?
Edit2:
Außerdem seltsam: Wenn ich die Funktion mehrmals hintereinander aufrufe,
ohne ein neues bild gemacht zu haben, bekomme ich trotzdem
unterschiedliche Ergebnisse.