stm32f429 BMP read sd

Gast #4621148
Lesenswert?

hallo,
ich spiele ein bischen mit dem stm32f429 discovery board.
Das Beispiel Fats funktioniert ich kann eine Datei auf der Karte 
erstellen und lesen.

So nun wollte ich gerne ein BMP Pic von der Karte auf Das tft anzeigen.

scheitere aber daran wie ich das Auslesen des BMP Pictures starte oder 
beginne.

BMP: 240*240 24bit
(Firma: matzetronics) #4621165
Lesenswert?

Du liest mit fread() o. ä. erstmal den BMP Header ein, der ist unbedingt 
nötig, um den Anfang der eigentlichen Bilddaten zu finden und um 
herauszufinden, ob du das BMP auf deiner Kiste überhaupt darstellen 
kannst:
https://en.wikipedia.org/wiki/BMP_file_format

Du siehst, das schon in den ersten paar Bytes wichtige Sachen 
drinstehen, wie die Länge des BMP und die Anfangsadresse in der Datei 
für die Bilddaten. Dann solltest du eigentlich den DIB Header prüfen, ob 
es wirklich ein 24-bit ist, ob es evtl. komprimiert ist und ob die 
Bildgrösse passt.

Wenn das alles passt, schaufelst du das Bild ein. Das geht vermutlich 
wegen der Speicherorganisation nicht direkt ins TFT, sondern erst nach 
Umschnurzeln. Das zeigt dir aber z.B. die Demo, die beim Disco F429 
ursprünglich drauf ist.

Viel einfacher wird es, wenn du Bilder direkt im RAW Format speicherst, 
und dabei direkt nur dein eigenes Format berücksichtigst. RAW können 
aber nicht alle Bildverarbeiter erzeugen, musst du schauen, ob du da was 
passendes für dein OS findest.
Gast #4621193
Lesenswert?

Das läuft bei mir aufn stm32f103 mit ssd1963 800*480 Pixeln.

Beim stm32f429 müssen ja die Bilddaten ins sdram und dann aufs display, 
wie das umzusetzen ist damit komme ich noch richtig klar.



res = f_open(&fsrc, aa, FA_OPEN_EXISTING | FA_READ);   //´òÉÏͼƬÎļþÃû
  res = f_read(&fsrc, &bmp, sizeof(bmp), &br);
  if((bmp.pic_head[0]=='B')&&(bmp.pic_head[1]=='M'))
   {
  res = f_lseek(&fsrc, 
((bmp.pic_data_address_h<<16)|bmp.pic_data_address_l));


  for(tx=0;tx<bmp.pic_h_l;tx++){

              f_read(&fsrc, buffer, (bmp.pic_w_l)*3, &br);
               f_read(&fsrc, buffer, (bmp.pic_w_l), &br);
              for(ty=0;ty<bmp.pic_w_l;ty++){

                r_data = *(ty*3 +2+buffer);
                g_data = *(ty*3 +1+buffer);
                b_data = *(ty*3 +0+buffer);
                  point.x = tx;
                  point.y = ty;
                  point.r = r_data;
                  point.g = g_data;
                  point.b = b_data;
              //Èç¹ûÓÃÌṩ×ÊÁÏÉÏµÄÆÁÇý¶¯¡£DrawPixelº¯ÊýÀïÃæµÄX  YÊÇu8 
.Òª¸Ä³Éu16
                                LCD_SetPoint(point.y,point.x 
,RGB888ToRGB565(point.r,point.g,point.b));
              }
          }
    f_close(&fsrc);
   }
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren