STM32F4Discovery – spojite kameru putem DCMI sučelja. Portal sigurnosnih informacija STM32F4Discovery – povežite kameru preko DCMI sučelja

  • Tutorial

STM32F4Discovery – spojite kameru preko DCMI sučelja

Bilo jednom spajanje kamere s mobitela na mikrokontroler STM32F407VGT6(koja se odvija na ploči STM32F4Discovery), nisam ni razmišljao o tome da ovaj kontroler ima posebno hardversko sučelje za tu svrhu. Možda nisam pažljivo pročitao podatkovnu tablicu, ali uvijek sam mislio da je sučelje DCMI dostupno samo za čips u pakiranju UFBGA176 I LQFP od 144 stope. Međutim, ne tako davno, otkrio sam izraženi detalj: 100-legged STM32F407 također ima DCMI na brodu.
Budući da sam veliki obožavatelj proučavanja i zajedničkog lansiranja različitog mobilnog hardvera (osobito LCD-a i kamera) s MK-om, jednostavno nisam mogao proći pored takvog otkrića i odlučio sam popuniti ovu prazninu u proučavanju STM32 periferije. Zapravo, ovaj materijal posvećen je opisu provedbe ideje koja se pojavila.

Samo malo teorije.

Prije svega, trebate zamisliti o čemu govorimo - odnosno što je CMOS kamera i za što se koristi.
Ova vrsta kamere daje informacije sa senzora u digitalnom obliku: RGB, YCbCr, a također iu komprimiranom obliku - JPEG. Različite kamere imaju svoje nijanse u pogledu mogućnosti, razmotrit ću vrlo specifičan slučaj kamere niske rezolucije (VGA, 640x480), koju sam izvukao iz svog telefona u davna vremena " Siemens C72"(senzor PixelPlus PO2030N). Ova kamera je najprikladnija za proučavanje zbog jednostavnosti rada i pripadnosti manje-više uobičajenom tipu. Davno sam napravio malu pločicu za to (radi lakšeg povezivanja) - sa stabilizatorom od 2,8 V i pull-up otpornicima na sabirnici I2C. Evo ga (kabel i konektor za kameru skriveni su ispod kućišta).

Osim po nijansama na polju formata podataka, kamere se mogu razlikovati i po broju pinova za sinkronizaciju. Većina (po mom mišljenju) senzora ima posebne vodoravne i okomite sinkronizacijske pinove; ali postoje kamere koje imaju samo stroboskopski izlaz piksela i obavještavaju vas o početku novog retka/kadra pomoću posebnih odaslanih kodova (npr. 0x00 ili 0xFF). Kamera koju imam ima eksterne sinkronizacijske pinove.
Možete procijeniti približan shematski prikaz kamere u obliku bloka.

Uglavnom se CMOS kamerama upravlja preko sučelja I2C(iako sam vidio uređaje kojima upravlja UART). Putem I2C konfiguriraju se različiti parametri, kao što su: rezolucija, raspon boja, format izlaznih podataka itd.
Zaključak EXTCLK– taktiranje kamere, koje treba osigurati izvana. DCLK– stroboskopski signal, duž čijeg se prednjeg ili silaznog ruba podaci bilježe na podatkovnoj sabirnici kamere (na primjer, podatkovni bajt jednog piksela matrice ili podatkovni bajt "pola piksela" ako kamera radi u način rada RGB565). HSYNC– horizontalni signal sinkronizacije koji označava početak novog retka, i VSYNC– signal sinkronizacije čija aktivna razina označava početak novog okvira. zaključke D0..D7- sabirnica podataka; U pravilu je za takve kamere osmobitni.
Razgovarajmo sada više o signalima sinkronizacije.

Grafikoni pokazuju da je kamera konfigurirana za aktivnost signala DCLK samo tijekom aktivne faze HSYNC(naime, to je faza koja nas zanima; signal sata u razdoblju “line feed” nam nije zanimljiv). Ako je kamera postavljena na rezoluciju 320x240, tada tijekom svakog pulsa HSYNC 320 impulsa odgovara DCLK, i tijekom razdoblja VSYNC – 240 HSYNC.
Kad zumiramo, vidimo što se događa na podatkovnoj sabirnici.

Na uzlaznom rubu (u ovom slučaju), bajt se uklanja iz podatkovne sabirnice, koji se može poslati izravno na zaslon za prikaz ili "presaviti" u međuspremnik za naknadnu obradu.

U teoriji je sve više-manje jasno, sada o sučelju DCMI mikrokontroler STM32.

Sučelje DCMI sposoban je raditi s podatkovnom sabirnicom širine do 14 bita, podržava hardversku i softversku sinkronizaciju, kao i podatkovne formate: YCbCr, RGB i JPEG.
Osim, DCMI sadrži međuspremnik FIFO, ima mogućnost konfiguriranja prekida (uključujući prilikom popunjavanja registra podataka) i konfiguriranja rada putem DMA.

Prekidi od DCMI može se pozvati kada se pojave sljedeći uvjeti: kraj linije, kraj okvira, prekoračenje međuspremnika za primanje, detektirana pogreška sinkronizacije (s internom sinkronizacijom).
Bio sam pomalo zbunjen nedostatkom posebnog izlaza sata kamere. Ne znam zašto programeri iz SGS mikroelektronika Bio je napušten, ali za mene bi bilo vrlo zgodno imati, na primjer, prilagodljiv izvor sata.
Osobno sam koristio tajmer-brojač opće namjene uključen u PWM modu za generiranje kvadratnog vala s frekvencijom od 4 MHz. Naravno, ne možete dobiti visok FPS s takvim satom, ali odmah ću rezervirati - zaslon koji koristim nije povezan s FSMC, dakle, najduža funkcija u cijelom lancu je funkcija LCD izlaza, stoga, na višoj frekvenciji, izlaz slike na zaslon ne uspijeva. Stoga, prije istovara, isključim mjerač vremena, a nakon toga ponovno uključim mjerač vremena.
Hardverski modul DCMI sadrži, osim registra podataka, deset kontrolnih/statusnih registara. Ovo je: kontrolni registar ( DCMI_CR), registar stanja ( DCMI_SR), registar statusa prekida ( DCMI_RIS), registar omogućivanja prekida ( DCMI_IER), registar maske prekida ( DCMI_MIS), registar resetiranja oznake prekida ( DCMI_ICR), interni registar koda sata ( DCMI_ESCR), registar resetiranja maske internog koda sata ( DCMI_ESUR), registar početnih vrijednosti pri snimanju dijela okvira ( DCMI_CWSTRT) i registar veličine fragmenta okvira u načinu CropWindow ( DCMI_CWSIZE). I, naravno, registar podataka - DCMI_DR.
U ovom slučaju nas ne zanimaju registri koji se odnose na snimanje dijela okvira i internu sinkronizaciju. Također sam odlučio za sada ostaviti prekide na miru, pa je vrijedno detaljnije razmotriti samo kontrolni registar DCMI_CR i statusni registar DCMI_SR.

Kontrolni registar daje nam mogućnost potpunog prilagođavanja formata interakcije s kamerom: veličina sabirnice podataka, razine aktivnih linija HSYNC I VSYNC itd.

U redu. bit OMOGUĆITI– podrazumijeva se da je sučelje pušteno u rad. Polje EDM (prošireni podatkovni način) – veličina sabirnice podataka; Moj fotoaparat ima osmobitnu sabirnicu, tako da ovo polje treba postaviti na "00". Polje FCRC (kontrola brzine snimanja okvira) omogućuje lagano podešavanje FPC-a: 00 – snimaju se svi dolazni okviri, 01 – svaki drugi okvir, 10 – svaki četvrti. Komadići VSPOL I HSPOL– aktivne razine vodova vertikalne i horizontalne sinkronizacije. Aktivne razine se zanemaruju i podaci se ne bilježe tijekom aktivnih razdoblja, to treba uzeti u obzir. PCKPOL– bit aktivne razine stroboskopa piksela – na kojem rubu signala čitati podatke sa sabirnice: prednjem ili stražnjem. ESS– bit za odabir načina sinkronizacije: eksterne ili interne. JPEG– izbor formata dolaznih podataka – komprimirani ili ne. USJEV– bit odabira snimanja fragmenta okvira ( prozor usjeva). Ako je ovaj bit postavljen na jedan, sučelje će uhvatiti podatke u prozoru definiranom vrijednostima u registrima DCMI_CWSTRT I DCMI_CWSIZE.

Pa, postavimo to.
Budući da sam navikao koristiti standardnu ​​biblioteku perifernih uređaja iz ST-a (iako je u prvim iteracijama rada s novim perifernim uređajima nikada ne koristim dok ručno ne petljam s registrima), postavio sam postavke pomoću biblioteke.

Void DCMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_CamType .DCMI_ExtendedDataMode_8b; DCMI_SynchroMode_Hardware; DCMI_CamType(ENABLE);
Zapravo, za moje potrebe bilo je moguće ne dirati niti jedan bit u registru DCMI_CR– prema zadanim su postavkama resetirani – osim bitova UHVATITI I OMOGUĆITI.
Sučelje je konfigurirano i spremno za korištenje. Nakon slanja signala sata kameri, sučelje će početi primati podatke koje trebamo obraditi.
Za početak sam si postavio najjednostavniji zadatak - prikazati sliku na displeju, kako bi obrada podataka bila minimalna.
Statusni registar pomoći će nam u pravodobnom očitavanju podataka iz prijemnog međuspremnika DCMI_SR.

Za čitanje je dostupan vrlo mali broj bitova - samo tri. Komadići HSYNC I VSYNC signalizira stanje odgovarajućih vodova: aktivna faza ili pomak linije; najzanimljivija stvar je bit FNE. Govori nam da ispunimo međuspremnik podacima. Ili zato što ga niste ispunili.
Provjera stanja bita u standardnoj petlji FNE V DCMI_SR, saznajemo o pristizanju podataka u prijemni tridesetdvobitni međuspremnik. U mom slučaju podaci će se nalaziti ovako:

