ወደ stm32 የድር ካሜራ ግንኙነት መተግበሪያ። የደህንነት መረጃ ፖርታል. ትንሽ የንድፈ ሀሳብ

ካርዱ ሁለት ተግባራትን በመጠቀም ተያይዟል.
1. ከተግባር ጋር ዲስክ_ጀምርካርታው በመጀመር ላይ ነው።
2. በመቀጠል, መጫን ያስፈልግዎታል f_mount.

እነዚህን እርምጃዎች በተሳካ ሁኔታ ካጠናቀቁ በኋላ በካርዱ የተለያዩ ስራዎችን ማከናወን ይችላሉ, ለምሳሌ:
1. f_ክፈት።- ፋይል መክፈት
2. f_መዝጋት- ፋይሉን መዝጋት;
3. f_mkdir- ማውጫ መፍጠር;
4. f_chdir- ማውጫ ምርጫ;
5. ረ_መፃፍ- በፋይል ላይ መጻፍ;
6. ረ_አንብብ- ከፋይሉ ማንበብ.

ከካሜራ እና ከኤስዲ ካርዱ ጋር ያለውን ስራ ገለጽኩኝ፣ አሁን የፕሮግራሙን አጠቃላይ አሰራር እንመልከት፡-
1. የ SD ካርዱን ያስጀምሩ;
2. የካሜራ ሞጁሉን ያስጀምሩ;
3. የፋይሉን ጊዜ ይክፈቱ txt (ፋይሉ የቅርጸቱን አንድ መስመር መያዝ አለበት 01.01.2014_12:00 የ RTC ሰዓት ቆጣሪን ለመቁጠር ጊዜን የሚያከማች;
4. ከፋይሉ ላይ ሰዓቱን እና ቀኑን እናነባለን እና RTC ን አዘጋጅተናል;
5. time.txt ፋይልን ዝጋ;
6. ፎቶዎችን ለማከማቸት ማውጫ ይፍጠሩ "LinkSpritePhoto";
7. በቦርዱ ላይ የ PA0 ቁልፍን ሲጫኑ, ፎቶግራፍ አንስተን በካርዱ ላይ እናስቀምጠዋለን (ፎቶው በሚወሰድበት ጊዜ, ሰማያዊው LED በርቷል);
8. የማንኛቸውም ተግባራት ውድቀት በሚከሰትበት ጊዜ, ማለቂያ ወደሌለው ዑደት ውስጥ እንወድቃለን እና አረንጓዴውን LED ብልጭ ድርግም እናደርጋለን.

ካሜራውን በተከታታይ ሁነታ ለመጀመር የሚከተሉትን መስመሮች በ main.c ላይ አስተያየት ይስጡ።

//EnabledButtonStart = 101; // በ loop ውስጥ ለማሄድ ይህንን መስመር አስተያየት አይስጡ // መዘግየት(300); // በ loop ውስጥ ለማሄድ መዘግየት
እና በዚህ መስመር ላይ አስተያየት ይስጡ-

EnabledButtonStart = 0; // በ loop ውስጥ ለማሄድ ይህንን መስመር አስተያየት ይስጡ
ከዚያ ሲበራ ካሜራው ያለማቋረጥ ፎቶዎችን መቅዳት ይጀምራል።

በአጠቃላይ ይህ ካሜራ እንዴት እንደሚሰራ ገለጻ አድርጌያለሁ, አሁን የስራውን ውጤት ማሳየት ይችላሉ.

በአንድ ወቅት ካሜራን ከሞባይል ስልክ ወደ ማይክሮ መቆጣጠሪያ ማገናኘት STM32F407VGT6(በቦርዱ ላይ ይከናወናል STM32F4ግኝት።), ይህ ተቆጣጣሪ ለዚህ ጉዳይ ልዩ የሃርድዌር በይነገጽ አለው ብዬ አላሰብኩም ነበር. ምናልባት የውሂብ ሉህውን ሳላስብ አንብቤዋለሁ፣ ግን ሁልጊዜ በይነገጹ እንደሆነ አስብ ነበር። DCMIበጥቅሎች ውስጥ ለቺፕስ ብቻ ይገኛል UFBGA176እና LQFPከ 144 ጫማ. ሆኖም፣ ብዙም ሳይቆይ፣ በድምፅ የተነገረ ዝርዝር አገኘሁ፡- 100 ጫማ STM32F407በቦርዱ ላይ DCMI አለው።
የተለያዩ የሞባይል ሃርድዌርን (በተለይ ኤልሲዲ እና ካሜራዎችን) በMK የማጥናትና የማስጀመር ትልቅ አድናቂ በመሆኔ፣ ይህን የመሰለ ግኝት ማለፍ አልቻልኩም፣ እናም ይህንን ክፍተት በ STM32 ተጓዳኝ አካላት ጥናት ለመሙላት ወሰንኩ። በእውነቱ, ይህ ቁሳቁስ ለተነሳው ሀሳብ አተገባበር መግለጫ የተሰጠ ነው.

በጣም ትንሽ ጽንሰ-ሀሳብ።

በመጀመሪያ ደረጃ ስለ ምን እንደሆነ መረዳት ያስፈልግዎታል - ወይም ይልቁንስ CMOS ካሜራ ምን እንደሆነ እና በምን እንደሚበላ።
የዚህ ዓይነቱ ካሜራ መረጃን ከሴንሰሩ በዲጂታል መልክ: RGB, YCbCr, እና እንዲሁም በተጨመቀ መልኩ - JPEG. የተለያዩ ካሜራዎች ከአቅም አንፃር የራሳቸው የሆነ ልዩነት አላቸው፣ እኔ በጥንት ጊዜ ከስልኬ አውጥቼው የነበረውን አነስተኛ ጥራት (VGA, 640x480) ያለው ካሜራ በጣም የተወሰነ ጉዳይን እመለከታለሁ። ሲመንስ C72» (ዳሳሽ PixelPlus PO2030N). ይህ ካሜራ በአሰራር ቀላልነቱ እና ብዙ ወይም ባነሰ የተለመደ ዓይነት በመሆኑ ለማጥናት በጣም ተስማሚ ነው። ከረጅም ጊዜ በፊት ለእሱ ትንሽ ሰሌዳ ቀርጸውለት (ለተሻለ ግንኙነት ምቾት) - በ 2.8 ቮ መቆጣጠሪያ እና በአውቶቡስ ላይ የሚስቡ ተቃዋሚዎች I2C. እዚህ ነው (የኬብሉ እና የካሜራ ማገናኛ በማሸጊያው ስር ተደብቀዋል).


በመረጃ ቅርፀት መስክ ላይ ካሉ ጥቃቅን ነገሮች በተጨማሪ ካሜራዎች በማመሳሰል ፒን ብዛት ሊለያዩ ይችላሉ። አብዛኛዎቹ (በእኔ አስተያየት) አነፍናፊዎች አግድም እና ቋሚ የማመሳሰል ፒን አላቸው; ግን የፒክሰል ስትሮብ ውፅዓት ብቻ ያላቸው ካሜራዎች አሉ ፣ እና ልዩ የሚተላለፉ ኮዶችን በመጠቀም ስለ አዲስ መስመር / ፍሬም መጀመሪያ ያሳውቁዎታል (ለምሳሌ ፣ 0x00ወይም 0xFF). ያለኝ ካሜራ ውጫዊ የማመሳሰል ፒን አለው።
በብሎክ መልክ የካሜራውን ግምታዊ ንድፍ ማውጣት ይችላሉ።


በአብዛኛው፣ የCMOS ካሜራዎች የሚቆጣጠሩት በይነገጽ ነው። I2C(ምንም እንኳን መሣሪያዎች ቁጥጥር ሲደረግባቸው አይቻለሁ UART). I2Cን በመጠቀም፣ የተለያዩ መለኪያዎች ተዋቅረዋል፣ ለምሳሌ፡ ጥራት፣ የቀለም ጋሙት፣ የውጤት ውሂብ ቅርጸት፣ ወዘተ.
መደምደሚያ EXTCLK- የካሜራውን መቆንጠጥ, ከውጭ መቅረብ ያለበት. DCLK- የስትሮብ ምልክት፣ በካሜራ ዳታ አውቶቡስ ላይ ውሂቡ በሚመዘገብበት መሪ ወይም ተከታይ ጠርዝ ላይ (ለምሳሌ የማትሪክስ አንድ ፒክሴል ዳታ ባይት ወይም “ግማሽ ፒክሴል” ዳታ ባይት) ካሜራው እየሰራ ከሆነ። በ ሁነታ ውስጥ RGB565). HSYNCአዲስ መስመር መጀመሩን የሚያመለክት አግድም የማመሳሰል ምልክት ነው፣ እና ቪኤስኤንሲ- የማመሳሰል ምልክት ፣ የነቃ ደረጃው አዲስ ፍሬም መጀመሩን ያሳያል። መደምደሚያዎች D0..D7- የውሂብ አውቶቡስ; እንደ አንድ ደንብ, በእንደዚህ አይነት ካሜራዎች ውስጥ ስምንት-ቢት ነው.
አሁን ስለ ማመሳሰል ምልክቶች የበለጠ።


ግራፎቹ ካሜራው ወደ ምልክት እንቅስቃሴ መዘጋጀቱን ያሳያል DCLKበንቃት ደረጃ ላይ ብቻ HSYNC(ይህ ደረጃ እኛን የሚስብ ነው ፣ በ “መስመር ምግብ” ጊዜ ውስጥ የሰዓት ምልክት ለእኛ አስደሳች አይደለም)። ካሜራው ወደ 320x240 ጥራት ከተዋቀረ, ከዚያም በእያንዳንዱ የልብ ምት ጊዜ HSYNCየሚመጥን 320 ግፊቶችን DCLK, እና በጊዜ ውስጥ ቪኤስኤንሲ – 240 HSYNC.
በማጉላት ጊዜ በመረጃ አውቶቡሱ ላይ ምን እየተፈጠረ እንዳለ እናያለን።


በማደግ ላይ ባለው ጠርዝ (በዚህ ጉዳይ ላይ) አንድ ባይት ከውሂብ አውቶቡስ ውስጥ ይወገዳል, ይህም ወዲያውኑ ወደ ማሳያው ማሳያ ሊላክ ይችላል, ወይም ለቀጣይ ሂደት "መጨመር" ወደ ቋት.
በንድፈ ሀሳብ, ሁሉም ነገር የበለጠ ወይም ያነሰ ግልጽ ነው, አሁን ስለ በይነገጽ DCMIማይክሮ መቆጣጠሪያ STM32.
በይነገጽ DCMIከዳታ አውቶቡስ ጋር እስከ 14 ቢት ስፋት ያለው፣ ሁለቱንም የሃርድዌር እና የሶፍትዌር ማመሳሰልን እንዲሁም የውሂብ ቅርጸቶችን ይደግፋል፡ YCbCr፣ RGB እና JPEG።
ከዚህም በተጨማሪ እ.ኤ.አ. DCMIቋት ይዟል FIFO, ማቋረጦችን (የውሂብ መዝገቡን መሙላትን ጨምሮ) የማዋቀር እና ስራን የማዋቀር ችሎታ አለው ዲኤምኤ.


ይቋረጣል ከ DCMIየሚከተሉት ሁኔታዎች ሲከሰቱ ሊጠራ ይችላል-የመስመር መጨረሻ, የፍሬም መጨረሻ, የተቀባዩ ቋት ከመጠን በላይ መጨመር, የማመሳሰል ስህተትን መለየት (ከውስጣዊ ማመሳሰል ጋር).
ልዩ የካሜራ ሰዓት ውፅዓት ባለመኖሩ ግራ ተጋባሁ። ገንቢዎች ለምን እንደመጡ አላውቅም SGS ማይክሮኤሌክትሮኒክስተትቷል ፣ ግን ለእኔ ፣ ለምሳሌ ፣ ሊስተካከል የሚችል የሰዓት ምንጭ ማግኘት በጣም ምቹ ነው።
በግሌ የ 4 MHz ድግግሞሽ ያለው ስኩዌር ሞገድ ለማመንጨት በ PWM ሁነታ የበራ አጠቃላይ ዓላማ የሰዓት ቆጣሪ-ቆጣሪ ተጠቀምኩ። በእርግጥ ትልቅ FPS በእንደዚህ ዓይነት ሰዓት ማግኘት አይችሉም ፣ ግን ወዲያውኑ ቦታ አስይዛለሁ - የምጠቀመው ማሳያ አልተገናኘም FSMC, ስለዚህ በጠቅላላው ሰንሰለት ውስጥ ያለው ረጅሙ ተግባር የ LCD ውፅዓት ተግባር ነው, ስለዚህ, ከፍ ባለ ድግግሞሽ, በስክሪኑ ላይ ያለው የምስሉ ማሳያ ይስተጓጎላል. ስለዚህ, ከማውረድዎ በፊት, ሰዓት ቆጣሪውን አጠፋለሁ, እና ከእሱ በኋላ, ሰዓት ቆጣሪውን እንደገና አበራለሁ.
የሃርድዌር ሞጁል 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እና ቪኤስኤንሲወዘተ.


በስነስርአት. ቢት አንቃ- በስራው ውስጥ የበይነገጽ ማካተት ሳይናገር ይሄዳል. መስክ ኢ.ዲ.ኤም (የተራዘመ የውሂብ ሁነታ) - የውሂብ አውቶቡስ መጠን; በካሜራዬ ላይ ያለው አውቶቡስ ስምንት ቢት ነው፣ ስለዚህ ይህ መስክ ወደ "00" መቀናበር አለበት። መስክ FCRC (የፍሬም ቀረጻ ፍጥነት መቆጣጠሪያ) FPC ን በትንሹ ማስተካከል ያስችላል: 00 - ሁሉም መጪ ክፈፎች ይያዛሉ, 01 - በእያንዳንዱ ሰከንድ ፍሬም, 10 - በእያንዳንዱ አራተኛ. ቢትስ ቪኤስፒኤልእና HSPOL- የቋሚ እና አግድም የማመሳሰል መስመሮች ንቁ ደረጃዎች። ንቁ ደረጃዎች ችላ ይባላሉ እና ውሂብ በንቃት ጊዜ ውስጥ አይያዝም, ይህ ግምት ውስጥ መግባት አለበት. PCKPOL- የፒክሰል ስትሮብ ንቁ ደረጃ ትንሽ - ከአውቶቡሱ ላይ መረጃ ለማንበብ በየትኛው የምልክት ጠርዝ ላይ: መምራት ወይም መከተል። ኢኤስ.ኤስየማመሳሰል ዘዴን ለመምረጥ ቢት: ውጫዊ ወይም ውስጣዊ. JPEG- የገቢ ውሂብ ቅርጸት ምርጫ - የታመቀ ወይም ያልተጨመቀ። ሰብል- የፍሬም ቁራጭ ቀረጻ ምርጫ ቢት ( የሰብል መስኮት). ይህ ቢት ወደ አንድ ከተዋቀረ በይነገጹ በመመዝገቢያዎቹ ውስጥ ባሉት ዋጋዎች በሚወሰን መስኮት ውስጥ ውሂብን ይይዛል DCMI_CWSTRTእና DCMI_CWSIZE.
እንግዲያው፣ እናዋቅረው። መደበኛውን የፔሪፈራል ቤተ መፃህፍት ከ ST መጠቀም ስለለመድኩኝ (ምንም እንኳን በመጀመሪያዎቹ ድግግሞሾች ከአዳዲስ ተጓዳኝ አካላት ጋር በ "መመዝገቢያዎች" ውስጥ እስክገባ ድረስ በጭራሽ አልጠቀምበትም) ፣ ቤተ-መጽሐፍቱን በመጠቀም ማዋቀሩን እሰጣለሁ።

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 = DCMI_ExtendedDataMode_8b; DCMI_CamType.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; DCMI_Init(&DCMI_CamType); DCMI_CaptureCmd(ENABLE); DCMI_Cmd(ENABLE መመለስ);)

በእውነቱ፣ ለፍላጎቴ በመዝገቡ ውስጥ አንድም ትንሽ መንካት አልተቻለም DCMI_CR- በነባሪነት እንደገና ተጀምረዋል - ከቢት በስተቀር ቀረጻእና አንቃ.
በይነገጹ ተዋቅሮ ለመሄድ ዝግጁ ነው። ለካሜራው የሰዓት ምልክት ከሰጠ በኋላ በይነገጹ እኛ ለማስኬድ የሚያስፈልገንን መረጃ መቀበል ይጀምራል።
ለጀማሪዎች እራሴን በጣም ቀላል የሆነውን ስራ አዘጋጅቻለሁ - ምስሉን በምስሉ ላይ ለማሳየት, የውሂብ ሂደት አነስተኛ ይሆናል.
የሁኔታ ምዝገባው ከተቀባዩ ቋት የተገኘውን መረጃ በወቅቱ ለማንበብ ይረዳናል። DCMI_SR.

በጣም ትንሽ የቢቶች ቁጥር ለንባብ ይገኛል - ሶስት ብቻ። ቢትስ HSYNCእና ቪኤስኤንሲተዛማጅ መስመሮችን ሁኔታ ምልክት ያድርጉ: ንቁ ደረጃ ወይም የመስመር ምግብ; በጣም የሚያስደስት ትንሽ ነው FNE. ቋቱን በመረጃ እንድንሞላ ይነግረናል። ወይም አይሞላም።
የትንሽ ሁኔታን በቋሚ ዑደት በመፈተሽ ላይ FNEDCMI_SR, በተቀበለው ሠላሳ-ሁለት-ቢት ቋት ውስጥ ስለ የውሂብ መምጣት እንማራለን. እንደኔ ከሆነ ውሂቡ እንደሚከተለው ይቀመጣል፡-

ድብደባውን ሲያቀናብሩ FNEበሁኔታ መዝገብ ውስጥ DCMI_SRየመቀበያው ቋት አራት ባይት ይይዛል፣ የሁለት አጎራባች ፒክስሎች ውሂብ፡- ባይት0 እና ባይት1 - 16 ፒክስል ቢት n, ኤ ባይት2 እና ባይት3 - 16 ፒክስል ቢት n+1. ለእኔ የሚቀረው እነሱን በማጣመር እና በማሳያው ላይ እንዲታይ መላክ ብቻ ነው። ስለዚህ ዋናው ሉፕ ምን እንደሚመስል እነሆ:

ሳለ (1) (((DCMI_GetFlagStatus(DCMI_FLAG_FNE))) == ዳግም አስጀምር)፤ //ማቋቋሚያውን TIM_Cmd በመጠበቅ ላይ (TIM3፣ DISABLE)፤ //CAM የሰዓት ካሜራ ካሜራን አሰናክል = (DCMI->DR)፤ //የማንበብ ቋት መላክ ዳታByte_LCD (ካም_ግራብ)፤ cam_grab = (DCMI->DR)>>16፤ // የቋት 2ኛ ክፍል SendDataByte_LCD (ካም_ግራብ) ማንበብ፤ TIM_Cmd(ቲም3፣ አንቃ)፤ // CAM ሰዓትን እንደገና አንቃ)

ያም ማለት ድብደባው እስኪዘጋጅ ድረስ እየጠበቅኩ ነው FNEበሁኔታ መዝገብ ውስጥ DCMI_SR, እና ከዚያ በኋላ, በሁለት ማለፊያዎች ውስጥ, 16 ቢት ውሂብ ወደ ማሳያው እሰቅላለሁ.
በዚህ ነጥብ ላይ, ወደ ምክንያታዊ መደምደሚያ መድረስ እፈልጋለሁ, ግን እዚያ ነበር.
ኤምኬን ካበራሁ እና እንደገና ካስጀመርኩት በኋላ በስክሪኑ ላይ አየሁ ... አይ ፣ ለእኔ በጣም የማውቀው ፣ ግን በጥቁር እና በሰማያዊ ጥላዎች ውስጥ የራሴን ፊዚክስ አየሁ። ቀይ እና አረንጓዴ ቀለሞች ሙሉ በሙሉ አልነበሩም.
ከአራሚው ጋር የተወሰነ ከደረደሩ በኋላ የሚከተለው ተገኝቷል፡ የበይነገጽ ውሂብ መመዝገቢያ ለአንድ ፒክሰል 16 ቢት ውሂብ ብቻ ይዟል፣ የታችኛው 8 ቢት ደግሞ በቦታው ይገኛል። ባይት0 (ከላይ ያለውን ምስል ይመልከቱ) እና ሽማግሌዎቹ በቦታው ይገኛሉ ባይት2 . ክፍተቶች ባይት1 እና ባይት3 ባዶ ነበሩ። እስካሁን ድረስ በሰነዶቹ እና በእውነታው መካከል ያለው ልዩነት ከየት እንደመጣ አልገባኝም, እና ምናልባት, STM አገኛለሁ.
በዚህ ምክንያት በይነገጹን በመጠቀም ከካሜራ ምስል ማግኘት ችለናል። DCMIምንም እንኳን አንዳንድ ችግሮች ባይኖሩም. በሥዕሉ ላይ የማሳያ ሰሌዳው ምስል የታየበትን ማሳያ ፎቶ እሰጣለሁ STM32F3ግኝት።ከካሜራዬ.


ከም ውጽኢቱ ድማ ስለምንታይ ይኸውን። EXTCLK, PIXCK, HSYNCእና ቪኤስኤንሲ, አመክንዮአዊ ትንታኔን ካገናኙ.


ሁሉም ነገር በትክክል እንደተጠበቀው ይመስላል: 240 ጥራጥሬዎች HSYNCበአንድ ጊዜ ውስጥ ተስማሚ ቪኤስኤንሲ, 320 PIXCK- በአንድ HSYNC. በንቃት ደረጃ HSYNCካሜራው ምልክቶችን አያወጣም PIXCK- ልክ እንደተዋቀረ።
ባጠቃላይ አነጋገር፣ በበይነገጹ በተወሰነ መልኩ ቅር ተሰኝቼ ነበር። “የተለመደ” የካሜራ መቆንጠጫ እግር አለመኖር፣ ብዙ ወይም ያነሰ ሳቢ አብሮገነብ ቺፖች አለመኖር (ስለ ሃርድዌር JPEG ኢንኮደርስ?) እና ሌላው ቀርቶ ከበሮ ጋር በግማሽ አካባቢ መደነስ። FIFO
በማቋረጥ ላይ ከካሜራ ጋር ስራን ማደራጀት PIXCK, HSYNCእና ቪኤስኤንሲሃርድዌሩን ተጠቅሜ ከካሜራ ጋር በመስራት እንደ እኔ ብዙ ራስ ምታት አላጋጠመኝም። DCMI.
ቢሆንም፣ በቅርብ ጊዜ ውስጥ ፍሬም ለመያዝ እሞክራለሁ፣ ወደ ውስጥ እጨምቀው JPEG, እና ምስል ወደ ኤስዲ ካርድ ለመጻፍ ይሞክሩ.
ፒ.ኤስ. እንደዚያ ከሆነ ለፕሮጀክቱ አገናኝ እሰጣለሁ " ኮድ :: ማገድ"- በድንገት ወደ አንድ ሰው ይምጡ.

  • አጋዥ ስልጠና

STM32F4Discovery - ካሜራውን በ DCMI በይነገጽ ያገናኙ

በአንድ ወቅት ካሜራን ከሞባይል ስልክ ወደ ማይክሮ መቆጣጠሪያ ማገናኘት STM32F407VGT6(በቦርዱ ላይ ይከናወናል STM32F4ግኝት።), ይህ ተቆጣጣሪ ለዚህ ጉዳይ ልዩ የሃርድዌር በይነገጽ አለው ብዬ አላሰብኩም ነበር. ምናልባት የውሂብ ሉህውን ሳላስብ አንብቤዋለሁ፣ ግን ሁልጊዜ በይነገጹ እንደሆነ አስብ ነበር። DCMIበጥቅሎች ውስጥ ለቺፕስ ብቻ ይገኛል UFBGA176እና LQFPከ 144 ጫማ. ሆኖም፣ ብዙም ሳይቆይ፣ በድምፅ የተነገረ ዝርዝር አገኘሁ፡- 100 ጫማ STM32F407በቦርዱ ላይ DCMI አለው።
የተለያዩ የሞባይል ሃርድዌርን (በተለይ ኤልሲዲ እና ካሜራዎችን) በMK የማጥናትና የማስጀመር ትልቅ አድናቂ በመሆኔ፣ ይህን የመሰለ ግኝት ማለፍ አልቻልኩም፣ እናም ይህንን ክፍተት በ STM32 ተጓዳኝ አካላት ጥናት ለመሙላት ወሰንኩ። በእውነቱ, ይህ ቁሳቁስ ለተነሳው ሀሳብ አተገባበር መግለጫ የተሰጠ ነው.

በጣም ትንሽ ጽንሰ-ሀሳብ።

