Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2016:stm32f429-jpeg

Zadání

Na vývojové desce 32F429IDISCOVERY implementujte USB mass storage (MSD). Po nahrání JPEG souboru jej dekomprimujte pomocí vhodné knihovny (např. TJpgDec) a zobrazte na displeji vývojového kitu spolu s informacemi o obrázku.

Úvod

Cílem projektu je napsat program pro vývojovou desku STM32F429IDiscovery. Po připojení k počítači pomocí USB se má tato deska chovat jako mass storage (podobně jako např. flash disk). Pokud je nahrán obrázek ve formátu JPG, má být s pomocí vhodné knihovny zpracován a zobrazen na LCD displeji. Spolu s obrázkem mají být zobrazeny i základní informace o obrázku.

Hardware

V projektu byla použita vývojová deska 32F429IDISCOVERY s procesorem STM32F429ZIT6. Součástí desky je LCD displej o rozlišení 320×240 pixelů, který je ovládán pomocí LTDC (LCD TFT Display Controller) periferie procesoru. Dále deska obsahuje paměť SDRAM, která je nezbytná pro uložení obrazu LCD displeje, jelikož interní paměť procesoru nemá dostatečnou velikost.

dev_kit.jpg

Firmware

Kostra programu byla vygenerována pomocí programu STM32CubeMX [1], dále byly použity knihovny BSP z STM32CubeF4 [2], FatFS [3] a TJpgDec [4]. Jako vývojové prostředí byl použit Embitz s překladačem ARM gcc.

Obsluha SDRAM

Procesor přistupuje k paměti pomocí periferie FMC (Flexible Memory Controller). Inicializační kód pro FMC byl vygenerován pomocí STM32CubeMX. Bylo však potřeba doplnit funkci provádějící inicializační sekvenci paměti, která závisí na konkrétní použité paměti. Tato funkce (void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram)) byla převzata z [5]. Použitá paměť má kapacitu 8MB a je namapována na paměťový prostor 0xD0000000 až 0xD0800000. Tento prostor byl rozdělen následujícím způsobem:

  • 0xD0000000 až 0xD012FFFF- Paměť pro obrazová data LCD displeje (screen buffer)
  • 0xD0130000 až 0xD06FFFFF - Paměť pro mass storage (přibližně 6MB)
  • 0xD0700000 až 0xD0800000 - Paměť pro dekompresi obrázku

USB mass storage

Pomocí STM32CubeMX bylo USB nakonfigurováno jako „Device only“ a byla použita třída „Mass Storage Class“. Pro práci se souborovým systémem byla použita knihovna FatFS. Tato knihovna byla v STM32CubeMX nastavena pro použití externí SDRAM, ve které byla k tomuto účelu vyhrazena oblast o velikosti 6MB. Zápis a čtení z USB je přesměrován do této paměti (funkce int8_t STORAGE_Read_HS(…) a int8_t STORAGE_Write_HS(…) v usbd_storage_if.c.

Obsluha LCD

Pro inicializaci i obsluhu LCD byly použity BSP knihovny z STM32CubeF4. Tyto knihovny bylo třeba upravit. Musely být odstraněny funkce pro obsluhu nepoužitých periferií procesoru, jelikož závisely na HAL knihovnách, které nebyly z STM32CubeMX zkopírovány do projektu. Dále musela být z inicializace LCD odstraněna inicializace SDRAM, jelikož už byla provedena pro FatFS.

Dalším problémem bylo, že tyto knihovny uvažují orientaci LCD na výšku. Výhodnější je však orientovat displej na šířku, jelikož je tak orientována i většina obrázků. V přípaďe funkce pro zápis barvy pixelu (funkce void BSP_LCD_DrawPixel(…)) by stačilo prohodit souřanice pixelu, toto však není možné použít pro vykreslení textu (funkce void BSP_LCD_DisplayStringAt(…)). Byly proto vytvořeny nové funkce (void BSP_LCD_DrawPixel_Landscape(…), void BSP_LCD_DisplayStringAt_Landscape(…), void BSP_LCD_DisplayChar_Landscape(…)), které byly získány drobnou úpravou původních.

Zpracování a zobrazení obrázku

Pro zpracování obrázku byla použita knihovna TJpgDec. Tato knihovna používá pouze dvě API funkce, JRESULT jd_prepare(…) pro přípravu dekomprese a JRESULT jd_decomp(…) pro samotnou dekompresi jpg obrázku. Dále je třeba vytvořit dvě callback funkce pro čtení a zápis dat (UINT in_func(…), UINT out_func(…)). Postup zpracování obrázku závisí na jeho rozlišení, které je zjištěno při přípravě k dekompresi. Mohou nastat tyto případy:

  1. rozlišení obrázku souhlasí s rozlišením displeje
    Nejjednodušší případ, obrázek je vykreslován na displej již při dekompesi.
  2. jeden rozměr obrázku souhlasí s příslušným rozměrem displeje, druhý je menší
    Obrázek je také vykreslován už při dekompresi, je však posunut tak, aby byl na středu displeje. Před začátkem dekomprese je obsah displeje smazán, po stranách obrázku jsou tedy černé pruhy.
  3. obrázek je menší než displej, nebo naopak alespoň jeden rozměr obr. je větší, ale méně než dvojnásobek rozměru displeje
    Obrázek je dekomprimován do pomocného bufferu. Rozlišení je potom upraveno pomocí bilineární transformace a obrázek je vykreslen.
  4. alespoň jeden rozměr obrázku je větší než dvojnásobek příslušného rozměru displeje
    Obrázek je také dekomprimován do pomocného bufferu. Rozlišení obrázku je ale při dekompresi sníženo na 1/2, 1/4 nebo 1/8. To je nutné kvůli omezené velikosti paměti. Tento dělící poměr je zvolen tak, aby rozlišení po dekompresi bylo větší než rozlišení displeje, ale menší než dvojnásobné. Rozlišení dekomprimovaného obrázku je potom přizpůsobeno rozlišení displeje pomocí bilineární transformace a obrázek je zobrazen. Obrázek může mít rozlišení až 5120×3840 bodů (šestnáctinásobek rozlišení displeje).

Při dolním okraji displeje jsou potom vypsány údaje o obrázku - název souboru, rozlišení obrázku (původní) a velikost souboru.

Hlavní smyčka programu

Program v hlavní smyčce kontroluje stisk tlačítka. Po stisku tlačítka je odpojeno USB, aby nemohlo být manipulovováno se soubory, zatím co jsou zpracovávány mikrokontrolérem. Následně je prohledán kořenový adresář souborového sytému, zda neobsahuje nějaký soubor s příponou jpg. Předpokládá se přítomnost pouze jednoho obrázku, pokud jich je dostupných více, použije se ten, který je nalezen jako první. Poté je obrázek zpracován a zobrazen na displeji. Následně je vytvořen nový souborový sytém (všechny soubory jsou smazány) a USB je opět připojeno.

Závěr

Vývoj se obešel bez větších problémů a zadání se podařilo splnit v plném rozsahu. Níže je uvedeno video, které demonstruje funkci přípravku na obrázcích s různým rozlišením a poměrem stran.

Zdrojový kód: mpoa_projekt_voralek.zip

Použité zdroje

2016/stm32f429-jpeg.txt · Poslední úprava: 2017/01/15 21:04 autor: Jan Vorálek