STM32F4Discovery – připojte kameru přes rozhraní DCMI. Bezpečnostní informační portál STM32F4Discovery – připojte kameru přes rozhraní DCMI

  • Konzultace

STM32F4Discovery – připojte kameru přes rozhraní DCMI

Kdysi dávno propojení kamery z mobilu s mikrokontrolérem STM32F407VGT6(který se odehrává na desce STM32F4Discovery), ani jsem nepřemýšlel o tom, že tento ovladač má pro tuto záležitost speciální hardwarové rozhraní. Možná jsem nečetl pozorně datový list, ale vždy jsem si myslel, že rozhraní DCMI k dispozici pouze pro čipy v balení UFBGA176 A LQFP od 144 stop. Není to však tak dávno, co jsem objevil vyjádřený detail: 100nohý STM32F407 má na palubě také DCMI.
Vzhledem k tomu, že jsem velkým fanouškem studia a společného uvádění různého mobilního hardwaru (zejména LCD a fotoaparátů) s MK, nemohl jsem takový objev obejít a rozhodl jsem se vyplnit tuto mezeru ve studiu periferií STM32. Ve skutečnosti je tento materiál věnován popisu realizace nápadu, který vznikl.

Jen trocha teorie.

V první řadě je potřeba si představit, o čem je řeč – respektive co je to CMOS kamera a k čemu se používá.
Tento typ kamery vysílá informace ze snímače v digitální podobě: RGB, YCbCr a také v komprimované formě - JPEG. Různé fotoaparáty mají své vlastní nuance, pokud jde o schopnosti, budu zvažovat velmi specifický případ fotoaparátu s nízkým rozlišením (VGA, 640x480), který jsem vytáhl z telefonu v dávných dobách“ Siemens C72"(senzor PixelPlus PO2030N). Tato kamera je pro své snadné ovládání a příslušnost k víceméně běžnému typu nejvhodnější pro studium. Kdysi dávno jsem k tomu vyrobil malou desku (pro větší jednoduchost zapojení) - se stabilizátorem 2,8 V a pull-up odpory na sběrnici I2C. Tady to je (kabel a konektor kamery jsou skryty pod krytem).

Kromě nuancí v oblasti formátu dat se mohou kamery lišit také počtem synchronizačních pinů. Většina (podle mého názoru) senzorů má speciální horizontální a vertikální synchronizační piny; ale existují kamery, které mají pouze bodový bleskový výstup a dají vám vědět o začátku nového řádku/snímku pomocí speciálních přenášených kódů (např. 0x00 nebo 0xFF). Kamera, kterou mám, má externí synchronizační piny.
Můžete odhadnout přibližné schematické znázornění kamery ve formě bloku.

CMOS kamery jsou z velké části ovládány přes rozhraní I2C(ačkoli jsem viděl zařízení ovládaná UART). Prostřednictvím I2C se konfigurují různé parametry, jako je: rozlišení, barevný gamut, výstupní formát dat atd.
Závěr EXTCLK– taktování fotoaparátu, které je potřeba zajistit externě. DCLK– stroboskopický signál, podél jehož přední nebo zadní hrany jsou data zaznamenávána na datovou sběrnici kamery (například datový bajt jednoho pixelu matice nebo datový bajt „půlpixelu“, pokud kamera pracuje v RGB565). HSYNC– horizontální synchronizační signál označující začátek nového řádku a VSYNC– synchronizační signál, jehož aktivní úroveň označuje začátek nového rámce. Závěry D0..D7– datová sběrnice; U takových fotoaparátů je to zpravidla osmibitové.
Nyní si povíme více o synchronizačních signálech.

Grafy ukazují, že kamera je nakonfigurována pro aktivitu signálu DCLK pouze v aktivní fázi HSYNC(totiž právě tato fáze nás zajímá; hodinový signál během periody „line feed“ nás nezajímá). Pokud je kamera nastavena na rozlišení 320x240, pak při každém pulzu HSYNC Vejde se 320 pulzů DCLK a během období VSYNC – 240 HSYNC.
Když přiblížíme, vidíme, co se děje na datové sběrnici.

Na vzestupné hraně (v tomto případě) je z datové sběrnice odebrán bajt, který lze odeslat přímo na displej k zobrazení nebo „složit“ do vyrovnávací paměti pro následné zpracování.

Teoreticky je vše víceméně jasné, nyní o rozhraní DCMI mikrokontrolér STM32.

Rozhraní DCMI je schopen pracovat s datovou sběrnicí o šířce až 14 bitů, podporuje hardwarovou i softwarovou synchronizaci a také datové formáty: YCbCr, RGB a JPEG.
Kromě, DCMI obsahuje vyrovnávací paměť FIFO, má schopnost konfigurovat přerušení (včetně při plnění datového registru) a konfigurovat provoz přes DMA.