በመጀመሪያ ደረጃ ስለ ምን እንደሆነ መረዳት ያስፈልግዎታል - ወይም ይልቁንስ CMOS ካሜራ ምን እንደሆነ እና በምን እንደሚበላ።
የዚህ ዓይነቱ ካሜራ መረጃን ከሴንሰሩ በዲጂታል መልክ: RGB, YCbCr, እና እንዲሁም በተጨመቀ መልኩ - JPEG. የተለያዩ ካሜራዎች ከአቅም አንፃር የራሳቸው የሆነ ልዩነት አላቸው፣ እኔ በጥንት ጊዜ ከስልኬ አውጥቼው የነበረውን አነስተኛ ጥራት (VGA, 640x480) ያለው ካሜራ በጣም የተወሰነ ጉዳይን እመለከታለሁ። ሲመንስ C72» (ዳሳሽ PixelPlus PO2030N). ይህ ካሜራ በአሰራር ቀላልነቱ እና ብዙ ወይም ባነሰ የተለመደ ዓይነት በመሆኑ ለማጥናት በጣም ተስማሚ ነው። ከረጅም ጊዜ በፊት ለእሱ ትንሽ ሰሌዳ ቀርጸውለት (ለተሻለ ግንኙነት ምቾት) - በ 2.8 ቮ መቆጣጠሪያ እና በአውቶቡስ ላይ የሚስቡ ተቃዋሚዎች I2C. እዚህ ነው (የኬብሉ እና የካሜራ ማገናኛ በማሸጊያው ስር ተደብቀዋል).

በመረጃ ቅርፀት መስክ ላይ ካሉ ጥቃቅን ነገሮች በተጨማሪ ካሜራዎች በማመሳሰል ፒን ብዛት ሊለያዩ ይችላሉ። አብዛኛዎቹ (በእኔ አስተያየት) አነፍናፊዎች አግድም እና ቋሚ የማመሳሰል ፒን አላቸው; ግን የፒክሰል ስትሮብ ውፅዓት ብቻ ያላቸው ካሜራዎች አሉ ፣ እና ልዩ የሚተላለፉ ኮዶችን በመጠቀም ስለ አዲስ መስመር / ፍሬም መጀመሪያ ያሳውቁዎታል (ለምሳሌ ፣ 0x00ወይም 0xFF). ያለኝ ካሜራ ውጫዊ የማመሳሰል ፒን አለው።
በብሎክ መልክ የካሜራውን ግምታዊ ንድፍ ማውጣት ይችላሉ።

በአብዛኛው፣ የCMOS ካሜራዎች የሚቆጣጠሩት በይነገጽ ነው። I2C(ምንም እንኳን መሣሪያዎች ቁጥጥር ሲደረግባቸው አይቻለሁ UART). I2Cን በመጠቀም፣ የተለያዩ መለኪያዎች ተዋቅረዋል፣ ለምሳሌ፡ ጥራት፣ የቀለም ጋሙት፣ የውጤት ውሂብ ቅርጸት፣ ወዘተ.
መደምደሚያ EXTCLK- የካሜራውን መቆንጠጥ, ከውጭ መቅረብ ያለበት. DCLK- የስትሮብ ምልክት፣ በካሜራ ዳታ አውቶቡስ ላይ ውሂቡ በሚመዘገብበት መሪ ወይም ተከታይ ጠርዝ ላይ (ለምሳሌ የማትሪክስ አንድ ፒክሴል ዳታ ባይት ወይም “ግማሽ ፒክሴል” ዳታ ባይት) ካሜራው እየሰራ ከሆነ። በ ሁነታ ውስጥ RGB565). HSYNCአዲስ መስመር መጀመሩን የሚያመለክት አግድም የማመሳሰል ምልክት ነው፣ እና ቪኤስኤንሲ- የማመሳሰል ምልክት ፣ የነቃ ደረጃው አዲስ ፍሬም መጀመሩን ያሳያል። መደምደሚያዎች D0..D7- የውሂብ አውቶቡስ; እንደ አንድ ደንብ, በእንደዚህ አይነት ካሜራዎች ውስጥ ስምንት-ቢት ነው.
አሁን ስለ ማመሳሰል ምልክቶች የበለጠ።

ግራፎቹ ካሜራው ወደ ምልክት እንቅስቃሴ መዘጋጀቱን ያሳያል DCLKበንቃት ደረጃ ላይ ብቻ HSYNC(ይህ ደረጃ እኛን የሚስብ ነው ፣ በ “መስመር ምግብ” ጊዜ ውስጥ የሰዓት ምልክት ለእኛ አስደሳች አይደለም)። ካሜራው ወደ 320x240 ጥራት ከተዋቀረ, ከዚያም በእያንዳንዱ የልብ ምት ጊዜ HSYNCየሚመጥን 320 ግፊቶችን DCLK, እና በጊዜ ውስጥ ቪኤስኤንሲ – 240 HSYNC.
በማጉላት ጊዜ በመረጃ አውቶቡሱ ላይ ምን እየተፈጠረ እንዳለ እናያለን።

በማደግ ላይ ባለው ጠርዝ (በዚህ ጉዳይ ላይ) አንድ ባይት ከውሂብ አውቶቡስ ውስጥ ይወገዳል, ይህም ወዲያውኑ ወደ ማሳያው ማሳያ ሊላክ ይችላል, ወይም ለቀጣይ ሂደት "መጨመር" ወደ ቋት.

በንድፈ ሀሳብ, ሁሉም ነገር የበለጠ ወይም ያነሰ ግልጽ ነው, አሁን ስለ በይነገጽ DCMIማይክሮ መቆጣጠሪያ STM32.

በይነገጽ DCMIከዳታ አውቶቡስ ጋር እስከ 14 ቢት ስፋት ያለው፣ ሁለቱንም የሃርድዌር እና የሶፍትዌር ማመሳሰልን እንዲሁም የውሂብ ቅርጸቶችን ይደግፋል፡ YCbCr፣ RGB እና JPEG።
ከዚህም በተጨማሪ እ.ኤ.አ. DCMIቋት ይዟል FIFO, ማቋረጦችን (የውሂብ መዝገቡን መሙላትን ጨምሮ) የማዋቀር እና ስራን የማዋቀር ችሎታ አለው ዲኤምኤ.

ይቋረጣል ከ DCMIየሚከተሉት ሁኔታዎች ሲከሰቱ ሊጠራ ይችላል-የመስመር መጨረሻ, የፍሬም መጨረሻ, የተቀባዩ ቋት ከመጠን በላይ መጨመር, የማመሳሰል ስህተትን መለየት (ከውስጣዊ ማመሳሰል ጋር).
ልዩ የካሜራ ሰዓት ውፅዓት ባለመኖሩ ግራ ተጋባሁ። ገንቢዎች ለምን እንደመጡ አላውቅም SGS ማይክሮኤሌክትሮኒክስተትቷል ፣ ግን ለእኔ ፣ ለምሳሌ ፣ ሊስተካከል የሚችል የሰዓት ምንጭ ማግኘት በጣም ምቹ ነው።
በግሌ የ 4 MHz ድግግሞሽ ያለው ስኩዌር ሞገድ ለማመንጨት በ PWM ሁነታ የበራ አጠቃላይ ዓላማ የሰዓት ቆጣሪ-ቆጣሪ ተጠቀምኩ። በእርግጥ ትልቅ FPS በእንደዚህ ዓይነት ሰዓት ማግኘት አይችሉም ፣ ግን ወዲያውኑ ቦታ አስይዛለሁ - የምጠቀመው ማሳያ አልተገናኘም FSMC, ስለዚህ በጠቅላላው ሰንሰለት ውስጥ ያለው ረጅሙ ተግባር የ LCD ውፅዓት ተግባር ነው, ስለዚህ, ከፍ ባለ ድግግሞሽ, በስክሪኑ ላይ ያለው የምስሉ ማሳያ ይስተጓጎላል. ስለዚህ, ከማውረድዎ በፊት, ሰዓት ቆጣሪውን አጠፋለሁ, እና ከእሱ በኋላ, ሰዓት ቆጣሪውን እንደገና አበራለሁ.
የሃርድዌር ሞጁል 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እና ቪኤስኤንሲወዘተ.