Prilikom postavljanja nastavka FNE u statusnom registru DCMI_SR prijemni međuspremnik će sadržavati četiri bajta, podatke iz dva susjedna piksela: Bajt0 I Bajt1 – 16 bitova piksela n, A Bajt2 I Bajt3 – 16 bitova piksela n+1. Sve što trebam učiniti je spojiti ih i poslati na zaslon. Dakle, ovako izgleda glavna petlja:
while (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //Čeka se međuspremnik TIM_Cmd(TIM3, DISABLE); //Onemogući CAM sat cam_grab = (DCMI->DR); //Čitanje međuspremnika SendDataByte_LCD (cam_grab); //Ponovno uključivanje CAM sata )
Odnosno, čekam da se postavi bit FNE u statusnom registru DCMI_SR, a zatim učitavam 16 bita podataka na zaslon u dva koraka.
U ovom trenutku želio bih doći do logičnog zaključka, ali nije bilo tako.
Nakon bljeskanja firmvera i ponovnog pokretanja MK-a, vidio sam na zaslonu... ne, vidio sam svoju vrlo poznatu fiziku, ali u crno-plavim nijansama. Crvena i zelena boja bile su potpuno odsutne.
Nakon kratkog obračuna s debuggerom, otkriveno je sljedeće: registar podataka sučelja sadržavao je samo 16 bitova podataka za jedan piksel, s nižih 8 bitova na mjestu Bajt0 (vidi sliku gore), a starješine su na mjestu Bajt2 . Razmaci Bajt1 I Bajt3 bile su prazne. Do sada mi nije bilo jasno otkud to neslaganje između dokumentacije i stvarnosti, a možda se obratim STM-u.
Kao rezultat, uspjeli smo dobiti sliku s kamere pomoću sučelja DCMI, iako ne bez nekih poteškoća. Na slici prikazujem fotografiju displeja na kojem je bila prikazana slika demo ploče STM32F3Discovery iz moje kamere.

Evo što ćemo vidjeti u zaključcima: EXTCLK, PIXCK, HSYNC I VSYNC, ako spojite logički analizator.

Sve izgleda točno kako se i očekivalo: 240 impulsa HSYNC uklapa se u trajanje jednog VSYNC, 320 PIXCK- u jednom HSYNC. Tijekom aktivne faze HSYNC kamera ne proizvodi signale PIXCK– točno onako kako je postavljena.
Općenito govoreći, sučelje me malo razočaralo. Nepostojanje “standardne” taktne noge kamere, nepostojanje bilo kakvih koliko-toliko zanimljivih ugrađenih značajki (što je s hardverskim JPEG koderom?), pa čak i plesanje uz tamburicu oko polupečenog FIFO
Organiziranje snimateljskog rada u prekidima PIXCK, HSYNC I VSYNC Nisam imao toliko problema koliko sam imao radeći s kamerom pomoću hardvera DCMI.
Međutim, u bliskoj budućnosti pokušat ću uhvatiti kadar i komprimirati ga JPEG, i pokušajte napisati sliku na SD karticu.
P.S. Za svaki slučaj, dajem link na projekt za " Šifra::Blokovi"- iznenada će nekome dobro doći.

Bilo jednom spajanje kamere s mobitela na mikrokontroler STM32F407VGT6(koja se odvija na ploči STM32F4Discovery), nisam ni razmišljao o tome da ovaj kontroler ima posebno hardversko sučelje za tu svrhu. Možda nisam pažljivo pročitao podatkovnu tablicu, ali uvijek sam mislio da je sučelje DCMI dostupno samo za čips u pakiranju UFBGA176 I LQFP od 144 stope. Međutim, ne tako davno, otkrio sam izraženi detalj: 100-legged STM32F407 također ima DCMI na brodu.
Budući da sam veliki obožavatelj proučavanja i zajedničkog lansiranja različitog mobilnog hardvera (osobito LCD-a i kamera) s MK-om, jednostavno nisam mogao proći pored takvog otkrića i odlučio sam popuniti ovu prazninu u proučavanju STM32 periferije. Zapravo, ovaj materijal posvećen je opisu provedbe ideje koja se pojavila.

Samo malo teorije.

Prije svega, trebate zamisliti o čemu govorimo - odnosno što je CMOS kamera i za što se koristi.
Ova vrsta kamere daje informacije sa senzora u digitalnom obliku: RGB, YCbCr, a također iu komprimiranom obliku - JPEG. Različite kamere imaju svoje nijanse u pogledu mogućnosti, razmotrit ću vrlo specifičan slučaj kamere niske rezolucije (VGA, 640x480), koju sam izvukao iz svog telefona u davna vremena " Siemens C72"(senzor PixelPlus PO2030N). Ova kamera je najprikladnija za proučavanje zbog jednostavnosti rada i pripadnosti manje-više uobičajenom tipu. Davno sam napravio malu pločicu za to (radi lakšeg povezivanja) - sa stabilizatorom od 2,8 V i pull-up otpornicima na sabirnici I2C. Evo ga (kabel i konektor za kameru skriveni su ispod kućišta).


Osim po nijansama na polju formata podataka, kamere se mogu razlikovati i po broju pinova za sinkronizaciju. Većina (po mom mišljenju) senzora ima posebne vodoravne i okomite sinkronizacijske pinove; ali postoje kamere koje imaju samo stroboskopski izlaz piksela i obavještavaju vas o početku novog retka/kadra pomoću posebnih odaslanih kodova (npr. 0x00 ili 0xFF). Kamera koju imam ima eksterne sinkronizacijske pinove.
Možete procijeniti približan shematski prikaz kamere u obliku bloka.


Uglavnom se CMOS kamerama upravlja preko sučelja I2C(iako sam vidio uređaje kojima upravlja UART). Putem I2C konfiguriraju se različiti parametri, kao što su: rezolucija, raspon boja, format izlaznih podataka itd.
Zaključak EXTCLK– taktiranje kamere, koje treba osigurati izvana. DCLK– stroboskopski signal, duž čijeg se prednjeg ili silaznog ruba podaci bilježe na podatkovnoj sabirnici kamere (na primjer, podatkovni bajt jednog piksela matrice ili podatkovni bajt "pola piksela" ako kamera radi u način rada RGB565). HSYNC– horizontalni signal sinkronizacije koji označava početak novog retka, i VSYNC– signal sinkronizacije čija aktivna razina označava početak novog okvira. zaključke D0..D7- sabirnica podataka; U pravilu je za takve kamere osmobitni.
Razgovarajmo sada više o signalima sinkronizacije.


Grafikoni pokazuju da je kamera konfigurirana za aktivnost signala DCLK samo tijekom aktivne faze HSYNC(naime, to je faza koja nas zanima; signal sata u razdoblju “line feed” nam nije zanimljiv). Ako je kamera postavljena na rezoluciju 320x240, tada tijekom svakog pulsa HSYNC 320 impulsa odgovara DCLK, i tijekom razdoblja VSYNC – 240 HSYNC.
Kad zumiramo, vidimo što se događa na podatkovnoj sabirnici.


Na uzlaznom rubu (u ovom slučaju), bajt se uklanja iz podatkovne sabirnice, koji se može poslati izravno na zaslon za prikaz ili "presaviti" u međuspremnik za naknadnu obradu.
U teoriji je sve više-manje jasno, sada o sučelju DCMI mikrokontroler STM32.
Sučelje DCMI sposoban je raditi s podatkovnom sabirnicom širine do 14 bita, podržava hardversku i softversku sinkronizaciju, kao i podatkovne formate: YCbCr, RGB i JPEG.
Osim, DCMI sadrži međuspremnik FIFO, ima mogućnost konfiguriranja prekida (uključujući prilikom popunjavanja registra podataka) i konfiguriranja rada putem DMA.


Prekidi od DCMI može se pozvati kada se pojave sljedeći uvjeti: kraj linije, kraj okvira, prekoračenje međuspremnika za primanje, detektirana pogreška sinkronizacije (s internom sinkronizacijom).
Bio sam pomalo zbunjen nedostatkom posebnog izlaza sata kamere. Ne znam zašto programeri iz SGS mikroelektronika Bio je napušten, ali za mene bi bilo vrlo zgodno imati, na primjer, prilagodljiv izvor sata.
Osobno sam koristio tajmer-brojač opće namjene uključen u PWM modu za generiranje kvadratnog vala s frekvencijom od 4 MHz. Naravno, ne možete dobiti visok FPS s takvim satom, ali odmah ću rezervirati - zaslon koji koristim nije povezan s FSMC, dakle, najduža funkcija u cijelom lancu je funkcija LCD izlaza, stoga, na višoj frekvenciji, izlaz slike na zaslon ne uspijeva. Stoga, prije istovara, isključim mjerač vremena, a nakon toga ponovno uključim mjerač vremena.
Hardverski modul DCMI sadrži, osim registra podataka, deset kontrolnih/statusnih registara. Ovo je: kontrolni registar ( DCMI_CR), registar stanja ( DCMI_SR), registar statusa prekida ( DCMI_RIS), registar omogućivanja prekida ( DCMI_IER), registar maske prekida ( DCMI_MIS), registar resetiranja oznake prekida ( DCMI_ICR), interni registar koda sata ( DCMI_ESCR), registar resetiranja maske internog koda sata ( DCMI_ESUR), registar početnih vrijednosti pri snimanju dijela okvira ( DCMI_CWSTRT) i registar veličine fragmenta okvira u načinu CropWindow ( DCMI_CWSIZE). I, naravno, registar podataka - DCMI_DR.
U ovom slučaju nas ne zanimaju registri koji se odnose na snimanje dijela okvira i internu sinkronizaciju. Također sam odlučio za sada ostaviti prekide na miru, pa je vrijedno detaljnije razmotriti samo kontrolni registar DCMI_CR i statusni registar DCMI_SR.

Kontrolni registar daje nam mogućnost potpunog prilagođavanja formata interakcije s kamerom: veličina sabirnice podataka, razine aktivnih linija HSYNC I VSYNC itd.


U redu. bit OMOGUĆITI– podrazumijeva se da je sučelje pušteno u rad. Polje EDM (prošireni podatkovni način) – veličina sabirnice podataka; Moj fotoaparat ima osmobitnu sabirnicu, tako da ovo polje treba postaviti na "00". Polje FCRC (kontrola brzine snimanja okvira) omogućuje lagano podešavanje FPC-a: 00 – snimaju se svi dolazni okviri, 01 – svaki drugi okvir, 10 – svaki četvrti. Komadići VSPOL I HSPOL– aktivne razine vodova vertikalne i horizontalne sinkronizacije. Aktivne razine se zanemaruju i podaci se ne bilježe tijekom aktivnih razdoblja, to treba uzeti u obzir. PCKPOL– bit aktivne razine stroboskopa piksela – na kojem rubu signala čitati podatke sa sabirnice: prednjem ili stražnjem. ESS– bit za odabir načina sinkronizacije: eksterne ili interne. JPEG– izbor formata dolaznih podataka – komprimirani ili ne. USJEV– bit odabira snimanja fragmenta okvira ( prozor usjeva). Ako je ovaj bit postavljen na jedan, sučelje će uhvatiti podatke u prozoru definiranom vrijednostima u registrima DCMI_CWSTRT I DCMI_CWSIZE.
Dakle, postavimo to. Budući da sam navikao koristiti standardnu ​​biblioteku perifernih uređaja iz ST-a (iako je u prvim iteracijama rada s novim perifernim uređajima nikada ne koristim dok ručno ne petljam s registrima), postavio sam postavke pomoću biblioteke.

Void DCMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_CamType .DCMI_ExtendedDataMode_8b; DCMI_SynchroMode_Hardware; DCMI_CamType(ENABLE);

Zapravo, za moje potrebe bilo je moguće ne dirati niti jedan bit u registru DCMI_CR– prema zadanim su postavkama resetirani – osim bitova UHVATITI I OMOGUĆITI.
Sučelje je konfigurirano i spremno za korištenje. Nakon slanja signala sata kameri, sučelje će početi primati podatke koje trebamo obraditi.
Za početak sam si postavio najjednostavniji zadatak - prikazati sliku na displeju, kako bi obrada podataka bila minimalna.
Statusni registar pomoći će nam u pravodobnom očitavanju podataka iz prijemnog međuspremnika DCMI_SR.

Za čitanje je dostupan vrlo mali broj bitova - samo tri. Komadići HSYNC I VSYNC signalizira stanje odgovarajućih vodova: aktivna faza ili pomak linije; najzanimljivija stvar je bit FNE. Govori nam da ispunimo međuspremnik podacima. Ili zato što ga niste ispunili.
Provjera stanja bita u standardnoj petlji FNE V DCMI_SR, saznajemo o pristizanju podataka u prijemni tridesetdvobitni međuspremnik. U mom slučaju podaci će se nalaziti ovako:

Prilikom postavljanja nastavka FNE u statusnom registru DCMI_SR prijemni međuspremnik će sadržavati četiri bajta, podatke iz dva susjedna piksela: Bajt0 I Bajt1 – 16 bitova piksela n, A Bajt2 I Bajt3 – 16 bitova piksela n+1. Sve što trebam učiniti je spojiti ih i poslati na zaslon. Dakle, ovako izgleda glavna petlja:

While (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //Čeka se međuspremnik TIM_Cmd(TIM3, DISABLE); //Onemogući CAM sat cam_grab = (DCMI->DR); //Čitanje međuspremnika SendDataByte_LCD (cam_grab); //Ponovno uključivanje CAM sata )

Odnosno, čekam da se postavi bit FNE u statusnom registru DCMI_SR, a zatim učitavam 16 bita podataka na zaslon u dva koraka.
U ovom trenutku želio bih doći do logičnog zaključka, ali nije bilo tako.
Nakon bljeskanja firmvera i ponovnog pokretanja MK-a, vidio sam na zaslonu... ne, vidio sam svoju vrlo poznatu fiziku, ali u crno-plavim nijansama. Crvena i zelena boja bile su potpuno odsutne.
Nakon kratkog obračuna s debuggerom, otkriveno je sljedeće: registar podataka sučelja sadržavao je samo 16 bitova podataka za jedan piksel, s nižih 8 bitova na mjestu Bajt0 (vidi sliku gore), a starješine su na mjestu Bajt2 . Razmaci Bajt1 I Bajt3 bile su prazne. Do sada mi nije bilo jasno otkud to neslaganje između dokumentacije i stvarnosti, a možda se obratim STM-u.
Kao rezultat, uspjeli smo dobiti sliku s kamere pomoću sučelja DCMI, iako ne bez nekih poteškoća. Na slici prikazujem fotografiju displeja na kojem je bila prikazana slika demo ploče STM32F3Discovery iz moje kamere.


Evo što ćemo vidjeti u zaključcima: EXTCLK, PIXCK, HSYNC I VSYNC, ako spojite logički analizator.


Sve izgleda točno kako se i očekivalo: 240 impulsa HSYNC uklapa se u trajanje jednog VSYNC, 320 PIXCK- u jednom HSYNC. Tijekom aktivne faze HSYNC kamera ne proizvodi signale PIXCK– točno onako kako je postavljena.
Općenito govoreći, sučelje me malo razočaralo. Nepostojanje “standardne” taktne noge kamere, nepostojanje bilo kakvih koliko-toliko zanimljivih ugrađenih značajki (što je s hardverskim JPEG koderom?), pa čak i plesanje uz tamburicu oko polupečenog FIFO
Organiziranje snimateljskog rada u prekidima PIXCK, HSYNC I VSYNC Nisam imao toliko problema koliko sam imao radeći s kamerom pomoću hardvera DCMI.
Međutim, u bliskoj budućnosti pokušat ću uhvatiti kadar i komprimirati ga JPEG, i pokušajte napisati sliku na SD karticu.
P.S. Za svaki slučaj, dajem link na projekt za " Šifra::Blokovi"- iznenada će nekome dobro doći.

Ili usporeno snimanje je snimanje frekvencijom nižom od standardne frekvencije snimanja i projekcije od 24 sličice u sekundi.

Nakon što sam počeo proučavati mikrokontrolere STM32 i napisao "HelloWorld" uz treptanje LED-a, shvatio sam da za bolje razumijevanje rada STM32 moram implementirati nešto složenije koristeći više perifernih uređaja mikrokontrolera. Tako je nastala ideja o stvaranju Time-lapse kamere.

Kamera koju sam razvio snimat će fotografije otprilike svakih 5 sekundi i spremati ih na SD karticu u jpeg formatu. Zatim ih je potrebno kombinirati na računalu u video datoteku.

Za izradu kamere koristio sam sljedeće komponente:

Kartica je povezana pomoću dvije funkcije:
1. Korištenje funkcije disk_inicijalizirati kartica je inicijalizirana.
2. Zatim ga trebate montirati f_mount.

Nakon uspješnog dovršetka ovih koraka, možete izvoditi razne operacije s karticom, kao što su:
1. f_otvoriti– otvaranje datoteke,
2. f_zatvoriti– zatvaranje spisa;
3. f_mkdir– izrada imenika;
4. f_chdir– izbor imenika;
5. f_pisati– pisanje u datoteku;
6. f_čitaj– čitanje iz datoteke.

Opisao sam rad s kamerom i SD karticom, a sada pogledajmo kako program radi u cjelini:
1. Inicijalizirajte SD karticu;
2. Inicijalizirajte modul kamere;
3. Otvorite datoteku time.txt (datoteka treba sadržavati jednu liniju formata 01.01.2014_12:00 ), koji pohranjuje vrijeme za brojanje RTC timera;
4. Pročitajte vrijeme i datum iz datoteke i postavite RTC;
5. Zatvorite datoteku time.txt;
6. Napravite direktorij za pohranu fotografija “LinkSpritePhoto”;
7. Kada pritisnete tipku PA0 na ploči, snimite fotografiju i pohranite je na karticu (Dok se slika, plava LED lampica svijetli);
8. Ako se neka od funkcija ne izvrši, upadamo u beskonačnu petlju i treperi zelena LED dioda.

Da biste pokrenuli kameru u kontinuiranom načinu rada, morate odkomentirati sljedeće retke u main.c:

//EnabledButtonStart = 101; // Za pokretanje u petlji, skinite komentar s ovog retka //Delay(300); // Odgoda pokretanja u petlji
I komentirajte ovaj redak:

EnabledButtonStart = 0; // Za pokretanje u petlji, komentirajte ovaj redak
Zatim, kada ga uključite, kamera će početi kontinuirano snimati fotografije.

Općenito, sastavio sam opis rada ove kamere i sada mogu pokazati rezultat rada.

  • Tutorial

STM32F4Discovery – spojite kameru preko DCMI sučelja

Bilo jednom spajanje kamere s mobitela na mikrokontroler STM32F407VGT6(koja se odvija na ploči STM32F4Discovery), nisam ni razmišljao o tome da ovaj kontroler ima posebno hardversko sučelje za tu svrhu. Možda nisam pažljivo pročitao podatkovnu tablicu, ali uvijek sam mislio da je sučelje DCMI dostupno samo za čips u pakiranju UFBGA176 I LQFP od 144 stope. Međutim, ne tako davno, otkrio sam izraženi detalj: 100-legged STM32F407 također ima DCMI na brodu.
Budući da sam veliki obožavatelj proučavanja i zajedničkog lansiranja različitog mobilnog hardvera (osobito LCD-a i kamera) s MK-om, jednostavno nisam mogao proći pored takvog otkrića i odlučio sam popuniti ovu prazninu u proučavanju STM32 periferije. Zapravo, ovaj materijal posvećen je opisu provedbe ideje koja se pojavila.

Samo malo teorije.

Prije svega, trebate zamisliti o čemu govorimo - odnosno što je CMOS kamera i za što se koristi.
Ova vrsta kamere daje informacije sa senzora u digitalnom obliku: RGB, YCbCr, a također iu komprimiranom obliku - JPEG. Različite kamere imaju svoje nijanse u pogledu mogućnosti, razmotrit ću vrlo specifičan slučaj kamere niske rezolucije (VGA, 640x480), koju sam izvukao iz svog telefona u davna vremena " Siemens C72"(senzor PixelPlus PO2030N). Ova kamera je najprikladnija za proučavanje zbog jednostavnosti rada i pripadnosti manje-više uobičajenom tipu. Davno sam napravio malu pločicu za to (radi lakšeg povezivanja) - sa stabilizatorom od 2,8 V i pull-up otpornicima na sabirnici I2C. Evo ga (kabel i konektor za kameru skriveni su ispod kućišta).

Osim po nijansama na polju formata podataka, kamere se mogu razlikovati i po broju pinova za sinkronizaciju. Većina (po mom mišljenju) senzora ima posebne vodoravne i okomite sinkronizacijske pinove; ali postoje kamere koje imaju samo stroboskopski izlaz piksela i obavještavaju vas o početku novog retka/kadra pomoću posebnih odaslanih kodova (npr. 0x00 ili 0xFF). Kamera koju imam ima eksterne sinkronizacijske pinove.
Možete procijeniti približan shematski prikaz kamere u obliku bloka.

Uglavnom se CMOS kamerama upravlja preko sučelja I2C(iako sam vidio uređaje kojima upravlja UART). Putem I2C konfiguriraju se različiti parametri, kao što su: rezolucija, raspon boja, format izlaznih podataka itd.
Zaključak EXTCLK– taktiranje kamere, koje treba osigurati izvana. DCLK– stroboskopski signal, duž čijeg se prednjeg ili silaznog ruba podaci bilježe na podatkovnoj sabirnici kamere (na primjer, podatkovni bajt jednog piksela matrice ili podatkovni bajt "pola piksela" ako kamera radi u način rada RGB565). HSYNC– horizontalni signal sinkronizacije koji označava početak novog retka, i VSYNC– signal sinkronizacije čija aktivna razina označava početak novog okvira. zaključke D0..D7- sabirnica podataka; U pravilu je za takve kamere osmobitni.
Razgovarajmo sada više o signalima sinkronizacije.

Grafikoni pokazuju da je kamera konfigurirana za aktivnost signala DCLK samo tijekom aktivne faze HSYNC(naime, to je faza koja nas zanima; signal sata u razdoblju “line feed” nam nije zanimljiv). Ako je kamera postavljena na rezoluciju 320x240, tada tijekom svakog pulsa HSYNC 320 impulsa odgovara DCLK, i tijekom razdoblja VSYNC – 240 HSYNC.
Kad zumiramo, vidimo što se događa na podatkovnoj sabirnici.

Na uzlaznom rubu (u ovom slučaju), bajt se uklanja iz podatkovne sabirnice, koji se može poslati izravno na zaslon za prikaz ili "presaviti" u međuspremnik za naknadnu obradu.

U teoriji je sve više-manje jasno, sada o sučelju DCMI mikrokontroler STM32.

Sučelje DCMI sposoban je raditi s podatkovnom sabirnicom širine do 14 bita, podržava hardversku i softversku sinkronizaciju, kao i podatkovne formate: YCbCr, RGB i JPEG.
Osim, DCMI sadrži međuspremnik FIFO, ima mogućnost konfiguriranja prekida (uključujući prilikom popunjavanja registra podataka) i konfiguriranja rada putem DMA.

Prekidi od DCMI može se pozvati kada se pojave sljedeći uvjeti: kraj linije, kraj okvira, prekoračenje međuspremnika za primanje, detektirana pogreška sinkronizacije (s internom sinkronizacijom).
Bio sam pomalo zbunjen nedostatkom posebnog izlaza sata kamere. Ne znam zašto programeri iz SGS mikroelektronika Bio je napušten, ali za mene bi bilo vrlo zgodno imati, na primjer, prilagodljiv izvor sata.
Osobno sam koristio tajmer-brojač opće namjene uključen u PWM modu za generiranje kvadratnog vala s frekvencijom od 4 MHz. Naravno, ne možete dobiti visok FPS s takvim satom, ali odmah ću rezervirati - zaslon koji koristim nije povezan s FSMC, dakle, najduža funkcija u cijelom lancu je funkcija LCD izlaza, stoga, na višoj frekvenciji, izlaz slike na zaslon ne uspijeva. Stoga, prije istovara, isključim mjerač vremena, a nakon toga ponovno uključim mjerač vremena.
Hardverski modul DCMI sadrži, osim registra podataka, deset kontrolnih/statusnih registara. Ovo je: kontrolni registar ( DCMI_CR), registar stanja ( DCMI_SR), registar statusa prekida ( DCMI_RIS), registar omogućivanja prekida ( DCMI_IER), registar maske prekida ( DCMI_MIS), registar resetiranja oznake prekida ( DCMI_ICR), interni registar koda sata ( DCMI_ESCR), registar resetiranja maske internog koda sata ( DCMI_ESUR), registar početnih vrijednosti pri snimanju dijela okvira ( DCMI_CWSTRT) i registar veličine fragmenta okvira u načinu CropWindow ( DCMI_CWSIZE). I, naravno, registar podataka - DCMI_DR.
U ovom slučaju nas ne zanimaju registri koji se odnose na snimanje dijela okvira i internu sinkronizaciju. Također sam odlučio za sada ostaviti prekide na miru, pa je vrijedno detaljnije razmotriti samo kontrolni registar DCMI_CR i statusni registar DCMI_SR.

Kontrolni registar daje nam mogućnost potpunog prilagođavanja formata interakcije s kamerom: veličina sabirnice podataka, razine aktivnih linija HSYNC I VSYNC itd.

U redu. bit OMOGUĆITI– podrazumijeva se da je sučelje pušteno u rad. Polje EDM (prošireni podatkovni način) – veličina sabirnice podataka; Moj fotoaparat ima osmobitnu sabirnicu, tako da ovo polje treba postaviti na "00". Polje FCRC (kontrola brzine snimanja okvira) omogućuje lagano podešavanje FPC-a: 00 – snimaju se svi dolazni okviri, 01 – svaki drugi okvir, 10 – svaki četvrti. Komadići VSPOL I HSPOL– aktivne razine vodova vertikalne i horizontalne sinkronizacije. Aktivne razine se zanemaruju i podaci se ne bilježe tijekom aktivnih razdoblja, to treba uzeti u obzir. PCKPOL– bit aktivne razine stroboskopa piksela – na kojem rubu signala čitati podatke sa sabirnice: prednjem ili stražnjem. ESS– bit za odabir načina sinkronizacije: eksterne ili interne. JPEG– izbor formata dolaznih podataka – komprimirani ili ne. USJEV– bit odabira snimanja fragmenta okvira ( prozor usjeva). Ako je ovaj bit postavljen na jedan, sučelje će uhvatiti podatke u prozoru definiranom vrijednostima u registrima DCMI_CWSTRT I DCMI_CWSIZE.

Pa, postavimo to.
Budući da sam navikao koristiti standardnu ​​biblioteku perifernih uređaja iz ST-a (iako je u prvim iteracijama rada s novim perifernim uređajima nikada ne koristim dok ručno ne petljam s registrima), postavio sam postavke pomoću biblioteke.

Void DCMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_CamType .DCMI_ExtendedDataMode_8b; DCMI_SynchroMode_Hardware; DCMI_CamType(ENABLE);
Zapravo, za moje potrebe bilo je moguće ne dirati niti jedan bit u registru DCMI_CR– prema zadanim su postavkama resetirani – osim bitova UHVATITI I OMOGUĆITI.
Sučelje je konfigurirano i spremno za korištenje. Nakon slanja signala sata kameri, sučelje će početi primati podatke koje trebamo obraditi.
Za početak sam si postavio najjednostavniji zadatak - prikazati sliku na displeju, kako bi obrada podataka bila minimalna.
Statusni registar pomoći će nam u pravodobnom očitavanju podataka iz prijemnog međuspremnika DCMI_SR.

Za čitanje je dostupan vrlo mali broj bitova - samo tri. Komadići HSYNC I VSYNC signalizira stanje odgovarajućih vodova: aktivna faza ili pomak linije; najzanimljivija stvar je bit FNE. Govori nam da ispunimo međuspremnik podacima. Ili zato što ga niste ispunili.
Provjera stanja bita u standardnoj petlji FNE V DCMI_SR, saznajemo o pristizanju podataka u prijemni tridesetdvobitni međuspremnik. U mom slučaju podaci će se nalaziti ovako:

Prilikom postavljanja nastavka FNE u statusnom registru DCMI_SR prijemni međuspremnik će sadržavati četiri bajta, podatke iz dva susjedna piksela: Bajt0 I Bajt1 – 16 bitova piksela n, A Bajt2 I Bajt3 – 16 bitova piksela n+1. Sve što trebam učiniti je spojiti ih i poslati na zaslon. Dakle, ovako izgleda glavna petlja:
while (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //Čeka se međuspremnik TIM_Cmd(TIM3, DISABLE); //Onemogući CAM sat cam_grab = (DCMI->DR); //Čitanje međuspremnika SendDataByte_LCD (cam_grab); //Ponovno uključivanje CAM sata )
Odnosno, čekam da se postavi bit FNE u statusnom registru DCMI_SR, a zatim učitavam 16 bita podataka na zaslon u dva koraka.
U ovom trenutku želio bih doći do logičnog zaključka, ali nije bilo tako.
Nakon bljeskanja firmvera i ponovnog pokretanja MK-a, vidio sam na zaslonu... ne, vidio sam svoju vrlo poznatu fiziku, ali u crno-plavim nijansama. Crvena i zelena boja bile su potpuno odsutne.
Nakon kratkog obračuna s debuggerom, otkriveno je sljedeće: registar podataka sučelja sadržavao je samo 16 bitova podataka za jedan piksel, s nižih 8 bitova na mjestu Bajt0 (vidi sliku gore), a starješine su na mjestu Bajt2 . Razmaci Bajt1 I Bajt3 bile su prazne. Do sada mi nije bilo jasno otkud to neslaganje između dokumentacije i stvarnosti, a možda se obratim STM-u.
Kao rezultat, uspjeli smo dobiti sliku s kamere pomoću sučelja DCMI, iako ne bez nekih poteškoća. Na slici prikazujem fotografiju displeja na kojem je bila prikazana slika demo ploče STM32F3Discovery iz moje kamere.

Evo što ćemo vidjeti u zaključcima: EXTCLK, PIXCK, HSYNC I VSYNC, ako spojite logički analizator.

Sve izgleda točno kako se i očekivalo: 240 impulsa HSYNC uklapa se u trajanje jednog VSYNC, 320 PIXCK- u jednom HSYNC. Tijekom aktivne faze HSYNC kamera ne proizvodi signale PIXCK– točno onako kako je postavljena.
Općenito govoreći, sučelje me malo razočaralo. Nepostojanje “standardne” taktne noge kamere, nepostojanje bilo kakvih koliko-toliko zanimljivih ugrađenih značajki (što je s hardverskim JPEG koderom?), pa čak i plesanje uz tamburicu oko polupečenog FIFO
Organiziranje snimateljskog rada u prekidima PIXCK, HSYNC I VSYNC Nisam imao toliko problema koliko sam imao radeći s kamerom pomoću hardvera DCMI.
Međutim, u bliskoj budućnosti pokušat ću uhvatiti kadar i komprimirati ga JPEG, i pokušajte napisati sliku na SD karticu.
P.S. Za svaki slučaj, dajem link na projekt za " Šifra::Blokovi"- iznenada će nekome dobro doći.

Kartica je povezana pomoću dvije funkcije:
1. Korištenje funkcije disk_inicijalizirati kartica je inicijalizirana.
2. Zatim ga trebate montirati f_mount.

Nakon uspješnog dovršetka ovih koraka, možete izvoditi razne operacije s karticom, kao što su:
1. f_otvoriti– otvaranje datoteke,
2. f_zatvoriti– zatvaranje spisa;
3. f_mkdir– izrada imenika;
4. f_chdir– izbor imenika;
5. f_pisati– pisanje u datoteku;
6. f_čitaj– čitanje iz datoteke.

Opisao sam rad s kamerom i SD karticom, a sada pogledajmo kako program radi u cjelini:
1. Inicijalizirajte SD karticu;
2. Inicijalizirajte modul kamere;
3. Otvorite datoteku time.txt (datoteka treba sadržavati jednu liniju formata 01.01.2014_12:00 ), koji pohranjuje vrijeme za brojanje RTC timera;
4. Pročitajte vrijeme i datum iz datoteke i postavite RTC;
5. Zatvorite datoteku time.txt;
6. Napravite direktorij za pohranu fotografija “LinkSpritePhoto”;
7. Kada pritisnete tipku PA0 na ploči, snimite fotografiju i pohranite je na karticu (Dok se slika, plava LED lampica svijetli);
8. Ako se neka od funkcija ne izvrši, upadamo u beskonačnu petlju i treperi zelena LED dioda.

Da biste pokrenuli kameru u kontinuiranom načinu rada, morate odkomentirati sljedeće retke u main.c:

//EnabledButtonStart = 101; // Za pokretanje u petlji, skinite komentar s ovog retka //Delay(300); // Odgoda pokretanja u petlji
I komentirajte ovaj redak:

EnabledButtonStart = 0; // Za pokretanje u petlji, komentirajte ovaj redak
Zatim, kada ga uključite, kamera će početi kontinuirano snimati fotografije.

Općenito, sastavio sam opis rada ove kamere i sada mogu pokazati rezultat rada.




Vrh