Přerušuje od DCMI lze volat, když nastanou následující podmínky: konec řádku, konec rámce, přetečení vyrovnávací paměti příjmu, zjištěna chyba synchronizace (s vnitřní synchronizací).
Byl jsem poněkud zmatený chybějícím speciálním výstupem hodin fotoaparátu. Nevím, proč vývojáři od Mikroelektronika SGS Bylo od toho upuštěno, ale pro mě by bylo velmi výhodné mít například přizpůsobitelný zdroj hodin.
Osobně jsem použil univerzální časovač-počítač zapnutý v režimu PWM pro generování obdélníkové vlny o frekvenci 4 MHz. S takovými hodinami samozřejmě nemůžete získat vysoké FPS, ale okamžitě udělám rezervaci - displej, který používám, není připojen k FSMC, proto nejdelší funkcí v celém řetězci je funkce výstupu LCD, proto při vyšší frekvenci selhává výstup obrazu na obrazovku. Proto před vyložením časovač vypnu a po něm časovač znovu zapnu.
Hardwarový modul DCMI obsahuje kromě datového registru deset řídicích/stavových registrů. Toto je: řídicí registr ( DCMI_CR), stavový registr ( DCMI_SR), registr stavu přerušení ( DCMI_RIS), registr povolení přerušení ( DCMI_IER), registr masky přerušení ( DCMI_MIS), příznak přerušení resetovat registr ( DCMI_ICR), registr interního hodinového kódu ( DCMI_ESCR), registr resetování vnitřní masky hodinového kódu ( DCMI_ESUR), registr počátečních hodnot při snímání části snímku ( DCMI_CWSTRT) a registr velikosti fragmentu snímku v režimu CropWindow ( DCMI_CWSIZE). A samozřejmě registr údajů - DCMI_DR.
V tomto případě nás registry související se snímáním části rámce a vnitřní synchronizací nezajímají. Také jsem se rozhodl prozatím nechat přerušení na pokoji, takže stojí za to podrobněji zvážit pouze řídicí registr DCMI_CR a stavový registr DCMI_SR.

Řídicí registr nám dává možnost zcela přizpůsobit formát interakce s kamerou: velikost datové sběrnice, aktivní úrovně linky HSYNC A VSYNC atd.

V pořadí. Bit UMOŽNIT– samozřejmostí je uvedení rozhraní do provozu. Pole EDM (rozšířený datový režim) – velikost datové sběrnice; Moje kamera má osmibitovou sběrnici, takže toto pole by mělo být nastaveno na „00“. Pole FCRC (ovládání rychlosti snímání snímků) umožňuje mírně upravit FPC: 00 – jsou zachyceny všechny příchozí snímky, 01 – každý druhý snímek, 10 – každý čtvrtý. Bity VSPOL A HSPOL– aktivní úrovně vertikálních a horizontálních synchronizačních čar. Aktivní úrovně jsou ignorovány a během aktivních období se nezachycují žádná data, to je třeba vzít v úvahu. PCKPOL– bit aktivní úrovně pixelového stroboskopu – na které hraně signálu číst data ze sběrnice: přední nebo zadní. ESS– bit pro výběr způsobu synchronizace: externí nebo interní. JPEG– výběr formátu příchozích dat – komprimovaný nebo nekomprimovaný. PLODINA– bit výběru zachycení fragmentu snímku ( ořezové okno). Pokud je tento bit nastaven na jedničku, rozhraní zachytí data v okně definovaném hodnotami v registrech DCMI_CWSTRT A DCMI_CWSIZE.

Takže, pojďme to nastavit.
Vzhledem k tomu, že jsem zvyklý používat standardní knihovnu periferií od ST (i když v prvních iteracích práce s novými periferiemi ji nikdy nepoužívám, dokud se nehrabu v registrech ručně), nastavil jsem nastavení pomocí knihovny.

Void DCMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureCaptureRate = DCMI_Capture_Capture_DCMode _ExtendedData Mode_8b DCMI_CamType.DCMI_SynchroMode = DCMI_SynchroMode_Hardware (ENABLE);
Vlastně pro mé potřeby bylo možné nedotknout se jediného bitu v registru DCMI_CR– ve výchozím nastavení jsou resetovány – kromě bitů ZACHYTIT A UMOŽNIT.
Rozhraní je nakonfigurováno a připraveno k použití. Po odeslání hodinového signálu do kamery začne rozhraní přijímat data, která potřebujeme zpracovat.
Pro začátek jsem si dal ten nejjednodušší úkol – zobrazit obraz na displeji, aby zpracování dat bylo minimální.
Stavový registr nám pomůže ve včasném čtení dat z přijímacího bufferu DCMI_SR.

Ke čtení je k dispozici velmi mizivý počet bitů – pouze tři. Bity HSYNC A VSYNC signalizovat stav odpovídajících linek: aktivní fáze, nebo line feed; nejzajímavější je ten kousek FNE. Říká nám, abychom naplnili vyrovnávací paměť daty. Nebo za nevyplnění.
Kontrola stavu bitu v předpřipravené smyčce FNE PROTI DCMI_SR, dozvíme se o příchodu dat do přijímací dvaatřicetibitové vyrovnávací paměti. V mém případě budou data umístěna takto:

Při nastavování bitu FNE ve stavovém registru DCMI_SR přijímací vyrovnávací paměť bude obsahovat čtyři bajty, data ze dvou sousedních pixelů: Byte0 A Byte1 – 16 pixelových bitů n, A Byte2 A Byte3 – 16 pixelových bitů n+1. Stačí je zkombinovat a poslat na displej. Takže hlavní smyčka vypadá takto:
while (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //Čekání na vyrovnávací paměť TIM_Cmd(TIM3, DISABLE); //Zakázání hodin CAM cam_grab = (DCMI->DR); //Čtecí vyrovnávací paměť SendDataByte_LCD (cam_grab = (DCMI->DR)>>16 //Čtení 2. části bufferu SendDataByte_LCD (cam_grab) //Znovu povolit hodiny CAM )
To znamená, že čekám na nastavení bitu FNE ve stavovém registru DCMI_SR a poté ve dvou krocích nahraji na displej 16 bitů dat.
V tomto bodě bych rád došel k logickému závěru, ale nebylo tomu tak.
Po flashnutí firmwaru a restartu MK jsem na displeji viděl... ne, viděl jsem vlastní velmi známou fyziku, ale v černých a modrých odstínech. Zcela chyběly červené a zelené barvy.
Po krátkém zúčtování s debuggerem bylo zjištěno následující: datový registr rozhraní obsahoval pouze 16 bitů dat na pixel, přičemž spodních 8 bitů bylo umístěno na místě. Byte0 (viz obrázek výše) a starší jsou na místě Byte2 . Prostory Byte1 A Byte3 byly prázdné. Doposud jsem nepochopil, kde se tento rozpor mezi dokumentací a realitou bere a možná se obrátím na STM.
Díky tomu se nám podařilo získat obraz z kamery pomocí rozhraní DCMI, i když ne bez jistých potíží. Na obrázku uvádím fotografii displeje, na kterém byl zobrazen obrázek demo desky STM32F3Discovery z mého fotoaparátu.

Zde je to, co uvidíme v závěrech: EXTCLK, PIXCK, HSYNC A VSYNC, pokud připojíte logický analyzátor.

Vše vypadá přesně podle očekávání: 240 pulzů HSYNC vejde se do doby trvání jedné VSYNC, 320 PIXCK- v jednom HSYNC. Během aktivní fáze HSYNC kamera neprodukuje signály PIXCK– přesně tak, jak byla nastavena.
Obecně řečeno, rozhraní mě trochu zklamalo. Absence „standardní“ taktovací nohy fotoaparátu, absence jakýchkoliv více či méně zajímavých vestavěných funkcí (co třeba hardwarový JPEG kodér?), a dokonce i tanec s tamburínou kolem polovičatého FIFO
Organizace práce s kamerou během přerušení PIXCK, HSYNC A VSYNC Nedělalo mi to tolik problémů jako práce s kamerou pomocí hardwaru DCMI.
Nicméně v blízké budoucnosti se pokusím zachytit rámeček a zkomprimovat ho do JPEG a zkuste zapsat obrázek na kartu SD.
PS. Pro každý případ dávám odkaz na projekt pro „ Kód::Bloky„- najednou se to někomu bude hodit.

Kdysi dávno propojení kamery z mobilu s mikrokontrolérem STM32F407VGT6(který se odehrává na desce STM32F4Discovery), ani jsem nepřemýšlel o tom, že tento ovladač má pro tuto záležitost speciální hardwarové rozhraní. Možná jsem nečetl pozorně datový list, ale vždy jsem si myslel, že rozhraní DCMI k dispozici pouze pro čipy v balení UFBGA176 A LQFP od 144 stop. Není to však tak dávno, co jsem objevil vyjádřený detail: 100nohý STM32F407 má na palubě také DCMI.
Vzhledem k tomu, že jsem velkým fanouškem studia a společného uvádění různého mobilního hardwaru (zejména LCD a fotoaparátů) s MK, nemohl jsem takový objev obejít a rozhodl jsem se vyplnit tuto mezeru ve studiu periferií STM32. Ve skutečnosti je tento materiál věnován popisu realizace nápadu, který vznikl.

Jen trocha teorie.

V první řadě je potřeba si představit, o čem je řeč – respektive co je to CMOS kamera a k čemu se používá.
Tento typ kamery vysílá informace ze snímače v digitální podobě: RGB, YCbCr a také v komprimované formě - JPEG. Různé fotoaparáty mají své vlastní nuance, pokud jde o schopnosti, budu zvažovat velmi specifický případ fotoaparátu s nízkým rozlišením (VGA, 640x480), který jsem vytáhl z telefonu v dávných dobách“ Siemens C72"(senzor PixelPlus PO2030N). Tato kamera je pro své snadné ovládání a příslušnost k víceméně běžnému typu nejvhodnější pro studium. Kdysi dávno jsem k tomu vyrobil malou desku (pro větší jednoduchost zapojení) - se stabilizátorem 2,8 V a pull-up odpory na sběrnici I2C. Tady to je (kabel a konektor kamery jsou skryty pod krytem).


Kromě nuancí v oblasti formátu dat se mohou kamery lišit také počtem synchronizačních pinů. Většina (podle mého názoru) senzorů má speciální horizontální a vertikální synchronizační piny; ale existují kamery, které mají pouze bodový bleskový výstup a dají vám vědět o začátku nového řádku/snímku pomocí speciálních přenášených kódů (např. 0x00 nebo 0xFF). Kamera, kterou mám, má externí synchronizační piny.
Můžete odhadnout přibližné schematické znázornění kamery ve formě bloku.


CMOS kamery jsou z velké části ovládány přes rozhraní I2C(ačkoli jsem viděl zařízení ovládaná UART). Prostřednictvím I2C se konfigurují různé parametry, jako je: rozlišení, barevný gamut, výstupní formát dat atd.
Závěr EXTCLK– taktování fotoaparátu, které je potřeba zajistit externě. DCLK– stroboskopický signál, podél jehož přední nebo zadní hrany jsou data zaznamenávána na datovou sběrnici kamery (například datový bajt jednoho pixelu matice nebo datový bajt „půlpixelu“, pokud kamera pracuje v RGB565). HSYNC– horizontální synchronizační signál označující začátek nového řádku a VSYNC– synchronizační signál, jehož aktivní úroveň označuje začátek nového rámce. Závěry D0..D7– datová sběrnice; U takových fotoaparátů je to zpravidla osmibitové.
Nyní si povíme více o synchronizačních signálech.


Grafy ukazují, že kamera je nakonfigurována pro aktivitu signálu DCLK pouze v aktivní fázi HSYNC(totiž právě tato fáze nás zajímá; hodinový signál během periody „line feed“ nás nezajímá). Pokud je kamera nastavena na rozlišení 320x240, pak při každém pulzu HSYNC Vejde se 320 pulzů DCLK a během období VSYNC – 240 HSYNC.
Když přiblížíme, vidíme, co se děje na datové sběrnici.


Na vzestupné hraně (v tomto případě) je z datové sběrnice odebrán bajt, který lze odeslat přímo na displej k zobrazení nebo „složit“ do vyrovnávací paměti pro následné zpracování.
Teoreticky je vše víceméně jasné, nyní o rozhraní DCMI mikrokontrolér STM32.
Rozhraní DCMI je schopen pracovat s datovou sběrnicí o šířce až 14 bitů, podporuje hardwarovou i softwarovou synchronizaci a také datové formáty: YCbCr, RGB a JPEG.
Kromě, DCMI obsahuje vyrovnávací paměť FIFO, má schopnost konfigurovat přerušení (včetně při plnění datového registru) a konfigurovat provoz přes DMA.


Přerušuje od DCMI lze volat, když nastanou následující podmínky: konec řádku, konec rámce, přetečení vyrovnávací paměti příjmu, zjištěna chyba synchronizace (s vnitřní synchronizací).
Byl jsem poněkud zmatený chybějícím speciálním výstupem hodin fotoaparátu. Nevím, proč vývojáři od Mikroelektronika SGS Bylo od toho upuštěno, ale pro mě by bylo velmi výhodné mít například přizpůsobitelný zdroj hodin.
Osobně jsem použil univerzální časovač-počítač zapnutý v režimu PWM pro generování obdélníkové vlny o frekvenci 4 MHz. S takovými hodinami samozřejmě nemůžete získat vysoké FPS, ale okamžitě udělám rezervaci - displej, který používám, není připojen k FSMC, proto nejdelší funkcí v celém řetězci je funkce výstupu LCD, proto při vyšší frekvenci selhává výstup obrazu na obrazovku. Proto před vyložením časovač vypnu a po něm časovač znovu zapnu.
Hardwarový modul DCMI obsahuje kromě datového registru deset řídicích/stavových registrů. Toto je: řídicí registr ( DCMI_CR), stavový registr ( DCMI_SR), registr stavu přerušení ( DCMI_RIS), registr povolení přerušení ( DCMI_IER), registr masky přerušení ( DCMI_MIS), příznak přerušení resetovat registr ( DCMI_ICR), registr interního hodinového kódu ( DCMI_ESCR), registr resetování vnitřní masky hodinového kódu ( DCMI_ESUR), registr počátečních hodnot při snímání části snímku ( DCMI_CWSTRT) a registr velikosti fragmentu snímku v režimu CropWindow ( DCMI_CWSIZE). A samozřejmě registr údajů - DCMI_DR.
V tomto případě nás registry související se snímáním části rámce a vnitřní synchronizací nezajímají. Také jsem se rozhodl prozatím nechat přerušení na pokoji, takže stojí za to podrobněji zvážit pouze řídicí registr DCMI_CR a stavový registr DCMI_SR.

Řídicí registr nám dává možnost zcela přizpůsobit formát interakce s kamerou: velikost datové sběrnice, aktivní úrovně linky HSYNC A VSYNC atd.


V pořadí. Bit UMOŽNIT– samozřejmostí je uvedení rozhraní do provozu. Pole EDM (rozšířený datový režim) – velikost datové sběrnice; Moje kamera má osmibitovou sběrnici, takže toto pole by mělo být nastaveno na „00“. Pole FCRC (ovládání rychlosti snímání snímků) umožňuje mírně upravit FPC: 00 – jsou zachyceny všechny příchozí snímky, 01 – každý druhý snímek, 10 – každý čtvrtý. Bity VSPOL A HSPOL– aktivní úrovně vertikálních a horizontálních synchronizačních čar. Aktivní úrovně jsou ignorovány a během aktivních období se nezachycují žádná data, to je třeba vzít v úvahu. PCKPOL– bit aktivní úrovně pixelového stroboskopu – na které hraně signálu číst data ze sběrnice: přední nebo zadní. ESS– bit pro výběr způsobu synchronizace: externí nebo interní. JPEG– výběr formátu příchozích dat – komprimovaný nebo nekomprimovaný. PLODINA– bit výběru zachycení fragmentu snímku ( ořezové okno). Pokud je tento bit nastaven na jedničku, rozhraní zachytí data v okně definovaném hodnotami v registrech DCMI_CWSTRT A DCMI_CWSIZE.
Takže, pojďme to nastavit. Vzhledem k tomu, že jsem zvyklý používat standardní knihovnu periferií od ST (i když v prvních iteracích práce s novými periferiemi ji nikdy nepoužívám, dokud se nehrabu v registrech ručně), nastavil jsem nastavení pomocí knihovny.

Void DCMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureCaptureRate = DCMI_Capture_Capture_DCMode _ExtendedData Mode_8b DCMI_CamType.DCMI_SynchroMode = DCMI_SynchroMode_Hardware (ENABLE);

Vlastně pro mé potřeby bylo možné nedotknout se jediného bitu v registru DCMI_CR– ve výchozím nastavení jsou resetovány – kromě bitů ZACHYTIT A UMOŽNIT.
Rozhraní je nakonfigurováno a připraveno k použití. Po odeslání hodinového signálu do kamery začne rozhraní přijímat data, která potřebujeme zpracovat.
Pro začátek jsem si dal ten nejjednodušší úkol – zobrazit obraz na displeji, aby zpracování dat bylo minimální.
Stavový registr nám pomůže ve včasném čtení dat z přijímacího bufferu DCMI_SR.

Ke čtení je k dispozici velmi mizivý počet bitů – pouze tři. Bity HSYNC A VSYNC signalizovat stav odpovídajících linek: aktivní fáze, nebo line feed; nejzajímavější je ten kousek FNE. Říká nám, abychom naplnili vyrovnávací paměť daty. Nebo za nevyplnění.
Kontrola stavu bitu v předpřipravené smyčce FNE PROTI DCMI_SR, dozvíme se o příchodu dat do přijímací dvaatřicetibitové vyrovnávací paměti. V mém případě budou data umístěna takto:

Při nastavování bitu FNE ve stavovém registru DCMI_SR přijímací vyrovnávací paměť bude obsahovat čtyři bajty, data ze dvou sousedních pixelů: Byte0 A Byte1 – 16 pixelových bitů n, A Byte2 A Byte3 – 16 pixelových bitů n+1. Stačí je zkombinovat a poslat na displej. Takže hlavní smyčka vypadá takto:

While (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //Čekání na vyrovnávací paměť TIM_Cmd(TIM3, DISABLE); //Zakázání hodin CAM cam_grab = (DCMI->DR); //Čtecí vyrovnávací paměť SendDataByte_LCD (cam_grab = (DCMI->DR)>>16 //Čtení 2. části bufferu SendDataByte_LCD (cam_grab) //Znovu povolit hodiny CAM )

To znamená, že čekám na nastavení bitu FNE ve stavovém registru DCMI_SR a poté ve dvou krocích nahraji na displej 16 bitů dat.
V tomto bodě bych rád došel k logickému závěru, ale nebylo tomu tak.
Po flashnutí firmwaru a restartu MK jsem na displeji viděl... ne, viděl jsem vlastní velmi známou fyziku, ale v černých a modrých odstínech. Zcela chyběly červené a zelené barvy.
Po krátkém zúčtování s debuggerem bylo zjištěno následující: datový registr rozhraní obsahoval pouze 16 bitů dat na pixel, přičemž spodních 8 bitů bylo umístěno na místě. Byte0 (viz obrázek výše) a starší jsou na místě Byte2 . Prostory Byte1 A Byte3 byly prázdné. Doposud jsem nepochopil, kde se tento rozpor mezi dokumentací a realitou bere a možná se obrátím na STM.
Díky tomu se nám podařilo získat obraz z kamery pomocí rozhraní DCMI, i když ne bez jistých potíží. Na obrázku uvádím fotografii displeje, na kterém byl zobrazen obrázek demo desky STM32F3Discovery z mého fotoaparátu.


Zde je to, co uvidíme v závěrech: EXTCLK, PIXCK, HSYNC A VSYNC, pokud připojíte logický analyzátor.


Vše vypadá přesně podle očekávání: 240 pulzů HSYNC vejde se do doby trvání jedné VSYNC, 320 PIXCK- v jednom HSYNC. Během aktivní fáze HSYNC kamera neprodukuje signály PIXCK– přesně tak, jak byla nastavena.
Obecně řečeno, rozhraní mě trochu zklamalo. Absence „standardní“ taktovací nohy fotoaparátu, absence jakýchkoliv více či méně zajímavých vestavěných funkcí (co třeba hardwarový JPEG kodér?), a dokonce i tanec s tamburínou kolem polovičatého FIFO
Organizace práce s kamerou během přerušení PIXCK, HSYNC A VSYNC Nedělalo mi to tolik problémů jako práce s kamerou pomocí hardwaru DCMI.
Nicméně v blízké budoucnosti se pokusím zachytit rámeček a zkomprimovat ho do JPEG a zkuste zapsat obrázek na kartu SD.
PS. Pro každý případ dávám odkaz na projekt pro „ Kód::Bloky„- najednou se to někomu bude hodit.

Nebo zpomalené natáčení je natáčení s frekvencí nižší, než je standardní frekvence snímání a promítání 24 snímků za sekundu.

Poté, co jsem začal studovat mikrokontroléry STM32 a napsal jsem "HelloWorld" s blikající LED, uvědomil jsem si, že pro lepší pochopení fungování STM32 musím implementovat něco složitějšího s použitím více periferií mikrokontroléru. Tak vznikla myšlenka vytvořit časosběrnou kameru.

Fotoaparát, který jsem vyvinul, pořídí fotografie přibližně jednou za 5 sekund a uloží je na SD kartu ve formátu jpeg. Dále je třeba je zkombinovat v počítači do videosouboru.

K vytvoření kamery jsem použil následující komponenty:

Karta se připojuje pomocí dvou funkcí:
1. Použití funkce disk_initialize karta je inicializována.
2. Dále je potřeba jej namontovat f_mount.

Po úspěšném dokončení těchto kroků můžete s kartou provádět různé operace, například:
1. f_open- otevření souboru,
2. f_close– uzavření souboru;
3. f_mkdir– vytvoření adresáře;
4. f_chdir– výběr adresáře;
5. f_write– zápis do souboru;
6. f_read– čtení ze souboru.

Popsal jsem, jak pracovat s fotoaparátem a SD kartou, nyní se podívejme, jak program funguje jako celek:
1. Inicializujte SD kartu;
2. Inicializujte modul kamery;
3. Otevřete soubor time.txt (soubor by měl obsahovat jeden řádek formátu 01.01.2014_12:00 ), který ukládá čas pro počítání časovače RTC;
4. Přečtěte si čas a datum ze souboru a nastavte RTC;
5. Zavřete soubor time.txt;
6. Vytvořte adresář pro ukládání fotografií „LinkSpritePhoto“;
7. Když stisknete tlačítko PA0 na desce, pořiďte fotografii a uložte ji na kartu (Během fotografování svítí modrá LED);
8. Pokud se některá z funkcí neprovede, propadneme se do nekonečné smyčky a rozblikáme zelenou LED.

Chcete-li spustit fotoaparát v nepřetržitém režimu, musíte v main.c odkomentovat následující řádky:

//EnabledButtonStart = 101; // Pro spuštění ve smyčce odkomentujte tento řádek //Delay(300); // Zpoždění spuštění ve smyčce
A okomentujte tento řádek:

EnabledButtonStart = 0; // Chcete-li spustit ve smyčce, zakomentujte tento řádek
Poté, když jej zapnete, začne fotoaparát nepřetržitě fotit.

Obecně jsem sestavil popis fungování tohoto fotoaparátu a nyní mohu ukázat výsledek práce.

  • Konzultace

STM32F4Discovery – připojte kameru přes rozhraní DCMI

Kdysi dávno propojení kamery z mobilu s mikrokontrolérem STM32F407VGT6(který se odehrává na desce STM32F4Discovery), ani jsem nepřemýšlel o tom, že tento ovladač má pro tuto záležitost speciální hardwarové rozhraní. Možná jsem nečetl pozorně datový list, ale vždy jsem si myslel, že rozhraní DCMI k dispozici pouze pro čipy v balení UFBGA176 A LQFP od 144 stop. Není to však tak dávno, co jsem objevil vyjádřený detail: 100nohý STM32F407 má na palubě také DCMI.
Vzhledem k tomu, že jsem velkým fanouškem studia a společného uvádění různého mobilního hardwaru (zejména LCD a fotoaparátů) s MK, nemohl jsem takový objev obejít a rozhodl jsem se vyplnit tuto mezeru ve studiu periferií STM32. Ve skutečnosti je tento materiál věnován popisu realizace nápadu, který vznikl.

Jen trocha teorie.

V první řadě je potřeba si představit, o čem je řeč – respektive co je to CMOS kamera a k čemu se používá.
Tento typ kamery vysílá informace ze snímače v digitální podobě: RGB, YCbCr a také v komprimované formě - JPEG. Různé fotoaparáty mají své vlastní nuance, pokud jde o schopnosti, budu zvažovat velmi specifický případ fotoaparátu s nízkým rozlišením (VGA, 640x480), který jsem vytáhl z telefonu v dávných dobách“ Siemens C72"(senzor PixelPlus PO2030N). Tato kamera je pro své snadné ovládání a příslušnost k víceméně běžnému typu nejvhodnější pro studium. Kdysi dávno jsem k tomu vyrobil malou desku (pro větší jednoduchost zapojení) - se stabilizátorem 2,8 V a pull-up odpory na sběrnici I2C. Tady to je (kabel a konektor kamery jsou skryty pod krytem).

Kromě nuancí v oblasti formátu dat se mohou kamery lišit také počtem synchronizačních pinů. Většina (podle mého názoru) senzorů má speciální horizontální a vertikální synchronizační piny; ale existují kamery, které mají pouze bodový bleskový výstup a dají vám vědět o začátku nového řádku/snímku pomocí speciálních přenášených kódů (např. 0x00 nebo 0xFF). Kamera, kterou mám, má externí synchronizační piny.
Můžete odhadnout přibližné schematické znázornění kamery ve formě bloku.

CMOS kamery jsou z velké části ovládány přes rozhraní I2C(ačkoli jsem viděl zařízení ovládaná UART). Prostřednictvím I2C se konfigurují různé parametry, jako je: rozlišení, barevný gamut, výstupní formát dat atd.
Závěr EXTCLK– taktování fotoaparátu, které je potřeba zajistit externě. DCLK– stroboskopický signál, podél jehož přední nebo zadní hrany jsou data zaznamenávána na datovou sběrnici kamery (například datový bajt jednoho pixelu matice nebo datový bajt „půlpixelu“, pokud kamera pracuje v RGB565). HSYNC– horizontální synchronizační signál označující začátek nového řádku a VSYNC– synchronizační signál, jehož aktivní úroveň označuje začátek nového rámce. Závěry D0..D7– datová sběrnice; U takových fotoaparátů je to zpravidla osmibitové.
Nyní si povíme více o synchronizačních signálech.

Grafy ukazují, že kamera je nakonfigurována pro aktivitu signálu DCLK pouze v aktivní fázi HSYNC(totiž právě tato fáze nás zajímá; hodinový signál během periody „line feed“ nás nezajímá). Pokud je kamera nastavena na rozlišení 320x240, pak při každém pulzu HSYNC Vejde se 320 pulzů DCLK a během období VSYNC – 240 HSYNC.
Když přiblížíme, vidíme, co se děje na datové sběrnici.

Na vzestupné hraně (v tomto případě) je z datové sběrnice odebrán bajt, který lze odeslat přímo na displej k zobrazení nebo „složit“ do vyrovnávací paměti pro následné zpracování.

Teoreticky je vše víceméně jasné, nyní o rozhraní DCMI mikrokontrolér STM32.

Rozhraní DCMI je schopen pracovat s datovou sběrnicí o šířce až 14 bitů, podporuje hardwarovou i softwarovou synchronizaci a také datové formáty: YCbCr, RGB a JPEG.
Kromě, DCMI obsahuje vyrovnávací paměť FIFO, má schopnost konfigurovat přerušení (včetně při plnění datového registru) a konfigurovat provoz přes DMA.

Přerušuje od DCMI lze volat, když nastanou následující podmínky: konec řádku, konec rámce, přetečení vyrovnávací paměti příjmu, zjištěna chyba synchronizace (s vnitřní synchronizací).
Byl jsem poněkud zmatený chybějícím speciálním výstupem hodin fotoaparátu. Nevím, proč vývojáři od Mikroelektronika SGS Bylo od toho upuštěno, ale pro mě by bylo velmi výhodné mít například přizpůsobitelný zdroj hodin.
Osobně jsem použil univerzální časovač-počítač zapnutý v režimu PWM pro generování obdélníkové vlny o frekvenci 4 MHz. S takovými hodinami samozřejmě nemůžete získat vysoké FPS, ale okamžitě udělám rezervaci - displej, který používám, není připojen k FSMC, proto nejdelší funkcí v celém řetězci je funkce výstupu LCD, proto při vyšší frekvenci selhává výstup obrazu na obrazovku. Proto před vyložením časovač vypnu a po něm časovač znovu zapnu.
Hardwarový modul DCMI obsahuje kromě datového registru deset řídicích/stavových registrů. Toto je: řídicí registr ( DCMI_CR), stavový registr ( DCMI_SR), registr stavu přerušení ( DCMI_RIS), registr povolení přerušení ( DCMI_IER), registr masky přerušení ( DCMI_MIS), příznak přerušení resetovat registr ( DCMI_ICR), registr interního hodinového kódu ( DCMI_ESCR), registr resetování vnitřní masky hodinového kódu ( DCMI_ESUR), registr počátečních hodnot při snímání části snímku ( DCMI_CWSTRT) a registr velikosti fragmentu snímku v režimu CropWindow ( DCMI_CWSIZE). A samozřejmě registr údajů - DCMI_DR.
V tomto případě nás registry související se snímáním části rámce a vnitřní synchronizací nezajímají. Také jsem se rozhodl prozatím nechat přerušení na pokoji, takže stojí za to podrobněji zvážit pouze řídicí registr DCMI_CR a stavový registr DCMI_SR.

Řídicí registr nám dává možnost zcela přizpůsobit formát interakce s kamerou: velikost datové sběrnice, aktivní úrovně linky HSYNC A VSYNC atd.

V pořadí. Bit UMOŽNIT– samozřejmostí je uvedení rozhraní do provozu. Pole EDM (rozšířený datový režim) – velikost datové sběrnice; Moje kamera má osmibitovou sběrnici, takže toto pole by mělo být nastaveno na „00“. Pole FCRC (ovládání rychlosti snímání snímků) umožňuje mírně upravit FPC: 00 – jsou zachyceny všechny příchozí snímky, 01 – každý druhý snímek, 10 – každý čtvrtý. Bity VSPOL A HSPOL– aktivní úrovně vertikálních a horizontálních synchronizačních čar. Aktivní úrovně jsou ignorovány a během aktivních období se nezachycují žádná data, to je třeba vzít v úvahu. PCKPOL– bit aktivní úrovně pixelového stroboskopu – na které hraně signálu číst data ze sběrnice: přední nebo zadní. ESS– bit pro výběr způsobu synchronizace: externí nebo interní. JPEG– výběr formátu příchozích dat – komprimovaný nebo nekomprimovaný. PLODINA– bit výběru zachycení fragmentu snímku ( ořezové okno). Pokud je tento bit nastaven na jedničku, rozhraní zachytí data v okně definovaném hodnotami v registrech DCMI_CWSTRT A DCMI_CWSIZE.

Takže, pojďme to nastavit.
Vzhledem k tomu, že jsem zvyklý používat standardní knihovnu periferií od ST (i když v prvních iteracích práce s novými periferiemi ji nikdy nepoužívám, dokud se nehrabu v registrech ručně), nastavil jsem nastavení pomocí knihovny.

Void DCMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureCaptureRate = DCMI_Capture_Capture_DCMode _ExtendedData Mode_8b DCMI_CamType.DCMI_SynchroMode = DCMI_SynchroMode_Hardware (ENABLE);
Vlastně pro mé potřeby bylo možné nedotknout se jediného bitu v registru DCMI_CR– ve výchozím nastavení jsou resetovány – kromě bitů ZACHYTIT A UMOŽNIT.
Rozhraní je nakonfigurováno a připraveno k použití. Po odeslání hodinového signálu do kamery začne rozhraní přijímat data, která potřebujeme zpracovat.
Pro začátek jsem si dal ten nejjednodušší úkol – zobrazit obraz na displeji, aby zpracování dat bylo minimální.
Stavový registr nám pomůže ve včasném čtení dat z přijímacího bufferu DCMI_SR.

Ke čtení je k dispozici velmi mizivý počet bitů – pouze tři. Bity HSYNC A VSYNC signalizovat stav odpovídajících linek: aktivní fáze, nebo line feed; nejzajímavější je ten kousek FNE. Říká nám, abychom naplnili vyrovnávací paměť daty. Nebo za nevyplnění.
Kontrola stavu bitu v předpřipravené smyčce FNE PROTI DCMI_SR, dozvíme se o příchodu dat do přijímací dvaatřicetibitové vyrovnávací paměti. V mém případě budou data umístěna takto:

Při nastavování bitu FNE ve stavovém registru DCMI_SR přijímací vyrovnávací paměť bude obsahovat čtyři bajty, data ze dvou sousedních pixelů: Byte0 A Byte1 – 16 pixelových bitů n, A Byte2 A Byte3 – 16 pixelových bitů n+1. Stačí je zkombinovat a poslat na displej. Takže hlavní smyčka vypadá takto:
while (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //Čekání na vyrovnávací paměť TIM_Cmd(TIM3, DISABLE); //Zakázání hodin CAM cam_grab = (DCMI->DR); //Čtecí vyrovnávací paměť SendDataByte_LCD (cam_grab = (DCMI->DR)>>16 //Čtení 2. části bufferu SendDataByte_LCD (cam_grab) //Znovu povolit hodiny CAM )
To znamená, že čekám na nastavení bitu FNE ve stavovém registru DCMI_SR a poté ve dvou krocích nahraji na displej 16 bitů dat.
V tomto bodě bych rád došel k logickému závěru, ale nebylo tomu tak.
Po flashnutí firmwaru a restartu MK jsem na displeji viděl... ne, viděl jsem vlastní velmi známou fyziku, ale v černých a modrých odstínech. Zcela chyběly červené a zelené barvy.
Po krátkém zúčtování s debuggerem bylo zjištěno následující: datový registr rozhraní obsahoval pouze 16 bitů dat na pixel, přičemž spodních 8 bitů bylo umístěno na místě. Byte0 (viz obrázek výše) a starší jsou na místě Byte2 . Prostory Byte1 A Byte3 byly prázdné. Doposud jsem nepochopil, kde se tento rozpor mezi dokumentací a realitou bere a možná se obrátím na STM.
Díky tomu se nám podařilo získat obraz z kamery pomocí rozhraní DCMI, i když ne bez jistých potíží. Na obrázku uvádím fotografii displeje, na kterém byl zobrazen obrázek demo desky STM32F3Discovery z mého fotoaparátu.

Zde je to, co uvidíme v závěrech: EXTCLK, PIXCK, HSYNC A VSYNC, pokud připojíte logický analyzátor.

Vše vypadá přesně podle očekávání: 240 pulzů HSYNC vejde se do doby trvání jedné VSYNC, 320 PIXCK- v jednom HSYNC. Během aktivní fáze HSYNC kamera neprodukuje signály PIXCK– přesně tak, jak byla nastavena.
Obecně řečeno, rozhraní mě trochu zklamalo. Absence „standardní“ taktovací nohy fotoaparátu, absence jakýchkoliv více či méně zajímavých vestavěných funkcí (co třeba hardwarový JPEG kodér?), a dokonce i tanec s tamburínou kolem polovičatého FIFO
Organizace práce s kamerou během přerušení PIXCK, HSYNC A VSYNC Nedělalo mi to tolik problémů jako práce s kamerou pomocí hardwaru DCMI.
Nicméně v blízké budoucnosti se pokusím zachytit rámeček a zkomprimovat ho do JPEG a zkuste zapsat obrázek na kartu SD.
PS. Pro každý případ dávám odkaz na projekt pro „ Kód::Bloky„- najednou se to někomu bude hodit.

Karta se připojuje pomocí dvou funkcí:
1. Použití funkce disk_initialize karta je inicializována.
2. Dále je potřeba jej namontovat f_mount.

Po úspěšném dokončení těchto kroků můžete s kartou provádět různé operace, například:
1. f_open- otevření souboru,
2. f_close– uzavření souboru;
3. f_mkdir– vytvoření adresáře;
4. f_chdir– výběr adresáře;
5. f_write– zápis do souboru;
6. f_read– čtení ze souboru.

Popsal jsem, jak pracovat s fotoaparátem a SD kartou, nyní se podívejme, jak program funguje jako celek:
1. Inicializujte SD kartu;
2. Inicializujte modul kamery;
3. Otevřete soubor time.txt (soubor by měl obsahovat jeden řádek formátu 01.01.2014_12:00 ), který ukládá čas pro počítání časovače RTC;
4. Přečtěte si čas a datum ze souboru a nastavte RTC;
5. Zavřete soubor time.txt;
6. Vytvořte adresář pro ukládání fotografií „LinkSpritePhoto“;
7. Když stisknete tlačítko PA0 na desce, pořiďte fotografii a uložte ji na kartu (Během fotografování svítí modrá LED);
8. Pokud se některá z funkcí neprovede, propadneme se do nekonečné smyčky a rozblikáme zelenou LED.

Chcete-li spustit fotoaparát v nepřetržitém režimu, musíte v main.c odkomentovat následující řádky:

//EnabledButtonStart = 101; // Pro spuštění ve smyčce odkomentujte tento řádek //Delay(300); // Zpoždění spuštění ve smyčce
A okomentujte tento řádek:

EnabledButtonStart = 0; // Chcete-li spustit ve smyčce, zakomentujte tento řádek
Poté, když jej zapnete, začne fotoaparát nepřetržitě fotit.

Obecně jsem sestavil popis fungování tohoto fotoaparátu a nyní mohu ukázat výsledek práce.




Nahoru