በስነስርአት. ቢት አንቃ- በስራው ውስጥ የበይነገጽ ማካተት ሳይናገር ይሄዳል. መስክ ኢ.ዲ.ኤም (የተራዘመ የውሂብ ሁነታ) - የውሂብ አውቶቡስ መጠን; በካሜራዬ ላይ ያለው አውቶቡስ ስምንት ቢት ነው፣ ስለዚህ ይህ መስክ ወደ "00" መቀናበር አለበት። መስክ FCRC (የፍሬም ቀረጻ ፍጥነት መቆጣጠሪያ) FPC ን በትንሹ ማስተካከል ያስችላል: 00 - ሁሉም መጪ ክፈፎች ይያዛሉ, 01 - በእያንዳንዱ ሰከንድ ፍሬም, 10 - በእያንዳንዱ አራተኛ. ቢትስ ቪኤስፒኤልእና HSPOL- የቋሚ እና አግድም የማመሳሰል መስመሮች ንቁ ደረጃዎች። ንቁ ደረጃዎች ችላ ይባላሉ እና ውሂብ በንቃት ጊዜ ውስጥ አይያዝም, ይህ ግምት ውስጥ መግባት አለበት. PCKPOL- የፒክሰል ስትሮብ ንቁ ደረጃ ትንሽ - ከአውቶቡሱ ላይ መረጃ ለማንበብ በየትኛው የምልክት ጠርዝ ላይ: መምራት ወይም መከተል። ኢኤስ.ኤስየማመሳሰል ዘዴን ለመምረጥ ቢት: ውጫዊ ወይም ውስጣዊ. JPEG- የገቢ ውሂብ ቅርጸት ምርጫ - የታመቀ ወይም ያልተጨመቀ። ሰብል- የፍሬም ቁራጭ ቀረጻ ምርጫ ቢት ( የሰብል መስኮት). ይህ ቢት ወደ አንድ ከተዋቀረ በይነገጹ በመመዝገቢያዎቹ ውስጥ ባሉት ዋጋዎች በሚወሰን መስኮት ውስጥ ውሂብን ይይዛል DCMI_CWSTRTእና DCMI_CWSIZE.

እንግዲያው፣ እናዋቅረው።
መደበኛውን የፔሪፈራል ቤተ መፃህፍት ከ ST መጠቀም ስለለመድኩኝ (ምንም እንኳን በመጀመሪያዎቹ ድግግሞሾች ከአዳዲስ ተጓዳኝ አካላት ጋር በ "መመዝገቢያዎች" ውስጥ እስክገባ ድረስ በጭራሽ አልጠቀምበትም) ፣ ቤተ-መጽሐፍቱን በመጠቀም ማዋቀሩን እሰጣለሁ።

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 = DCMI_ExtendedDataMode_8b; DCMI_CamType.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; DCMI_Init(&DCMI_CamType); DCMI_CaptureCmd(ENABLE); DCMI_Cmd(ENABLE መመለስ);)
በእውነቱ፣ ለፍላጎቴ በመዝገቡ ውስጥ አንድም ትንሽ መንካት አልተቻለም DCMI_CR- በነባሪነት እንደገና ተጀምረዋል - ከቢት በስተቀር ቀረጻእና አንቃ.
በይነገጹ ተዋቅሮ ለመሄድ ዝግጁ ነው። ለካሜራው የሰዓት ምልክት ከሰጠ በኋላ በይነገጹ እኛ ለማስኬድ የሚያስፈልገንን መረጃ መቀበል ይጀምራል።
ለጀማሪዎች እራሴን በጣም ቀላል የሆነውን ስራ አዘጋጅቻለሁ - ምስሉን በምስሉ ላይ ለማሳየት, የውሂብ ሂደት አነስተኛ ይሆናል.
የሁኔታ ምዝገባው ከተቀባዩ ቋት የተገኘውን መረጃ በወቅቱ ለማንበብ ይረዳናል። DCMI_SR.

በጣም ትንሽ የቢቶች ቁጥር ለንባብ ይገኛል - ሶስት ብቻ። ቢትስ HSYNCእና ቪኤስኤንሲተዛማጅ መስመሮችን ሁኔታ ምልክት ያድርጉ: ንቁ ደረጃ ወይም የመስመር ምግብ; በጣም የሚያስደስት ትንሽ ነው FNE. ቋቱን በመረጃ እንድንሞላ ይነግረናል። ወይም አይሞላም።
የትንሽ ሁኔታን በቋሚ ዑደት በመፈተሽ ላይ FNEDCMI_SR, በተቀበለው ሠላሳ-ሁለት-ቢት ቋት ውስጥ ስለ የውሂብ መምጣት እንማራለን. እንደኔ ከሆነ ውሂቡ እንደሚከተለው ይቀመጣል፡-

ድብደባውን ሲያቀናብሩ FNEበሁኔታ መዝገብ ውስጥ DCMI_SRየመቀበያው ቋት አራት ባይት ይይዛል፣ የሁለት አጎራባች ፒክስሎች ውሂብ፡- ባይት0 እና ባይት1 - 16 ፒክስል ቢት n, ኤ ባይት2 እና ባይት3 - 16 ፒክስል ቢት n+1. ለእኔ የሚቀረው እነሱን በማጣመር እና በማሳያው ላይ እንዲታይ መላክ ብቻ ነው። ስለዚህ ዋናው ሉፕ ምን እንደሚመስል እነሆ:
ሳለ (1) ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == ዳግም አስጀምር)፤ //ማቋቋሚያውን TIM_Cmd በመጠበቅ ላይ (TIM3፣ DISABLE)፤ //CAM የሰዓት ካሜራ ካሜራን አሰናክል = (DCMI->DR)፤ //የማንበብ ቋት SendDataByte_LCD (ካም_ግራብ)፤ cam_grab = (DCMI->DR)>>16፤ // የቋት 2ኛ ክፍል SendDataByte_LCD (ካም_ግራብ) ማንበብ፤ TIM_Cmd(ቲም3፣ አንቃ)፤ // CAM ሰዓትን እንደገና አንቃ)
ያም ማለት ድብደባው እስኪዘጋጅ ድረስ እየጠበቅኩ ነው FNEበሁኔታ መዝገብ ውስጥ DCMI_SR, እና ከዚያ በኋላ, በሁለት ማለፊያዎች ውስጥ, 16 ቢት ውሂብ ወደ ማሳያው እሰቅላለሁ.
በዚህ ነጥብ ላይ, ወደ ምክንያታዊ መደምደሚያ መድረስ እፈልጋለሁ, ግን እዚያ ነበር.
ኤምኬን ካበራሁ እና እንደገና ካስጀመርኩት በኋላ በስክሪኑ ላይ አየሁ ... አይ ፣ ለእኔ በጣም የማውቀው ፣ ግን በጥቁር እና በሰማያዊ ጥላዎች ውስጥ የራሴን ፊዚክስ አየሁ። ቀይ እና አረንጓዴ ቀለሞች ሙሉ በሙሉ አልነበሩም.
ከአራሚው ጋር የተወሰነ ከደረደሩ በኋላ የሚከተለው ተገኝቷል፡ የበይነገጽ ውሂብ መመዝገቢያ ለአንድ ፒክሰል 16 ቢት ውሂብ ብቻ ይዟል፣ የታችኛው 8 ቢት ደግሞ በቦታው ይገኛል። ባይት0 (ከላይ ያለውን ምስል ይመልከቱ) እና ሽማግሌዎቹ በቦታው ይገኛሉ ባይት2 . ክፍተቶች ባይት1 እና ባይት3 ባዶ ነበሩ። እስካሁን ድረስ በሰነዶቹ እና በእውነታው መካከል ያለው ልዩነት ከየት እንደመጣ አልገባኝም, እና ምናልባት, STM አገኛለሁ.
በዚህ ምክንያት በይነገጹን በመጠቀም ከካሜራ ምስል ማግኘት ችለናል። DCMIምንም እንኳን አንዳንድ ችግሮች ባይኖሩም. በሥዕሉ ላይ የማሳያ ሰሌዳው ምስል የታየበትን ማሳያ ፎቶ እሰጣለሁ STM32F3ግኝት።ከካሜራዬ.

ከም ውጽኢቱ ድማ ስለምንታይ ይኸውን። EXTCLK, PIXCK, HSYNCእና ቪኤስኤንሲ, አመክንዮአዊ ትንታኔን ካገናኙ.

ሁሉም ነገር በትክክል እንደተጠበቀው ይመስላል: 240 ጥራጥሬዎች HSYNCበአንድ ጊዜ ውስጥ ተስማሚ ቪኤስኤንሲ, 320 PIXCK- በአንድ HSYNC. በንቃት ደረጃ HSYNCካሜራው ምልክቶችን አያወጣም PIXCK- ልክ እንደተዋቀረ።
ባጠቃላይ አነጋገር፣ በበይነገጹ በተወሰነ መልኩ ቅር ተሰኝቼ ነበር። “የተለመደ” የካሜራ መቆንጠጫ እግር አለመኖር፣ ብዙ ወይም ያነሰ ሳቢ አብሮገነብ ቺፖች አለመኖር (ስለ ሃርድዌር JPEG ኢንኮደርስ?) እና ሌላው ቀርቶ ከበሮ ጋር በግማሽ አካባቢ መደነስ። FIFO
በማቋረጥ ላይ ከካሜራ ጋር ስራን ማደራጀት PIXCK, HSYNCእና ቪኤስኤንሲሃርድዌሩን ተጠቅሜ ከካሜራ ጋር በመስራት እንደ እኔ ብዙ ራስ ምታት አላጋጠመኝም። DCMI.
ቢሆንም፣ በቅርብ ጊዜ ውስጥ ፍሬም ለመያዝ እሞክራለሁ፣ ወደ ውስጥ እጨምቀው JPEG, እና ምስል ወደ ኤስዲ ካርድ ለመጻፍ ይሞክሩ.
ፒ.ኤስ. እንደዚያ ከሆነ ለፕሮጀክቱ አገናኝ እሰጣለሁ " ኮድ :: ማገድ"- በድንገት ወደ አንድ ሰው ይምጡ.

  • አጋዥ ስልጠና

