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.
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.
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.
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.
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:
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
.
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.
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:
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.
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.
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
[1]http://www.st.com/en/development-tools/stm32cubemx.html
[2]http://www.st.com/en/embedded-software/stm32cubef4.html
[3]http://elm-chan.org/fsw/ff/00index_e.html
[4]http://elm-chan.org/fsw/tjpgd/00index.html
[5]http://www.st.com/en/embedded-software/stm32cubef4.html
STM32Cube_FW_F4_V1.14.0\Projects\STM32F429I-Discovery\Examples\FMC\FMC_SDRAM\
Obrázek vývojové desky:
http://cz.rs-online.com/web/p/vyvojove-sady-pro-procesory-a-mikrokontrolery/7892815/
Obrázky použité v demonstračním videu:
http://imagedatabase.cs.washington.edu/demo/P7180319.jpg
http://maxpixel.freegreatpicture.com/static/photo/640/Nepal-The-Himalayas-Mountain-Mountains-Ama-Dablam-1664805.jpg
https://believinginchristjesus.files.wordpress.com/2013/08/eagle.jpg
https://clairemcc155.files.wordpress.com/2013/10/bearded-dragon-lizard.jpg
http://animal-dream.com/data_images/lizard/lizard4.jpg
http://paper4pc.com/?module=images&act=downloadResize&file=nature-wallpapers-hd-wallpaper-3.jpg&x=5120x2048&y=