STM32F4Discovery – камераны DCMI интерфейсі арқылы қосыңыз. Қауіпсіздік ақпарат порталы ұялы телефоннан Stm32 камерасы

  • Оқулық

STM32F4Discovery – камераны DCMI интерфейсі арқылы қосыңыз

Бір кездері ұялы телефоннан микроконтроллерге камераны қосу STM32F407VGT6(ол тақтада орын алады STM32F4Discovery), Мен бұл контроллерде бұл мәселе үшін арнайы аппараттық интерфейс бар екендігі туралы тіпті ойламадым. Мүмкін мен деректер кестесін мұқият оқымаған шығармын, бірақ мен әрқашан интерфейс деп ойлайтынмын DCMIпакеттердегі чиптер үшін ғана қолжетімді UFBGA176Және LQFP 144 футтан. Алайда, жақында мен дауысты бөлшекті таптым: 100 аяқты STM32F407Сондай-ақ бортында DCMI бар.
MK-мен әртүрлі мобильді жабдықты (атап айтқанда, СКД және камераларды) зерттеудің және бірлесіп іске қосудың үлкен жанкүйері болғандықтан, мен мұндай жаңалықты елеусіз қалдыра алмадым және STM32 перифериялық құрылғыларын зерттеуде бұл олқылықты толтыруды шештім. Шын мәнінде, бұл материал туындаған идеяны жүзеге асырудың сипаттамасына арналған.

Кішкене теория.

Ең алдымен, сіз не туралы айтып жатқанымызды елестетуіңіз керек - дәлірек айтсақ, CMOS камерасы дегеніміз не және ол не үшін қолданылады.
Камераның бұл түрі сенсордан ақпаратты сандық түрде шығарады: RGB, YCbCr, сонымен қатар қысылған пішінде - JPEG. Әртүрлі камералардың мүмкіндіктері бойынша өзіндік нюанстары бар, мен ертеде телефонымнан суырып алған төмен ажыратымдылығы бар (VGA, 640x480) камераның өте нақты жағдайын қарастырамын ». Siemens C72«(датчик PixelPlus PO2030N). Бұл камера жұмыс істеудің қарапайымдылығына және көп немесе аз таралған түрге жататындығына байланысты зерттеуге ең қолайлы. Ұзақ уақыт бұрын мен оған шағын тақта жасадым (қосылудың қарапайымдылығы үшін) - автобуста 2,8 В тұрақтандырғышы және тартылатын резисторлары бар I2C. Міне (камера кабелі мен қосқыш корпустың астында жасырылған).

Деректер пішімі саласындағы нюанстардан басқа, камералар синхрондау түйреуіштерінің санында да ерекшеленуі мүмкін. Көптеген (менің ойымша) сенсорларда арнайы көлденең және тік синхрондау түйреуіштері бар; бірақ тек пиксельдік строб шығысы бар камералар бар және олар сізге арнайы жіберілетін кодтарды (мысалы, 0x00немесе 0xFF). Менде бар камерада сыртқы синхрондау түйреуіштері бар.
Сіз блок түріндегі камераның шамамен схемалық көрінісін бағалай аласыз.

Көбінесе CMOS камералары интерфейс арқылы басқарылады I2C(бірақ мен басқаратын құрылғыларды көрдім UART). I2C арқылы әртүрлі параметрлер конфигурацияланады, мысалы: ажыратымдылық, түс гаммасы, шығыс деректер пішімі және т.б.
Қорытынды EXTCLK– сырттан қамтамасыз етілуі қажет камера сағаты. DCLK– алдыңғы немесе соңғы жиегі бойынша деректер камера деректер шинасына жазылатын строб сигналы (мысалы, матрицаның бір пикселінің деректер байты немесе камера жұмыс істеп тұрса, «жарты пиксельдік» деректер байты RGB565). HSYNC– жаңа жолдың басталуын көрсететін көлденең синхрондау сигналы және VSYNC– синхрондау сигналы, оның белсенді деңгейі жаңа кадрдың басталуын көрсетеді. Қорытындылар D0..D7– деректер шинасы; Әдетте, мұндай камералар үшін бұл сегіз разрядты.
Енді синхрондау сигналдары туралы көбірек сөйлесейік.

Графиктер камераның сигнал әрекеті үшін конфигурацияланғанын көрсетеді DCLKтек белсенді кезеңде HSYNC(дәлірек айтқанда, бізді қызықтыратын осы фаза; «жолды беру» кезеңіндегі сағаттық сигнал бізге қызық емес). Егер камера 320x240 ажыратымдылыққа орнатылған болса, онда әрбір импульс кезінде HSYNC 320 импульс сәйкес келеді DCLK, және кезеңде VSYNC – 240 HSYNC.
Ұлғайтқан кезде деректер шинасында не болып жатқанын көреміз.

Көтерілген жиекте (бұл жағдайда) деректер шинасында байт жойылады, оны көрсету үшін тікелей дисплейге жіберуге немесе кейінгі өңдеу үшін буферге «бүктеуге» болады.

Теориялық тұрғыдан бәрі азды-көпті түсінікті, енді интерфейс туралы DCMIмикроконтроллер STM32.

Интерфейс DCMIені 14 битке дейінгі деректер шинасымен жұмыс істей алады, аппараттық және бағдарламалық құралды синхрондауды, сондай-ақ деректер пішімдерін қолдайды: YCbCr, RGB және JPEG.
Сонымен қатар, DCMIбуферді қамтиды FIFO, үзілістерді конфигурациялау (соның ішінде деректер регистрін толтыру кезінде) және операцияны конфигурациялау мүмкіндігі бар DMA.

бастап үзеді DCMIкелесі жағдайлар орын алған кезде шақырылуы мүмкін: жолдың соңы, кадрдың соңы, қабылдау буферінің толып кетуі, синхрондау қатесі анықталды (ішкі синхрондаумен).
Арнайы камера сағатының болмауы мені біраз таң қалдырды. Әзірлеушілер неге екенін білмеймін SGS MicroelectronicsОл тасталды, бірақ мен үшін, мысалы, теңшелетін сағат көзі болуы өте ыңғайлы болар еді.
Жеке мен 4 МГц жиілігі бар шаршы толқынды жасау үшін PWM режимінде қосылған жалпы мақсаттағы таймер-есептегішті қолдандым. Әрине, мұндай сағатпен сіз жоғары FPS ала алмайсыз, бірақ мен бірден тапсырыс беремін - мен пайдаланып жатқан дисплей қосылмаған FSMC, сондықтан бүкіл тізбектегі ең ұзын функция СКД шығыс функциясы болып табылады, сондықтан жоғары жиілікте экранға кескін шығару сәтсіз болады. Сондықтан жүкті түсірмес бұрын мен таймерді өшіремін, ал одан кейін таймерді қайта қосамын.
Аппараттық модуль DCMIдеректер регистріне қосымша он бақылау/күй регистрлерін қамтиды. Бұл: бақылау регистрі ( DCMI_CR), күй тізілімі ( DCMI_SR), үзу күйінің тіркелімі ( DCMI_RIS), үзу қосу регистрі ( DCMI_IER), үзіліс маскасының регистрі ( DCMI_MIS), жалаушаны қалпына келтіру регистрін үзу ( DCMI_ICR), ішкі сағат кодының регистрі ( DCMI_ESCR), ішкі сағат коды масканы қалпына келтіру регистрі ( DCMI_ESUR), кадрдың бір бөлігін түсіру кезіндегі бастапқы мәндердің тіркелімі ( DCMI_CWSTRT) және CropWindow режимінде кадр фрагменті өлшемі регистрі ( DCMI_CWSIZE). Және, әрине, деректер тізілімі - DCMI_DR.
Бұл жағдайда кадрдың бір бөлігін түсіруге және ішкі синхрондауға қатысты регистрлер бізді қызықтырмайды. Мен үзілістерді әзірге жалғыз қалдыруды шештім, сондықтан тек бақылау регистрін толығырақ қарастырған жөн. DCMI_CRжәне күй тізілімі DCMI_SR.

Басқару регистрі бізге камерамен өзара әрекеттесу пішімін толығымен реттеуге мүмкіндік береді: деректер шинасы өлшемі, белсенді сызық деңгейлері HSYNCЖәне VSYNC, т.б.

Қалпында. Бит ҚОСУ– интерфейстің іске қосылғаны айтпаса да түсінікті. Өріс EDM (кеңейтілген деректер режимі) – деректер шинасы өлшемі; Менің камерамның сегіз биттік шинасы бар, сондықтан бұл өріс «00» мәніне орнатылуы керек. Өріс FCRC (кадрды түсіру жылдамдығын басқару) FPC аздап реттеуге мүмкіндік береді: 00 – барлық кіріс кадрлар түсіріледі, 01 – әрбір екінші кадр, 10 – әрбір төртінші кадр. Биттар VSPOLЖәне HSPOL– тік және көлденең синхрондау сызықтарының белсенді деңгейлері. Белсенді деңгейлер еленбейді және белсенді кезеңдерде ешқандай деректер түсірілмейді, мұны ескеру қажет. PCKPOL– пиксель стробының белсенді деңгейінің биті – шинадан деректерді оқу үшін сигналдың қай шетінде: алдыңғы немесе артқы. ESS– синхрондау әдісін таңдауға арналған бит: сыртқы немесе ішкі. JPEG– кіріс деректер пішімін таңдау – қысылған немесе жоқ. егін– кадр фрагментін түсіру таңдау биті ( кесу терезесі). Егер бұл бит біреуге орнатылса, интерфейс регистрлердегі мәндермен анықталған терезеде деректерді түсіреді DCMI_CWSTRTЖәне DCMI_CWSIZE.

Сонымен, оны реттейік.
Мен ST стандартты перифериялық кітапханасын қолдануға үйренгендіктен (бірақ жаңа перифериялық құрылғылармен жұмыс істеудің алғашқы итерацияларында мен оны регистрлерді қолмен өңдемейінше ешқашан пайдаланбаймын), мен параметрлерді кітапхана арқылы орнаттым.

Жарамсыз DMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureRate = DCCMIF DCC_rall; ExtendedDataMode = DCMI_ExtendedData Mode_8b; DCMI_CamType.DCMI_SynchroMode = DCMI_CamType;
Негізі менің қажеттіліктерім үшін регистрдегі бір битке қол тигізбеу мүмкін болды DCMI_CR– әдепкі бойынша олар қалпына келтіріледі – биттерді қоспағанда ТҮСІРУЖәне ҚОСУ.
Интерфейс конфигурацияланған және пайдалануға дайын. Камераға сағат сигналын жібергеннен кейін интерфейс өңдеуге қажет деректерді ала бастайды.
Бастау үшін мен өзіме ең қарапайым тапсырманы қойдым - деректерді өңдеу аз болатындай етіп дисплейде кескінді көрсету.
Күй регистрі бізге қабылдау буферінен деректерді уақтылы оқуға көмектеседі DCMI_SR.

Оқу үшін биттердің өте аз саны бар - тек үшеуі. Биттар HSYNCЖәне VSYNCсәйкес желілердің күйі туралы сигнал беру: белсенді фаза немесе желі беру; ең қызығы - бит FNE. Ол бізге буферді деректермен толтыру керектігін айтады. Немесе оны толтырмағаны үшін.
Консервіленген контурдағы қашау күйін тексеру FNEВ DCMI_SR, біз қабылдаушы отыз екі разрядты буферге деректердің келуі туралы білеміз. Менің жағдайда деректер келесідей орналасады:

Битті орнату кезінде FNEкүй тізілімінде DCMI_SRҚабылдаушы буферде төрт байт, екі көрші пикселден алынған деректер болады: Байт0 Және Байт1 – 16 пиксельдік бит n, А Байт2 Және Байт3 – 16 пиксельдік бит n+1. Маған тек оларды біріктіріп, дисплейге жіберу керек. Сонымен, негізгі цикл келесідей көрінеді:
while (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //TIM_Cmd буферін күтуде(TIM3, DISABLE); //CAM сағатын өшіру cam_grab = (DCMI->DR); //SendLCDataBте буферін оқу (cam_grab = (DCMI->DR)>>16;
Яғни, биттің орнатылуын күтемін FNEкүй тізілімінде DCMI_SR, содан кейін дисплейге екі қадаммен 16 бит деректерді жүктеймін.
Осы жерде мен логикалық қорытындыға келгім келеді, бірақ олай болмады.
Микробағдарламаны жыпылықтап, МК қайта іске қосқаннан кейін мен дисплейде көрдім ... жоқ, мен өзімнің өте таныс физикамды көрдім, бірақ қара және көк реңктерде. Қызыл және жасыл түстер мүлдем жоқ болды.
Түзеткішпен қысқаша есеп беруден кейін мыналар анықталды: интерфейс деректер регистрінде бір пиксельге тек 16 бит деректер болды, төменгі 8 бит орнында орналасқан. Байт0 (жоғарыдағы суретті қараңыз), ақсақалдар орнында Байт2 . Кеңістіктер Байт1 Және Байт3 олар бос болды. Осы уақытқа дейін мен құжаттама мен шындық арасындағы бұл қайшылықтың қайдан шыққанын түсінбедім, мүмкін мен STM-ге хабарласамын.
Нәтижесінде интерфейсті пайдаланып камерадан сурет ала алдық DCMIкейбір қиындықтарсыз болмаса да. Суретте мен демонстрациялық тақтаның суреті көрсетілген дисплейдің фотосын көрсетемін STM32F3Discoveryменің камерамнан.

Қорытындылардан мынаны көреміз: EXTCLK, PIXCK, HSYNCЖәне VSYNC, логикалық анализаторды қоссаңыз.

Барлығы күткендей көрінеді: 240 импульс HSYNCбір ұзақтығына сәйкес келеді VSYNC, 320 PIXCK- бірде HSYNC. Белсенді кезеңде HSYNCкамера сигналдар шығармайды PIXCK– ол дәл солай орнатылған.
Жалпы алғанда, интерфейс мені біраз ренжітті. Камераның «стандартты» сағаттық аяғының болмауы, азды-көпті қызықты кірістірілген мүмкіндіктердің болмауы (аппараттық JPEG кодтары туралы не айтасыз?) және тіпті жартылай пісірілген жерде бубенмен билеу. FIFO
Үзіліс кезінде камера жұмысын ұйымдастыру PIXCK, HSYNCЖәне VSYNCМен аппараттық құралдарды пайдаланып камерамен жұмыс істегенімдей көп қиындық көрмедім DCMI.
Дегенмен, жақын арада мен кадрды түсіріп, оны қысуға тырысамын JPEG, және SD картасына сурет жазып көріңіз.
PS. Мүмкін болса, мен жобаға сілтеме беремін " Код::Блоктар«- кенет біреуге пайдалы болады.

Карта екі функция арқылы қосылады:
1. Функцияны пайдалану disk_initializeкарта инициализацияланған.
2. Содан кейін оны орнату керек f_mount.

Осы қадамдарды сәтті орындағаннан кейін картамен әртүрлі операцияларды орындауға болады, мысалы:
1. f_open- файлды ашу,
2. f_close– файлды жабу;
3. f_mkdir– каталог құру;
4. f_chdir– каталог таңдау;
5. f_write– файлға жазу;
6. f_оқы– файлдан оқу.

Мен камерамен және SD картасымен қалай жұмыс істеу керектігін сипаттадым, енді бағдарламаның тұтастай қалай жұмыс істейтінін қарастырайық:
1. SD картасын инициализациялаңыз;
2. Камера модулін инициализациялаңыз;
3. time.txt файлын ашыңыз (файл форматтың бір жолын қамтуы керек). 01.01.2014_12:00 ), ол RTC таймерін санау уақытын сақтайды;
4. Файлдан уақыт пен күнді оқып, RTC орнату;
5. time.txt файлын жабыңыз;
6. «LinkSpritePhoto» фотосуреттерін сақтауға арналған каталог жасаңыз;
7. Тақтадағы PA0 түймесін басқанда, фотосуретке түсіріп, оны картаға сақтаңыз (фотосурет түсіріліп жатқанда, көк жарық диоды жанады);
8. Егер қандай да бір функция орындалмаса, біз шексіз циклге түсіп, жасыл жарық диодты жыпылықтаймыз.

Камераны үздіксіз режимде іске қосу үшін main.c ішіндегі келесі жолдарға түсініктеме алу керек:

//EnabledButtonStart = 101; // Циклда іске қосу үшін осы жолға түсініктемені алып тастаңыз // Delay(300); // Циклді бастау үшін кешіктіру
Және осы жолға түсініктеме беріңіз:

EnabledButtonStart = 0; // Циклда іске қосу үшін осы жолға түсініктеме беріңіз
Содан кейін оны қосқан кезде камера үздіксіз фотосуреттер түсіре бастайды.

Жалпы, мен бұл камераның қалай жұмыс істейтінін сипаттадым, енді мен жұмыстың нәтижесін көрсете аламын.

Бір кездері ұялы телефоннан микроконтроллерге камераны қосу STM32F407VGT6(ол тақтада орын алады STM32F4Discovery), Мен бұл контроллерде бұл мәселе үшін арнайы аппараттық интерфейс бар екендігі туралы тіпті ойламадым. Мүмкін мен деректер кестесін мұқият оқымаған шығармын, бірақ мен әрқашан интерфейс деп ойлайтынмын DCMIпакеттердегі чиптер үшін ғана қолжетімді UFBGA176Және LQFP 144 футтан. Алайда, жақында мен дауысты бөлшекті таптым: 100 аяқты STM32F407Сондай-ақ бортында DCMI бар.
MK-мен әртүрлі мобильді жабдықты (атап айтқанда, СКД және камераларды) зерттеудің және бірлесіп іске қосудың үлкен жанкүйері болғандықтан, мен мұндай жаңалықты елеусіз қалдыра алмадым және STM32 перифериялық құрылғыларын зерттеуде бұл олқылықты толтыруды шештім. Шын мәнінде, бұл материал туындаған идеяны жүзеге асырудың сипаттамасына арналған.

Кішкене теория.

Ең алдымен, сіз не туралы айтып жатқанымызды елестетуіңіз керек - дәлірек айтсақ, CMOS камерасы дегеніміз не және ол не үшін қолданылады.
Камераның бұл түрі сенсордан ақпаратты сандық түрде шығарады: RGB, YCbCr, сонымен қатар қысылған пішінде - JPEG. Әртүрлі камералардың мүмкіндіктері бойынша өзіндік нюанстары бар, мен ертеде телефонымнан суырып алған төмен ажыратымдылығы бар (VGA, 640x480) камераның өте нақты жағдайын қарастырамын ». Siemens C72«(датчик PixelPlus PO2030N). Бұл камера жұмыс істеудің қарапайымдылығына және көп немесе аз таралған түрге жататындығына байланысты зерттеуге ең қолайлы. Ұзақ уақыт бұрын мен оған шағын тақта жасадым (қосылудың қарапайымдылығы үшін) - автобуста 2,8 В тұрақтандырғышы және тартылатын резисторлары бар I2C. Міне (камера кабелі мен қосқыш корпустың астында жасырылған).


Деректер пішімі саласындағы нюанстардан басқа, камералар синхрондау түйреуіштерінің санында да ерекшеленуі мүмкін. Көптеген (менің ойымша) сенсорларда арнайы көлденең және тік синхрондау түйреуіштері бар; бірақ тек пиксельдік строб шығысы бар камералар бар және олар сізге арнайы жіберілетін кодтарды (мысалы, 0x00немесе 0xFF). Менде бар камерада сыртқы синхрондау түйреуіштері бар.
Сіз блок түріндегі камераның шамамен схемалық көрінісін бағалай аласыз.


Көбінесе CMOS камералары интерфейс арқылы басқарылады I2C(бірақ мен басқаратын құрылғыларды көрдім UART). I2C арқылы әртүрлі параметрлер конфигурацияланады, мысалы: ажыратымдылық, түс гаммасы, шығыс деректер пішімі және т.б.
Қорытынды EXTCLK– сырттан қамтамасыз етілуі қажет камера сағаты. DCLK– алдыңғы немесе соңғы жиегі бойынша деректер камера деректер шинасына жазылатын строб сигналы (мысалы, матрицаның бір пикселінің деректер байты немесе камера жұмыс істеп тұрса, «жарты пиксельдік» деректер байты RGB565). HSYNC– жаңа жолдың басталуын көрсететін көлденең синхрондау сигналы және VSYNC– синхрондау сигналы, оның белсенді деңгейі жаңа кадрдың басталуын көрсетеді. Қорытындылар D0..D7– деректер шинасы; Әдетте, мұндай камералар үшін бұл сегіз разрядты.
Енді синхрондау сигналдары туралы көбірек сөйлесейік.


Графиктер камераның сигнал әрекеті үшін конфигурацияланғанын көрсетеді DCLKтек белсенді кезеңде HSYNC(дәлірек айтқанда, бізді қызықтыратын осы фаза; «жолды беру» кезеңіндегі сағаттық сигнал бізге қызық емес). Егер камера 320x240 ажыратымдылыққа орнатылған болса, онда әрбір импульс кезінде HSYNC 320 импульс сәйкес келеді DCLK, және кезеңде VSYNC – 240 HSYNC.
Ұлғайтқан кезде деректер шинасында не болып жатқанын көреміз.


Көтерілген жиекте (бұл жағдайда) деректер шинасында байт жойылады, оны көрсету үшін тікелей дисплейге жіберуге немесе кейінгі өңдеу үшін буферге «бүктеуге» болады.
Теориялық тұрғыдан бәрі аз немесе аз түсінікті, енді интерфейс туралы DCMIмикроконтроллер STM32.
Интерфейс DCMIені 14 битке дейінгі деректер шинасымен жұмыс істей алады, аппараттық және бағдарламалық құралды синхрондауды, сондай-ақ деректер пішімдерін қолдайды: YCbCr, RGB және JPEG.
Сонымен қатар, DCMIбуферді қамтиды FIFO, үзілістерді конфигурациялау (соның ішінде деректер регистрін толтыру кезінде) және операцияны конфигурациялау мүмкіндігі бар DMA.


бастап үзеді DCMIкелесі жағдайлар орын алған кезде шақырылуы мүмкін: жолдың соңы, кадрдың соңы, қабылдау буферінің толып кетуі, синхрондау қатесі анықталды (ішкі синхрондаумен).
Арнайы камера сағатының болмауы мені біраз таң қалдырды. Әзірлеушілер неге екенін білмеймін SGS MicroelectronicsОл тасталды, бірақ мен үшін, мысалы, теңшелетін сағат көзі болуы өте ыңғайлы болар еді.
Жеке мен 4 МГц жиілігі бар шаршы толқынды жасау үшін PWM режимінде қосылған жалпы мақсаттағы таймер-есептегішті қолдандым. Әрине, мұндай сағатпен сіз жоғары FPS ала алмайсыз, бірақ мен бірден тапсырыс беремін - мен пайдаланып жатқан дисплей қосылмаған FSMC, сондықтан бүкіл тізбектегі ең ұзын функция СКД шығыс функциясы болып табылады, сондықтан жоғары жиілікте экранға кескін шығару сәтсіз болады. Сондықтан жүкті түсірмес бұрын мен таймерді өшіремін, ал одан кейін таймерді қайта қосамын.
Аппараттық модуль DCMIдеректер регистріне қосымша он бақылау/күй регистрлерін қамтиды. Бұл: бақылау регистрі ( DCMI_CR), күй тізілімі ( DCMI_SR), үзу күйінің тіркелімі ( DCMI_RIS), үзу қосу регистрі ( DCMI_IER), үзіліс маскасының регистрі ( DCMI_MIS), жалаушаны қалпына келтіру регистрін үзу ( DCMI_ICR), ішкі сағат кодының регистрі ( DCMI_ESCR), ішкі сағат коды масканы қалпына келтіру регистрі ( DCMI_ESUR), кадрдың бір бөлігін түсіру кезіндегі бастапқы мәндердің тіркелімі ( DCMI_CWSTRT) және CropWindow режимінде кадр фрагменті өлшемі регистрі ( DCMI_CWSIZE). Және, әрине, деректер тізілімі - DCMI_DR.
Бұл жағдайда кадрдың бір бөлігін түсіруге және ішкі синхрондауға қатысты регистрлер бізді қызықтырмайды. Мен үзілістерді әзірге жалғыз қалдыруды шештім, сондықтан тек бақылау регистрін толығырақ қарастырған жөн. DCMI_CRжәне күй тізілімі DCMI_SR.