STM32F4Discovery - ካሜራውን በ DCMI በይነገጽ ያገናኙ

በአንድ ወቅት ካሜራን ከሞባይል ስልክ ወደ ማይክሮ መቆጣጠሪያ ማገናኘት STM32F407VGT6(በቦርዱ ላይ ይከናወናል STM32F4ግኝት።), ይህ ተቆጣጣሪ ለዚህ ጉዳይ ልዩ የሃርድዌር በይነገጽ አለው ብዬ አላሰብኩም ነበር. ምናልባት የውሂብ ሉህውን ሳላስብ አንብቤዋለሁ፣ ግን ሁልጊዜ በይነገጹ እንደሆነ አስብ ነበር። DCMIበጥቅሎች ውስጥ ለቺፕስ ብቻ ይገኛል UFBGA176እና LQFPከ 144 ጫማ. ሆኖም፣ ብዙም ሳይቆይ፣ በድምፅ የተነገረ ዝርዝር አገኘሁ፡- 100 ጫማ STM32F407በቦርዱ ላይ DCMI አለው።
የተለያዩ የሞባይል ሃርድዌርን (በተለይ ኤልሲዲ እና ካሜራዎችን) በMK የማጥናትና የማስጀመር ትልቅ አድናቂ በመሆኔ፣ ይህን የመሰለ ግኝት ማለፍ አልቻልኩም፣ እናም ይህንን ክፍተት በ STM32 ተጓዳኝ አካላት ጥናት ለመሙላት ወሰንኩ። በእውነቱ, ይህ ቁሳቁስ ለተነሳው ሀሳብ አተገባበር መግለጫ የተሰጠ ነው.

በጣም ትንሽ ጽንሰ-ሀሳብ።

በመጀመሪያ ደረጃ ስለ ምን እንደሆነ መረዳት ያስፈልግዎታል - ወይም ይልቁንስ CMOS ካሜራ ምን እንደሆነ እና በምን እንደሚበላ።
የዚህ ዓይነቱ ካሜራ መረጃን ከሴንሰሩ በዲጂታል መልክ: RGB, YCbCr, እና እንዲሁም በተጨመቀ መልኩ - JPEG. የተለያዩ ካሜራዎች ከአቅም አንፃር የራሳቸው የሆነ ልዩነት አላቸው፣ እኔ በጥንት ጊዜ ከስልኬ አውጥቼው የነበረውን አነስተኛ ጥራት (VGA, 640x480) ያለው ካሜራ በጣም የተወሰነ ጉዳይን እመለከታለሁ። ሲመንስ C72» (ዳሳሽ PixelPlus PO2030N). ይህ ካሜራ በአሰራር ቀላልነቱ እና ብዙ ወይም ባነሰ የተለመደ ዓይነት በመሆኑ ለማጥናት በጣም ተስማሚ ነው። ከረጅም ጊዜ በፊት ለእሱ ትንሽ ሰሌዳ ቀርጸውለት (ለተሻለ ግንኙነት ምቾት) - በ 2.8 ቮ መቆጣጠሪያ እና በአውቶቡስ ላይ የሚስቡ ተቃዋሚዎች I2C. እዚህ ነው (የኬብሉ እና የካሜራ ማገናኛ በማሸጊያው ስር ተደብቀዋል).

በመረጃ ቅርፀት መስክ ላይ ካሉ ጥቃቅን ነገሮች በተጨማሪ ካሜራዎች በማመሳሰል ፒን ብዛት ሊለያዩ ይችላሉ። አብዛኛዎቹ (በእኔ አስተያየት) አነፍናፊዎች አግድም እና ቋሚ የማመሳሰል ፒን አላቸው; ግን የፒክሰል ስትሮብ ውፅዓት ብቻ ያላቸው ካሜራዎች አሉ ፣ እና ልዩ የሚተላለፉ ኮዶችን በመጠቀም ስለ አዲስ መስመር / ፍሬም መጀመሪያ ያሳውቁዎታል (ለምሳሌ ፣ 0x00ወይም 0xFF). ያለኝ ካሜራ ውጫዊ የማመሳሰል ፒን አለው።
በብሎክ መልክ የካሜራውን ግምታዊ ንድፍ ማውጣት ይችላሉ።

በአብዛኛው፣ የCMOS ካሜራዎች የሚቆጣጠሩት በይነገጽ ነው። I2C(ምንም እንኳን መሣሪያዎች ቁጥጥር ሲደረግባቸው አይቻለሁ UART). I2Cን በመጠቀም፣ የተለያዩ መለኪያዎች ተዋቅረዋል፣ ለምሳሌ፡ ጥራት፣ የቀለም ጋሙት፣ የውጤት ውሂብ ቅርጸት፣ ወዘተ.
መደምደሚያ EXTCLK- የካሜራውን መቆንጠጥ, ከውጭ መቅረብ ያለበት. DCLK- የስትሮብ ምልክት፣ በካሜራ ዳታ አውቶቡስ ላይ ውሂቡ በሚመዘገብበት መሪ ወይም ተከታይ ጠርዝ ላይ (ለምሳሌ የማትሪክስ አንድ ፒክሴል ዳታ ባይት ወይም “ግማሽ ፒክሴል” ዳታ ባይት) ካሜራው እየሰራ ከሆነ። በ ሁነታ ውስጥ RGB565). HSYNCአዲስ መስመር መጀመሩን የሚያመለክት አግድም የማመሳሰል ምልክት ነው፣ እና ቪኤስኤንሲ- የማመሳሰል ምልክት ፣ የነቃ ደረጃው አዲስ ፍሬም መጀመሩን ያሳያል። መደምደሚያዎች D0..D7- የውሂብ አውቶቡስ; እንደ አንድ ደንብ, በእንደዚህ አይነት ካሜራዎች ውስጥ ስምንት-ቢት ነው.
አሁን ስለ ማመሳሰል ምልክቶች የበለጠ።

ግራፎቹ ካሜራው ወደ ምልክት እንቅስቃሴ መዘጋጀቱን ያሳያል DCLKበንቃት ደረጃ ላይ ብቻ HSYNC(ይህ ደረጃ እኛን የሚስብ ነው ፣ በ “መስመር ምግብ” ጊዜ ውስጥ የሰዓት ምልክት ለእኛ አስደሳች አይደለም)። ካሜራው ወደ 320x240 ጥራት ከተዋቀረ, ከዚያም በእያንዳንዱ የልብ ምት ጊዜ HSYNCየሚመጥን 320 ግፊቶችን DCLK, እና በጊዜ ውስጥ ቪኤስኤንሲ – 240 HSYNC.
በማጉላት ጊዜ በመረጃ አውቶቡሱ ላይ ምን እየተፈጠረ እንዳለ እናያለን።

በማደግ ላይ ባለው ጠርዝ (በዚህ ጉዳይ ላይ) አንድ ባይት ከውሂብ አውቶቡስ ውስጥ ይወገዳል, ይህም ወዲያውኑ ወደ ማሳያው ማሳያ ሊላክ ይችላል, ወይም ለቀጣይ ሂደት "መጨመር" ወደ ቋት.

በንድፈ ሀሳብ, ሁሉም ነገር የበለጠ ወይም ያነሰ ግልጽ ነው, አሁን ስለ በይነገጽ DCMIማይክሮ መቆጣጠሪያ STM32.

በይነገጽ DCMIከዳታ አውቶቡስ ጋር እስከ 14 ቢት ስፋት ያለው፣ ሁለቱንም የሃርድዌር እና የሶፍትዌር ማመሳሰልን እንዲሁም የውሂብ ቅርጸቶችን ይደግፋል፡ YCbCr፣ RGB እና JPEG።
ከዚህም በተጨማሪ እ.ኤ.አ. DCMIቋት ይዟል FIFO, ማቋረጦችን (የውሂብ መዝገቡን መሙላትን ጨምሮ) የማዋቀር እና ስራን የማዋቀር ችሎታ አለው ዲኤምኤ.

ይቋረጣል ከ DCMIየሚከተሉት ሁኔታዎች ሲከሰቱ ሊጠራ ይችላል-የመስመር መጨረሻ, የፍሬም መጨረሻ, የተቀባዩ ቋት ከመጠን በላይ መጨመር, የማመሳሰል ስህተትን መለየት (ከውስጣዊ ማመሳሰል ጋር).
ልዩ የካሜራ ሰዓት ውፅዓት ባለመኖሩ ግራ ተጋባሁ። ገንቢዎች ለምን እንደመጡ አላውቅም SGS ማይክሮኤሌክትሮኒክስተትቷል ፣ ግን ለእኔ ፣ ለምሳሌ ፣ ሊስተካከል የሚችል የሰዓት ምንጭ ማግኘት በጣም ምቹ ነው።
በግሌ የ 4 MHz ድግግሞሽ ያለው ስኩዌር ሞገድ ለማመንጨት በ PWM ሁነታ የበራ አጠቃላይ ዓላማ የሰዓት ቆጣሪ-ቆጣሪ ተጠቀምኩ። በእርግጥ ትልቅ FPS በእንደዚህ ዓይነት ሰዓት ማግኘት አይችሉም ፣ ግን ወዲያውኑ ቦታ አስይዛለሁ - የምጠቀመው ማሳያ አልተገናኘም FSMC, ስለዚህ በጠቅላላው ሰንሰለት ውስጥ ያለው ረጅሙ ተግባር የ LCD ውፅዓት ተግባር ነው, ስለዚህ, ከፍ ባለ ድግግሞሽ, በስክሪኑ ላይ ያለው የምስሉ ማሳያ ይስተጓጎላል. ስለዚህ, ከማውረድዎ በፊት, ሰዓት ቆጣሪውን አጠፋለሁ, እና ከእሱ በኋላ, ሰዓት ቆጣሪውን እንደገና አበራለሁ.
የሃርድዌር ሞጁል 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እና ቪኤስኤንሲወዘተ.

በስነስርአት. ቢት አንቃ- በስራው ውስጥ የበይነገጽ ማካተት ሳይናገር ይሄዳል. መስክ ኢ.ዲ.ኤም (የተራዘመ የውሂብ ሁነታ) - የውሂብ አውቶቡስ መጠን; በካሜራዬ ላይ ያለው አውቶቡስ ስምንት ቢት ነው፣ ስለዚህ ይህ መስክ ወደ "00" መቀናበር አለበት። መስክ FCRC (የፍሬም ቀረጻ ፍጥነት መቆጣጠሪያ) FPC ን በትንሹ ማስተካከል ያስችላል: 00 - ሁሉም መጪ ክፈፎች ይያዛሉ, 01 - በእያንዳንዱ ሰከንድ ፍሬም, 10 - በእያንዳንዱ አራተኛ. ቢትስ ቪኤስፒኤልእና HSPOL- የቋሚ እና አግድም የማመሳሰል መስመሮች ንቁ ደረጃዎች። ንቁ ደረጃዎች ችላ ይባላሉ እና ውሂብ በንቃት ጊዜ ውስጥ አይያዝም, ይህ ግምት ውስጥ መግባት አለበት. PCKPOL- የፒክሰል ስትሮብ ንቁ ደረጃ ትንሽ - ከአውቶቡሱ ላይ መረጃ ለማንበብ በየትኛው የምልክት ጠርዝ ላይ: መምራት ወይም መከተል። ኢኤስ.ኤስየማመሳሰል ዘዴን ለመምረጥ ቢት: ውጫዊ ወይም ውስጣዊ. JPEG- የገቢ ውሂብ ቅርጸት ምርጫ - የታመቀ ወይም ያልተጨመቀ። ሰብል- የፍሬም ቁራጭ ቀረጻ ምርጫ ቢት ( የሰብል መስኮት). ይህ ቢት ወደ አንድ ከተዋቀረ በይነገጹ በመመዝገቢያዎቹ ውስጥ ባሉት ዋጋዎች በሚወሰን መስኮት ውስጥ ውሂብን ይይዛል DCMI_CWSTRTእና DCMI_CWSIZE.

እንግዲያው፣ እናዋቅረው።
መደበኛውን የፔሪፈራል ቤተ መፃህፍት ከ ST መጠቀም ስለለመድኩኝ (ምንም እንኳን በመጀመሪያዎቹ ድግግሞሾች ከአዳዲስ ተጓዳኝ አካላት ጋር በ "መመዝገቢያዎች" ውስጥ እስክገባ ድረስ በጭራሽ አልጠቀምበትም) ፣ ቤተ-መጽሐፍቱን በመጠቀም ማዋቀሩን እሰጣለሁ።

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 = DCMI_ExtendedDataMode_8b; DCMI_CamType.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; DCMI_Init(&DCMI_CamType); DCMI_CaptureCmd(ENABLE); DCMI_Cmd(ENABLE መመለስ);)
በእውነቱ፣ ለፍላጎቴ በመዝገቡ ውስጥ አንድም ትንሽ መንካት አልተቻለም DCMI_CR- በነባሪነት እንደገና ተጀምረዋል - ከቢት በስተቀር ቀረጻእና አንቃ.
በይነገጹ ተዋቅሮ ለመሄድ ዝግጁ ነው። ለካሜራው የሰዓት ምልክት ከሰጠ በኋላ በይነገጹ እኛ ለማስኬድ የሚያስፈልገንን መረጃ መቀበል ይጀምራል።
ለጀማሪዎች እራሴን በጣም ቀላል የሆነውን ስራ አዘጋጅቻለሁ - ምስሉን በምስሉ ላይ ለማሳየት, የውሂብ ሂደት አነስተኛ ይሆናል.
የሁኔታ ምዝገባው ከተቀባዩ ቋት የተገኘውን መረጃ በወቅቱ ለማንበብ ይረዳናል። DCMI_SR.

በጣም ትንሽ የቢቶች ቁጥር ለንባብ ይገኛል - ሶስት ብቻ። ቢትስ HSYNCእና ቪኤስኤንሲተዛማጅ መስመሮችን ሁኔታ ምልክት ያድርጉ: ንቁ ደረጃ ወይም የመስመር ምግብ; በጣም የሚያስደስት ትንሽ ነው FNE. ቋቱን በመረጃ እንድንሞላ ይነግረናል። ወይም አይሞላም።
የትንሽ ሁኔታን በቋሚ ዑደት በመፈተሽ ላይ FNEDCMI_SR, በተቀበለው ሠላሳ-ሁለት-ቢት ቋት ውስጥ ስለ የውሂብ መምጣት እንማራለን. እንደኔ ከሆነ ውሂቡ እንደሚከተለው ይቀመጣል፡-