Басқару регистрі бізге камерамен өзара әрекеттесу пішімін толығымен реттеуге мүмкіндік береді: деректер шинасы өлшемі, белсенді сызық деңгейлері HSYNCЖәне VSYNC, т.б.


Қалпында. Бит ҚОСУ– интерфейстің іске қосылғаны айтпаса да түсінікті. Өріс EDM (кеңейтілген деректер режимі) – деректер шинасы өлшемі; Менің камерамның сегіз биттік шинасы бар, сондықтан бұл өріс «00» мәніне орнатылуы керек. Өріс FCRC (кадрды түсіру жылдамдығын басқару) FPC аздап реттеуге мүмкіндік береді: 00 – барлық кіріс кадрлар түсіріледі, 01 – әрбір екінші кадр, 10 – әрбір төртінші кадр. Биттар VSPOLЖәне HSPOL– тік және көлденең синхрондау сызықтарының белсенді деңгейлері. Белсенді деңгейлер еленбейді және белсенді кезеңдерде ешқандай деректер түсірілмейді, мұны ескеру қажет. PCKPOL– пиксель стробының белсенді деңгейінің биті – шинадан деректерді оқу үшін сигналдың қай шетінде: алдыңғы немесе артқы. ESS– синхрондау әдісін таңдауға арналған бит: сыртқы немесе ішкі. JPEG– кіріс деректер пішімін таңдау – қысылған немесе жоқ. егін– кадр фрагментін түсіру таңдау биті ( кесу терезесі). Егер бұл бит біреуге орнатылса, интерфейс регистрлердегі мәндермен анықталған терезеде деректерді түсіреді DCMI_CWSTRTЖәне DCMI_CWSIZE.
Сонымен, оны реттейік. Мен ST стандартты перифериялық кітапханасын қолдануға үйренгендіктен (бірақ жаңа перифериялық құрылғылармен жұмыс істеудің алғашқы итерацияларында мен оны регистрлерді қолмен өңдемейінше ешқашан пайдаланбаймын), мен параметрлерді кітапхана арқылы орнаттым.

Жарамсыз DMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureRate = DCCMIF DCC_rall; ExtendedDataMode = DCMI_ExtendedData Mode_8b; DCMI_CamType.DCMI_SynchroMode = DCMI_CamType;

Негізі менің қажеттіліктерім үшін регистрдегі бір битке қол тигізбеу мүмкін болды DCMI_CR– әдепкі бойынша олар қалпына келтіріледі – биттерді қоспағанда ТҮСІРУЖәне ҚОСУ.
Интерфейс конфигурацияланған және пайдалануға дайын. Камераға сағат сигналын жібергеннен кейін интерфейс өңдеуге қажет деректерді ала бастайды.
Бастау үшін мен өзіме ең қарапайым тапсырманы қойдым - деректерді өңдеу аз болатындай етіп дисплейде кескінді көрсету.
Күй регистрі бізге қабылдау буферінен деректерді уақтылы оқуға көмектеседі DCMI_SR.

Оқу үшін биттердің өте аз саны бар - тек үшеуі. Биттар HSYNCЖәне VSYNCсәйкес желілердің күйі туралы сигнал беру: белсенді фаза немесе желі беру; ең қызығы - бит FNE. Ол бізге буферді деректермен толтыру керектігін айтады. Немесе оны толтырмағаны үшін.
Консервіленген контурдағы қашау күйін тексеру FNEВ DCMI_SR, біз қабылдаушы отыз екі разрядты буферге деректердің келуі туралы білеміз. Менің жағдайда деректер келесідей орналасады:

Битті орнату кезінде FNEкүй тізілімінде DCMI_SRҚабылдаушы буферде төрт байт, екі көрші пикселден алынған деректер болады: Байт0 Және Байт1 – 16 пиксельдік бит n, А Байт2 Және Байт3 – 16 пиксельдік бит n+1. Маған тек оларды біріктіріп, дисплейге жіберу керек. Сонымен, негізгі цикл келесідей көрінеді:

While (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //TIM_Cmd буферін күтуде(TIM3, DISABLE); //CAM сағатын өшіру cam_grab = (DCMI->DR); //SendLCDataBте буферін оқу (cam_grab = (DCMI->DR)>>16;

Яғни, биттің орнатылуын күтемін FNEкүй тізілімінде DCMI_SR, содан кейін дисплейге екі қадаммен 16 бит деректерді жүктеймін.
Осы жерде мен логикалық қорытындыға келгім келеді, бірақ олай болмады.
Микробағдарламаны жыпылықтап, МК қайта іске қосқаннан кейін мен дисплейде көрдім ... жоқ, мен өзімнің өте таныс физикамды көрдім, бірақ қара және көк реңктерде. Қызыл және жасыл түстер мүлдем жоқ болды.
Түзеткішпен қысқаша есеп беруден кейін мыналар анықталды: интерфейс деректер регистрінде бір пиксельге тек 16 бит деректер болды, төменгі 8 бит орнында орналасқан. Байт0 (жоғарыдағы суретті қараңыз), ақсақалдар орнында Байт2 . Кеңістіктер Байт1 Және Байт3 олар бос болды. Осы уақытқа дейін мен құжаттама мен шындық арасындағы бұл қайшылықтың қайдан шыққанын түсінбедім, мүмкін мен STM-ге хабарласамын.
Нәтижесінде интерфейсті пайдаланып камерадан сурет ала алдық DCMIкейбір қиындықтарсыз болмаса да. Суретте мен демонстрациялық тақтаның суреті көрсетілген дисплейдің фотосын көрсетемін STM32F3Discoveryменің камерамнан.


Қорытындылардан мынаны көреміз: EXTCLK, PIXCK, HSYNCЖәне VSYNC, логикалық анализаторды қоссаңыз.


Барлығы күткендей көрінеді: 240 импульс HSYNCбір ұзақтығына сәйкес келеді VSYNC, 320 PIXCK- бірде HSYNC. Белсенді кезеңде HSYNCкамера сигналдар шығармайды PIXCK– ол дәл солай орнатылған.
Жалпы алғанда, интерфейс мені біраз ренжітті. Камераның «стандартты» сағаттық аяғының болмауы, азды-көпті қызықты кірістірілген мүмкіндіктердің болмауы (аппараттық JPEG кодтары туралы не айтасыз?) және тіпті жартылай пісірілген жерде бубенмен билеу. FIFO
Үзіліс кезінде камера жұмысын ұйымдастыру PIXCK, HSYNCЖәне VSYNCМен аппараттық құралдарды пайдаланып камерамен жұмыс істегенімдей көп қиындық көрмедім DCMI.
Дегенмен, жақын арада мен кадрды түсіріп, оны қысуға тырысамын JPEG, және SD картасына сурет жазып көріңіз.
PS. Мүмкін болса, мен жобаға сілтеме беремін " Код::Блоктар«- кенет біреуге пайдалы болады.

Немесе баяу қозғалыста түсіру стандартты түсіру және секундына 24 кадр проекция жиілігінен төмен жиілікте түсіру болып табылады.

STM32 микроконтроллерлерін зерттеуді және жарық диодты жыпылықтаған «HelloWorld» жазуды бастағаннан кейін мен STM32 жұмысын жақсырақ түсіну үшін микроконтроллердің қосымша перифериялық құрылғыларын қолдана отырып, күрделірек нәрсені енгізу керек екенін түсіндім. Time-lapse камерасын жасау идеясы осылай пайда болды.

Мен жасаған камера шамамен 5 секунд сайын фотосуреттер түсіріп, оларды jpeg пішімінде SD картасына сақтайды. Содан кейін оларды компьютерде бейне файлға біріктіру керек.

Камераны жасау үшін мен келесі компоненттерді қолдандым:

Карта екі функция арқылы қосылады:
1. Функцияны пайдалану disk_initializeкарта инициализацияланған.
2. Содан кейін оны орнату керек f_mount.

Осы қадамдарды сәтті орындағаннан кейін картамен әртүрлі операцияларды орындауға болады, мысалы:
1. f_open- файлды ашу,
2. f_close– файлды жабу;
3. f_mkdir– каталог құру;
4. f_chdir– каталог таңдау;
5. f_write– файлға жазу;
6. f_оқы– файлдан оқу.

Мен камерамен және SD картасымен қалай жұмыс істеу керектігін сипаттадым, енді бағдарламаның тұтастай қалай жұмыс істейтінін қарастырайық:
1. SD картасын инициализациялаңыз;
2. Камера модулін инициализациялаңыз;
3. time.txt файлын ашыңыз (файлда форматтың бір жолы болуы керек 01.01.2014_12:00 ), ол RTC таймерін санау уақытын сақтайды;
4. Файлдан уақыт пен күнді оқып, RTC орнатыңыз;
5. time.txt файлын жабыңыз;
6. «LinkSpritePhoto» фотосуреттерін сақтауға арналған каталог жасаңыз;
7. Тақтадағы PA0 түймесін басқанда, фотосуретке түсіріп, оны картаға сақтаңыз (фотосурет түсіріліп жатқанда, көк жарық диоды жанады);
8. Егер қандай да бір функция орындалмаса, біз шексіз циклге түсіп, жасыл жарық диодты жыпылықтаймыз.

Камераны үздіксіз режимде іске қосу үшін main.c ішіндегі келесі жолдарға түсініктеме алу керек:

//EnabledButtonStart = 101; // Циклда іске қосу үшін осы жолға түсініктемені алып тастаңыз // Delay(300); // Циклді бастау үшін кешіктіру
Және осы жолға түсініктеме беріңіз:

EnabledButtonStart = 0; // Циклда іске қосу үшін осы жолға түсініктеме беріңіз
Содан кейін оны қосқан кезде камера үздіксіз фотосуреттер түсіре бастайды.

Жалпы, мен бұл камераның қалай жұмыс істейтінін сипаттадым, енді мен жұмыстың нәтижесін көрсете аламын.

  • Оқулық

STM32F4Discovery – камераны DCMI интерфейсі арқылы қосыңыз

Бір кездері ұялы телефоннан микроконтроллерге камераны қосу STM32F407VGT6(ол тақтада орын алады STM32F4Discovery), Мен бұл контроллерде бұл мәселе үшін арнайы аппараттық интерфейс бар екендігі туралы тіпті ойламадым. Мүмкін мен деректер кестесін мұқият оқымаған шығармын, бірақ мен әрқашан интерфейс деп ойлайтынмын DCMIпакеттердегі чиптер үшін ғана қолжетімді UFBGA176Және LQFP 144 футтан. Алайда, жақында мен дауысты бөлшекті таптым: 100 аяқты STM32F407Сондай-ақ бортында DCMI бар.
MK-мен әртүрлі мобильді жабдықты (атап айтқанда, СКД және камераларды) зерттеудің және бірлесіп іске қосудың үлкен жанкүйері болғандықтан, мен мұндай жаңалықты елеусіз қалдыра алмадым және STM32 перифериялық құрылғыларын зерттеуде бұл олқылықты толтыруды шештім. Шын мәнінде, бұл материал туындаған идеяны жүзеге асырудың сипаттамасына арналған.

Кішкене теория.

Ең алдымен, сіз не туралы айтып жатқанымызды елестетуіңіз керек - дәлірек айтсақ, CMOS камерасы дегеніміз не және ол не үшін қолданылады.
Камераның бұл түрі сенсордан ақпаратты сандық түрде шығарады: RGB, YCbCr, сонымен қатар қысылған пішінде - JPEG. Әртүрлі камералардың мүмкіндіктері бойынша өзіндік нюанстары бар, мен ертеде телефонымнан суырып алған төмен ажыратымдылығы бар (VGA, 640x480) камераның өте нақты жағдайын қарастырамын ». Siemens C72«(датчик PixelPlus PO2030N). Бұл камера жұмыс істеудің қарапайымдылығына және көп немесе аз таралған түрге жататындығына байланысты зерттеуге ең қолайлы. Ұзақ уақыт бұрын мен оған шағын тақта жасадым (қосылудың қарапайымдылығы үшін) - автобуста 2,8 В тұрақтандырғышы және тартылатын резисторлары бар I2C. Міне (камера кабелі мен қосқыш корпустың астында жасырылған).

Деректер пішімі саласындағы нюанстардан басқа, камералар синхрондау түйреуіштерінің санында да ерекшеленуі мүмкін. Көптеген (менің ойымша) сенсорларда арнайы көлденең және тік синхрондау түйреуіштері бар; бірақ тек пиксельдік строб шығысы бар камералар бар және олар сізге арнайы жіберілетін кодтарды (мысалы, 0x00немесе 0xFF). Менде бар камерада сыртқы синхрондау түйреуіштері бар.
Сіз блок түріндегі камераның шамамен схемалық көрінісін бағалай аласыз.

Көбінесе CMOS камералары интерфейс арқылы басқарылады I2C(бірақ мен басқаратын құрылғыларды көрдім UART). I2C арқылы әртүрлі параметрлер конфигурацияланады, мысалы: ажыратымдылық, түс гаммасы, шығыс деректер пішімі және т.б.
Қорытынды EXTCLK– сырттан қамтамасыз етілуі қажет камера сағаты. DCLK– алдыңғы немесе соңғы жиегі бойынша деректер камера деректер шинасына жазылатын строб сигналы (мысалы, матрицаның бір пикселінің деректер байты немесе камера жұмыс істеп тұрса, «жарты пиксельдік» деректер байты RGB565). HSYNC– жаңа жолдың басталуын көрсететін көлденең синхрондау сигналы және VSYNC– синхрондау сигналы, оның белсенді деңгейі жаңа кадрдың басталуын көрсетеді. Қорытындылар D0..D7– деректер шинасы; Әдетте, мұндай камералар үшін бұл сегіз разрядты.
Енді синхрондау сигналдары туралы көбірек сөйлесейік.

Графиктер камераның сигнал әрекеті үшін конфигурацияланғанын көрсетеді DCLKтек белсенді кезеңде HSYNC(дәлірек айтқанда, бізді қызықтыратын осы фаза; «жолды беру» кезеңіндегі сағаттық сигнал бізге қызық емес). Егер камера 320x240 ажыратымдылыққа орнатылған болса, онда әрбір импульс кезінде HSYNC 320 импульс сәйкес келеді DCLK, және кезеңде VSYNC – 240 HSYNC.
Ұлғайтқан кезде деректер шинасында не болып жатқанын көреміз.

Көтерілген жиекте (бұл жағдайда) деректер шинасында байт жойылады, оны көрсету үшін тікелей дисплейге жіберуге немесе кейінгі өңдеу үшін буферге «бүктеуге» болады.

Теориялық тұрғыдан бәрі азды-көпті түсінікті, енді интерфейс туралы DCMIмикроконтроллер STM32.

Интерфейс DCMIені 14 битке дейінгі деректер шинасымен жұмыс істей алады, аппараттық және бағдарламалық құралды синхрондауды, сондай-ақ деректер пішімдерін қолдайды: YCbCr, RGB және JPEG.
Сонымен қатар, DCMIбуферді қамтиды FIFO, үзілістерді конфигурациялау (соның ішінде деректер регистрін толтыру кезінде) және операцияны конфигурациялау мүмкіндігі бар DMA.

бастап үзеді DCMIкелесі жағдайлар орын алған кезде шақырылуы мүмкін: жолдың соңы, кадрдың соңы, қабылдау буферінің толып кетуі, синхрондау қатесі анықталды (ішкі синхрондаумен).
Арнайы камера сағатының болмауы мені біраз таң қалдырды. Әзірлеушілер неге екенін білмеймін SGS MicroelectronicsОл тасталды, бірақ мен үшін, мысалы, теңшелетін сағат көзі болуы өте ыңғайлы болар еді.
Жеке мен 4 МГц жиілігі бар шаршы толқынды жасау үшін PWM режимінде қосылған жалпы мақсаттағы таймер-есептегішті қолдандым. Әрине, мұндай сағатпен сіз жоғары FPS ала алмайсыз, бірақ мен бірден тапсырыс беремін - мен пайдаланып жатқан дисплей қосылмаған FSMC, сондықтан бүкіл тізбектегі ең ұзын функция СКД шығыс функциясы болып табылады, сондықтан жоғары жиілікте экранға кескін шығару сәтсіз болады. Сондықтан жүкті түсірмес бұрын мен таймерді өшіремін, ал одан кейін таймерді қайта қосамын.
Аппараттық модуль DCMIдеректер регистріне қосымша он бақылау/күй регистрлерін қамтиды. Бұл: бақылау регистрі ( DCMI_CR), күй тізілімі ( DCMI_SR), үзу күйінің тіркелімі ( DCMI_RIS), үзу қосу регистрі ( DCMI_IER), үзіліс маскасының регистрі ( DCMI_MIS), жалаушаны қалпына келтіру регистрін үзу ( DCMI_ICR), ішкі сағат кодының регистрі ( DCMI_ESCR), ішкі сағат коды масканы қалпына келтіру регистрі ( DCMI_ESUR), кадрдың бір бөлігін түсіру кезіндегі бастапқы мәндердің тіркелімі ( DCMI_CWSTRT) және CropWindow режимінде кадр фрагменті өлшемі регистрі ( DCMI_CWSIZE). Және, әрине, деректер тізілімі - DCMI_DR.
Бұл жағдайда кадрдың бір бөлігін түсіруге және ішкі синхрондауға қатысты регистрлер бізді қызықтырмайды. Мен үзілістерді әзірге жалғыз қалдыруды шештім, сондықтан тек бақылау регистрін толығырақ қарастырған жөн. DCMI_CRжәне күй тізілімі DCMI_SR.

Басқару регистрі бізге камерамен өзара әрекеттесу пішімін толығымен реттеуге мүмкіндік береді: деректер шинасы өлшемі, белсенді сызық деңгейлері HSYNCЖәне VSYNC, т.б.

Қалпында. Бит ҚОСУ– интерфейстің іске қосылғаны айтпаса да түсінікті. Өріс EDM (кеңейтілген деректер режимі) – деректер шинасы өлшемі; Менің камерамның сегіз биттік шинасы бар, сондықтан бұл өріс «00» мәніне орнатылуы керек. Өріс FCRC (кадрды түсіру жылдамдығын басқару) FPC аздап реттеуге мүмкіндік береді: 00 – барлық кіріс кадрлар түсіріледі, 01 – әрбір екінші кадр, 10 – әрбір төртінші кадр. Биттар VSPOLЖәне HSPOL– тік және көлденең синхрондау сызықтарының белсенді деңгейлері. Белсенді деңгейлер еленбейді және белсенді кезеңдерде ешқандай деректер түсірілмейді, мұны ескеру қажет. PCKPOL– пиксель стробының белсенді деңгейінің биті – шинадан деректерді оқу үшін сигналдың қай шетінде: алдыңғы немесе артқы. ESS– синхрондау әдісін таңдауға арналған бит: сыртқы немесе ішкі. JPEG– кіріс деректер пішімін таңдау – қысылған немесе жоқ. егін– кадр фрагментін түсіру таңдау биті ( кесу терезесі). Егер бұл бит біреуге орнатылса, интерфейс регистрлердегі мәндермен анықталған терезеде деректерді түсіреді DCMI_CWSTRTЖәне DCMI_CWSIZE.

Сонымен, оны реттейік.
Мен ST стандартты перифериялық кітапханасын қолдануға үйренгендіктен (бірақ жаңа перифериялық құрылғылармен жұмыс істеудің алғашқы итерацияларында мен оны регистрлерді қолмен өңдемейінше ешқашан пайдаланбаймын), мен параметрлерді кітапхана арқылы орнаттым.

Жарамсыз DMIInitialRoutine(void) ( DCMI_InitTypeDef DCMI_CamType; DCMI_DeInit(); DCMI_CamType.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_CamType.DCMI_CaptureRate = DCCMIF DCC_rall; ExtendedDataMode = DCMI_ExtendedData Mode_8b; DCMI_CamType.DCMI_SynchroMode = DCMI_CamType;
Негізі менің қажеттіліктерім үшін регистрдегі бір битке қол тигізбеу мүмкін болды DCMI_CR– әдепкі бойынша олар қалпына келтіріледі – биттерді қоспағанда ТҮСІРУЖәне ҚОСУ.
Интерфейс конфигурацияланған және пайдалануға дайын. Камераға сағат сигналын жібергеннен кейін интерфейс өңдеуге қажет деректерді ала бастайды.
Бастау үшін мен өзіме ең қарапайым тапсырманы қойдым - деректерді өңдеу аз болатындай етіп дисплейде кескінді көрсету.
Күй регистрі бізге қабылдау буферінен деректерді уақтылы оқуға көмектеседі DCMI_SR.

Оқу үшін биттердің өте аз саны бар - тек үшеуі. Биттар HSYNCЖәне VSYNCсәйкес желілердің күйі туралы сигнал беру: белсенді фаза немесе желі беру; ең қызығы - бит FNE. Ол бізге буферді деректермен толтыру керектігін айтады. Немесе оны толтырмағаны үшін.
Консервіленген контурдағы қашау күйін тексеру FNEВ DCMI_SR, біз қабылдаушы отыз екі разрядты буферге деректердің келуі туралы білеміз. Менің жағдайда деректер келесідей орналасады:

Битті орнату кезінде FNEкүй тізілімінде DCMI_SRҚабылдаушы буферде төрт байт, екі көрші пикселден алынған деректер болады: Байт0 Және Байт1 – 16 пиксельдік бит n, А Байт2 Және Байт3 – 16 пиксельдік бит n+1. Маған тек оларды біріктіріп, дисплейге жіберу керек. Сонымен, негізгі цикл келесідей көрінеді:
while (1) ( while ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == RESET); //TIM_Cmd буферін күтуде(TIM3, DISABLE); //CAM сағатын өшіру cam_grab = (DCMI->DR); //SendLCDataBте буферін оқу (cam_grab = (DCMI->DR)>>16;
Яғни, биттің орнатылуын күтемін FNEкүй тізілімінде DCMI_SR, содан кейін дисплейге екі қадаммен 16 бит деректерді жүктеймін.
Осы жерде мен логикалық қорытындыға келгім келеді, бірақ олай болмады.
Микробағдарламаны жыпылықтап, МК қайта іске қосқаннан кейін мен дисплейде көрдім ... жоқ, мен өзімнің өте таныс физикамды көрдім, бірақ қара және көк реңктерде. Қызыл және жасыл түстер мүлдем жоқ болды.
Түзеткішпен қысқаша есеп беруден кейін мыналар анықталды: интерфейс деректер регистрінде бір пиксельге тек 16 бит деректер болды, төменгі 8 бит орнында орналасқан. Байт0 (жоғарыдағы суретті қараңыз), ақсақалдар орнында Байт2 . Кеңістіктер Байт1 Және Байт3 олар бос болды. Осы уақытқа дейін мен құжаттама мен шындық арасындағы бұл қайшылықтың қайдан шыққанын түсінбедім, мүмкін мен STM-ге хабарласамын.
Нәтижесінде интерфейсті пайдаланып камерадан сурет ала алдық DCMIкейбір қиындықтарсыз болмаса да. Суретте мен демонстрациялық тақтаның суреті көрсетілген дисплейдің фотосын көрсетемін STM32F3Discoveryменің камерамнан.

Қорытындылардан мынаны көреміз: EXTCLK, PIXCK, HSYNCЖәне VSYNC, логикалық анализаторды қоссаңыз.

Барлығы күткендей көрінеді: 240 импульс HSYNCбір ұзақтығына сәйкес келеді VSYNC, 320 PIXCK- бірде HSYNC. Белсенді кезеңде HSYNCкамера сигналдар шығармайды PIXCK– ол дәл солай орнатылған.
Жалпы алғанда, интерфейс мені біраз ренжітті. Камераның «стандартты» сағаттық аяғының болмауы, азды-көпті қызықты кірістірілген мүмкіндіктердің болмауы (аппараттық JPEG кодтары туралы не айтасыз?) және тіпті жартылай пісірілген жерде бубенмен билеу. FIFO
Үзіліс кезінде камера жұмысын ұйымдастыру PIXCK, HSYNCЖәне VSYNCМен аппараттық құралдарды пайдаланып камерамен жұмыс істегенімдей көп қиындық көрмедім DCMI.
Дегенмен, жақын арада мен кадрды түсіріп, оны қысуға тырысамын JPEG, және SD картасына сурет жазып көріңіз.
PS. Мүмкін болса, мен жобаға сілтеме беремін " Код::Блоктар«- кенет біреуге пайдалы болады.



Бөлісу