ድብደባውን ሲያቀናብሩ FNEበሁኔታ መዝገብ ውስጥ DCMI_SRየመቀበያው ቋት አራት ባይት ይይዛል፣ የሁለት አጎራባች ፒክስሎች ውሂብ፡- ባይት0 እና ባይት1 - 16 ፒክስል ቢት n, ኤ ባይት2 እና ባይት3 - 16 ፒክስል ቢት n+1. ለእኔ የሚቀረው እነሱን በማጣመር እና በማሳያው ላይ እንዲታይ መላክ ብቻ ነው። ስለዚህ ዋናው ሉፕ ምን እንደሚመስል እነሆ:
ሳለ (1) ((DCMI_GetFlagStatus(DCMI_FLAG_FNE)) == ዳግም አስጀምር)፤ //ማቋቋሚያውን TIM_Cmd በመጠበቅ ላይ (TIM3፣ DISABLE)፤ //CAM የሰዓት ካሜራ ካሜራን አሰናክል = (DCMI->DR)፤ //የማንበብ ቋት SendDataByte_LCD (ካም_ግራብ)፤ cam_grab = (DCMI->DR)>>16፤ // የቋት 2ኛ ክፍል SendDataByte_LCD (ካም_ግራብ) ማንበብ፤ TIM_Cmd(ቲም3፣ አንቃ)፤ // CAM ሰዓትን እንደገና አንቃ)
ያም ማለት ድብደባው እስኪዘጋጅ ድረስ እየጠበቅኩ ነው FNEበሁኔታ መዝገብ ውስጥ DCMI_SR, እና ከዚያ በኋላ, በሁለት ማለፊያዎች ውስጥ, 16 ቢት ውሂብ ወደ ማሳያው እሰቅላለሁ.
በዚህ ነጥብ ላይ, ወደ ምክንያታዊ መደምደሚያ መድረስ እፈልጋለሁ, ግን እዚያ ነበር.
ኤምኬን ካበራሁ እና እንደገና ካስጀመርኩት በኋላ በስክሪኑ ላይ አየሁ ... አይ ፣ ለእኔ በጣም የማውቀው ፣ ግን በጥቁር እና በሰማያዊ ጥላዎች ውስጥ የራሴን ፊዚክስ አየሁ። ቀይ እና አረንጓዴ ቀለሞች ሙሉ በሙሉ አልነበሩም.
ከአራሚው ጋር የተወሰነ ከደረደሩ በኋላ የሚከተለው ተገኝቷል፡ የበይነገጽ ውሂብ መመዝገቢያ ለአንድ ፒክሰል 16 ቢት ውሂብ ብቻ ይዟል፣ የታችኛው 8 ቢት ደግሞ በቦታው ይገኛል። ባይት0 (ከላይ ያለውን ምስል ይመልከቱ) እና ሽማግሌዎቹ በቦታው ይገኛሉ ባይት2 . ክፍተቶች ባይት1 እና ባይት3 ባዶ ነበሩ። እስካሁን ድረስ በሰነዶቹ እና በእውነታው መካከል ያለው ልዩነት ከየት እንደመጣ አልገባኝም, እና ምናልባት, STM አገኛለሁ.
በዚህ ምክንያት በይነገጹን በመጠቀም ከካሜራ ምስል ማግኘት ችለናል። DCMIምንም እንኳን አንዳንድ ችግሮች ባይኖሩም. በሥዕሉ ላይ የማሳያ ሰሌዳው ምስል የታየበትን ማሳያ ፎቶ እሰጣለሁ STM32F3ግኝት።ከካሜራዬ.

ከም ውጽኢቱ ድማ ስለምንታይ ይኸውን። EXTCLK, PIXCK, HSYNCእና ቪኤስኤንሲ, አመክንዮአዊ ትንታኔን ካገናኙ.

ሁሉም ነገር በትክክል እንደተጠበቀው ይመስላል: 240 ጥራጥሬዎች HSYNCበአንድ ጊዜ ውስጥ ተስማሚ ቪኤስኤንሲ, 320 PIXCK- በአንድ HSYNC. በንቃት ደረጃ HSYNCካሜራው ምልክቶችን አያወጣም PIXCK- ልክ እንደተዋቀረ።
ባጠቃላይ አነጋገር፣ በበይነገጹ በተወሰነ መልኩ ቅር ተሰኝቼ ነበር። “የተለመደ” የካሜራ መቆንጠጫ እግር አለመኖር፣ ብዙ ወይም ያነሰ ሳቢ አብሮገነብ ቺፖች አለመኖር (ስለ ሃርድዌር JPEG ኢንኮደርስ?) እና ሌላው ቀርቶ ከበሮ ጋር በግማሽ አካባቢ መደነስ። FIFO
በማቋረጥ ላይ ከካሜራ ጋር ስራን ማደራጀት PIXCK, HSYNCእና ቪኤስኤንሲሃርድዌሩን ተጠቅሜ ከካሜራ ጋር በመስራት እንደ እኔ ብዙ ራስ ምታት አላጋጠመኝም። DCMI.
ቢሆንም፣ በቅርብ ጊዜ ውስጥ ፍሬም ለመያዝ እሞክራለሁ፣ ወደ ውስጥ እጨምቀው JPEG, እና ምስል ወደ ኤስዲ ካርድ ለመጻፍ ይሞክሩ.
ፒ.ኤስ. እንደዚያ ከሆነ ለፕሮጀክቱ አገናኝ እሰጣለሁ " ኮድ :: ማገድ"- በድንገት ወደ አንድ ሰው ይምጡ.

ወይም የዝግታ እንቅስቃሴ ፊልም መቅረጽ ከመደበኛው የተኩስ ድግግሞሽ ባነሰ ድግግሞሽ እና ትንበያ በ24 ክፈፎች በሰከንድ ነው።

ስለ STM32 ማይክሮ መቆጣጠሪያ መማር ከጀመርኩ እና "ሄሎወርልድ" በሚያብረቀርቅ LED ከፃፍኩ በኋላ STM32 እንዴት እንደሚሰራ በተሻለ ለመረዳት የበለጠ ማይክሮ መቆጣጠሪያ መሳሪያዎችን በመጠቀም የበለጠ ውስብስብ የሆነ ነገር መተግበር እንዳለብኝ ተገነዘብኩ። ጊዜ ያለፈበት ካሜራ የመፍጠር ሀሳብ የተፈጠረው በዚህ መንገድ ነው።

እኔ የነደፍኩት ካሜራ በየ 5 ሰከንድ አንድ ጊዜ ፎቶዎችን ያነሳል እና በ jpeg ቅርጸት ወደ ኤስዲ ካርድ ያስቀምጣቸዋል። በመቀጠል, በኮምፒተር ላይ ወደ ቪዲዮ ፋይል ማዋሃድ ያስፈልጋቸዋል.

ካሜራውን ለመፍጠር የሚከተሉትን አካላት ተጠቀምኩኝ፡-

ካርዱ ሁለት ተግባራትን በመጠቀም ተያይዟል.
1. ከተግባር ጋር ዲስክ_ጀምርካርታው በመጀመር ላይ ነው።
2. በመቀጠል, መጫን ያስፈልግዎታል f_mount.

እነዚህን እርምጃዎች በተሳካ ሁኔታ ካጠናቀቁ በኋላ በካርዱ የተለያዩ ስራዎችን ማከናወን ይችላሉ, ለምሳሌ:
1. f_ክፈት።- ፋይል መክፈት
2. f_መዝጋት- ፋይሉን መዝጋት;
3. f_mkdir- ማውጫ መፍጠር;
4. f_chdir- ማውጫ ምርጫ;
5. ረ_መፃፍ- በፋይል ላይ መጻፍ;
6. ረ_አንብብ- ከፋይሉ ማንበብ.

ከካሜራ እና ከኤስዲ ካርዱ ጋር ያለውን ስራ ገለጽኩኝ፣ አሁን የፕሮግራሙን አጠቃላይ አሰራር እንመልከት፡-
1. የ SD ካርዱን ያስጀምሩ;
2. የካሜራ ሞጁሉን ያስጀምሩ;
3. የፋይሉን ጊዜ ይክፈቱ txt (ፋይሉ የቅርጸቱን አንድ መስመር መያዝ አለበት 01.01.2014_12:00 የ RTC ሰዓት ቆጣሪን ለመቁጠር ጊዜን የሚያከማች;
4. ከፋይሉ ላይ ሰዓቱን እና ቀኑን እናነባለን እና RTC ን አዘጋጅተናል;
5. time.txt ፋይልን ዝጋ;
6. ፎቶዎችን ለማከማቸት ማውጫ ይፍጠሩ "LinkSpritePhoto";
7. በቦርዱ ላይ የ PA0 ቁልፍን ሲጫኑ, ፎቶግራፍ አንስተን በካርዱ ላይ እናስቀምጠዋለን (ፎቶው በሚወሰድበት ጊዜ, ሰማያዊው LED በርቷል);
8. የማንኛቸውም ተግባራት ውድቀት በሚከሰትበት ጊዜ, ማለቂያ ወደሌለው ዑደት ውስጥ እንወድቃለን እና አረንጓዴውን LED ብልጭ ድርግም እናደርጋለን.

ካሜራውን በተከታታይ ሁነታ ለመጀመር የሚከተሉትን መስመሮች በ main.c ላይ አስተያየት ይስጡ።

//EnabledButtonStart = 101; // በ loop ውስጥ ለማሄድ ይህንን መስመር አስተያየት አይስጡ // መዘግየት(300); // በ loop ውስጥ ለማሄድ መዘግየት
እና በዚህ መስመር ላይ አስተያየት ይስጡ-

EnabledButtonStart = 0; // በ loop ውስጥ ለማሄድ ይህንን መስመር አስተያየት ይስጡ
ከዚያ ሲበራ ካሜራው ያለማቋረጥ ፎቶዎችን መቅዳት ይጀምራል።

በአጠቃላይ ይህ ካሜራ እንዴት እንደሚሰራ ገለጻ አድርጌያለሁ, አሁን የስራውን ውጤት ማሳየት ይችላሉ.