اطلاعیه

Collapse
No announcement yet.

راه اندازی LCD با تکنیک DMA GPIO

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    راه اندازی LCD با تکنیک DMA GPIO

    سلام
    راه اندازی LCD کار زیاد سخت نیست اما اگر بخواهیم فیلم پخش کنیم باید بتوانیدم با سرعت بالایی اطلاعت را از یک بخش به یک بخش دیگر با سرعت کپی کنیم.
    برای این کار باید از پروتکل DMA استفاده کرد.
    اگر در اینترنت کمی جستو و جو کنید می توانید مثال هایی که می تواند پروتکل های میکرو را با DMA راه اندازی کرد را دید اما من هر چی گشتم نتونستم ارتباط "DMA روی GPIO " را پیدا کنم.
    لطفا اگر کسی می داند کمک کند. ممنون :rolleyes:
    دکتر چمران در 1311 در تهران متولد شد
    وي در زمان اقامت در آمريکا انجمن اسلامي آمريکا را تأسيس کرد که منجر به قطع بورسيه وي توسط شاه شد.
    او با اينکه يکي از دانشمندان مطرح آمريکا به حساب مي آمد بدون توجه به مدرک به مصر رفت و آموزش نظامي ديد.

    #2
    پاسخ : راه اندازی LCD با تکنیک DMA GPIO

    چند حالت وجود داره:

    1- شما چیزی پیدا کردید که خود شرکت ARM و شرکت های زیر مجموعه سازنده میکروکنترلرهاش ازش خبر ندارند. :mrgreen:
    2- شما علمتون زده بالا و مجموعه های علمی دیگه توان پاسخ به سوالات شما رو ندارن. :mrgreen:

    مهندس شوخی کردم. به دل نگیر.
    در مورد این چیزی که می خواین باید بگم که ممکن نیست. یه مقدار در مورد DMA جستجو کنید متوجه میشید.
    نمایشگر شما پروتکول خاصی رو پشتیبانی میکنه؟ یه لینکی یا چیزی از نمایشگر بذار تا بررسیش کنم برات.

    دیدگاه


      #3
      پاسخ : راه اندازی LCD با تکنیک DMA GPIO

      نوشته اصلی توسط Rohalamin
      چند حالت وجود داره:

      1- شما چیزی پیدا کردید که خود شرکت ARM و شرکت های زیر مجموعه سازنده میکروکنترلرهاش ازش خبر ندارند. :mrgreen:
      2- شما علمتون زده بالا و مجموعه های علمی دیگه توان پاسخ به سوالات شما رو ندارن. :mrgreen:

      مهندس شوخی کردم. به دل نگیر.
      در مورد این چیزی که می خواین باید بگم که ممکن نیست. یه مقدار در مورد DMA جستجو کنید متوجه میشید.
      نمایشگر شما پروتکول خاصی رو پشتیبانی میکنه؟ یه لینکی یا چیزی از نمایشگر بذار تا بررسیش کنم برات.
      ممنون از جوابتون البته منظورتون را دقیق متوجه نمی شم ( 1- شما چیزی پیدا کردید که خود شرکت ARM و شرکت های زیر مجموعه سازنده میکروکنترلرهاش ازش خبر ندارند.) !!!!
      البته شما به بنده خیلی چیزها یاد دادید ولی این بند از جملتون را متوجه نشدم :biggrin:
      جدا از این حرفها (بی خیال)

      من این صحبتی که کردم از خودم در نیاوردم من چیزهایی در این رابطه شنید بودم که گفتم.
      الآن نگاه کنید
      http://forum.techno-electro.com/topic-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%B5%D9%86%D8%B9%D8%AA%DB%8C-%D8%A8%D8%A7-lcd-%D8%B1%D9%86%DA%AF%DB%8C

      البته حالا کاری ندارم که این آی سی یک پروتکل مجزا دارد برای همین هم برایم سوال شده بود که آیا می شود مثلا من یک رم به آرم وصل کنم و بعد یک ال سی دی هم به آن وصل کنم و بعد بتونم یک فریم یک فریم روی ال سی دی نمایش بدهم.
      این مهم نیست که اصلا فرمت پخش در ال سی دی چیه شما فکر کنید من از یک رم به رم بخواهم کپی کنم اما این رم ها با پورت وصل شدن یعنی رم خارجی هستن.
      دکتر چمران در 1311 در تهران متولد شد
      وي در زمان اقامت در آمريکا انجمن اسلامي آمريکا را تأسيس کرد که منجر به قطع بورسيه وي توسط شاه شد.
      او با اينکه يکي از دانشمندان مطرح آمريکا به حساب مي آمد بدون توجه به مدرک به مصر رفت و آموزش نظامي ديد.

      دیدگاه


        #4
        پاسخ : راه اندازی LCD با تکنیک DMA GPIO

        یه چیز دیگه هم تازه پیدا کردم البته خودم هنوز نخودمش گفتم شاید مفید باشه اگر چیزی دستگیرتون شد به من هم بگید :biggrin:

        https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2 fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_ mx_stm32%2fData%20transfer%20from%20GPIO%20port%20 to%20RAM%20buffer%20using%20DMA%20upon%20receiving %20a%20trigger%20signal%20on%20the%20timer%20captu re%20input%20channel&FolderCTID=0x012002007709 78C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F 0FFD06506F5B&currentviews=2441


        این قسمت را ببینید:

        کد:
        /* Set the parameters to be configured */
         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&GPIOC->IDR; /* Read fron GPIO input data register */
         DMA_InitStructure.DMA_Memory0BaseAddr  = (uint32_t)&GPIO_DATA[0]; /* Send the data to the RAM buffer */
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
          DMA_InitStructure.DMA_BufferSize = BufferSize;
          DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
          DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
          DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
          DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
          DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
         
          DMA_InitStructure.DMA_Priority = DMA_Priority_High;
          DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
          DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
          DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
          DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
          DMA_Init(DMA2_Stream6, &DMA_InitStructure);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&GPIOC->IDR; /* Read fron GPIO input data register */ :applause:

        حالا نمی دونم روی میکروهای دیگه هم قابل اجرا هست یا نه :smile:
        دکتر چمران در 1311 در تهران متولد شد
        وي در زمان اقامت در آمريکا انجمن اسلامي آمريکا را تأسيس کرد که منجر به قطع بورسيه وي توسط شاه شد.
        او با اينکه يکي از دانشمندان مطرح آمريکا به حساب مي آمد بدون توجه به مدرک به مصر رفت و آموزش نظامي ديد.

        دیدگاه


          #5
          پاسخ : راه اندازی LCD با تکنیک DMA GPIO

          اگر موفق به این کار بشم دیگه زیاد پروتکل ارتباطی LCD مهم نیست!!!

          که اگر این کار عملی بشود شما می تواید یک حافظه به یک GPIO متصل کنید و یک ال سی دی هم به یک GPIO دیگر و با کمی خلاقیت ( برای آدرس دهی) می توان حداقل یک فریم یک فریم روی ال سی دی به صورت DMA داده ها را انتقال داد.
          که بعد از هر انتقال باید ال سی دی و حافظه را برای فریم بعدی مثلا با خود CPU آرم مقدار دهی کرد و این روند را ادامه داد.
          دکتر چمران در 1311 در تهران متولد شد
          وي در زمان اقامت در آمريکا انجمن اسلامي آمريکا را تأسيس کرد که منجر به قطع بورسيه وي توسط شاه شد.
          او با اينکه يکي از دانشمندان مطرح آمريکا به حساب مي آمد بدون توجه به مدرک به مصر رفت و آموزش نظامي ديد.

          دیدگاه


            #6
            پاسخ : راه اندازی LCD با تکنیک DMA GPIO

            تا حالا همچین کاریو نکردم چون انتظارشم نداشتم واقعا. نمی دونم چی بگم. شما تست بکن ببین واقعا کار میکنه یا نه.
            من GPIO رو به عنوان یه پریفرال قبول نداشتم(با توجه به اسکماتیک(شماتیک) DMA توی رفرنس مانوال).

            دیدگاه


              #7
              پاسخ : راه اندازی LCD با تکنیک DMA GPIO

              سلام
              در مورد 1788 میگم که خودم باهاش زیاد کار کردم :
              1 - DMA مقدار اطلاعات محدودی رو میتونه انتقال بده مثلا توی 1788 هشت کانال DMA وجود داره که هر کدوم حداکثر میتونه 4x2KB رو انتقال بده. در صورتی که مثلا اگه LCD رو در حالت 16 بیت درایو کرد واسه ی یه LCD هفت اینچ 800X480 به 800x480x2 بایت اطلاعات نیازه که میشه : 768000 بایت با این حساب تقریبا باید 187 بار انتقال DMA انجام بشه که چون اشغالی باس بالا میره نمیشه کل این 187 بار رو پشت هم انجام داد. یعنی باید صبر کرد تا عملیات کپی هر بار انجام بشه و بعد سکتور بعدی رو کپی کرد. طبق تجربه ی من سرعت اینجور کپی کردن فقط یکم از سرعت کپی کردن عادی کمتره! پس بی فایدست!
              2 - استفاده از DMA برای انتقال RAM خارجی به RAM خارجی معمول نیست. DMA زمانی فعال میشه که در حین اجرای کدمون به صورت موازی بخوایم حجمی از اطلاعات رو از حافظه/پریفرال به حافظه/پریفرال منتقل کرد. البته اگه با باس کاری نداشته باشیم! LCD برای ریفرش تصویر بر اساس کانفیگ اولیش مشغولیت باس دیتای خارجی رو خیلی بالا میبره.
              3 - مشکل اصلی اینه که زمانی که بخوایم اطلاعات پیکسل هارو توی بافر LCD بریزیم ، چون این بافر توی RAM خارجیه برای جلوگیری از تصادم باس سرعت کپی کردن اطلاعات میاد پایین. چون همیشه LCD برای ریفرش تصویر داره از بافر میخونه. به همین خاطره که اگه بخوایم یه تصویر رو توی LCD نمایش بدیم تصویر از بالا به پایین ریخته میشه و این کفیفیت کارو میاره پایین.
              4 - راه حل برای بالا بردن سرعت نمایش توی LCD تغییر بیس شروع اطلاعات LCD روی RAM خارجیه. مثلا اگه بخوایم یه فیلم رو روی LCD نمایش بدیم باید فریم هارو به ترتیب توی RAM قرار بدیم. حالا فقط کافیه آدرس بیس بافر LCD رو به ترتیب اول هر فریم قرار بدیم. اینجوری با سرعت خیلی بالا میشه فیلم پخش کرد روی LCD.

              من قبلا تجربه ی این کارو داشتم...

              دیدگاه


                #8
                پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                DMA با GPIO نمیتونه LCD رو راه بندازه چون پین های کنترلی هم باید هماهنگ باشن.
                اما اگه باس خارجی باشه میشه.


                در ضمن برای این کار به رم زیادی هم نیازه.


                مثلا STM32F103ZET6 میتونه مناسب باشه.

                دیدگاه


                  #9
                  پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                  مثلا اگه LCD رو در حالت 16 بیت درایو کرد واسه ی یه LCD هفت اینچ 800X480 به 800x480x2 بایت اطلاعات نیازه که میشه : 768000 بایت
                  این مقدار از رم داخلی بیشتره پس اساسا امکان دادن آدرس داخلی را ندارید.

                  درباره همین 1788 هم اگر اشتباه نکنم پریفرال ال سی دی خودش یک DMA داره .

                  اینجوری با سرعت خیلی بالا میشه فیلم پخش کرد روی LCD.

                  من قبلا تجربه ی این کارو داشتم...
                  فلیکر نداشتید ؟
                  فرکانس رم را 120 مگ گذاشته بودید؟
                  از جمله ی رفتگان این راه دراز
                  باز آمده ای کو که به ما گوید راز
                  هان بر سر این دو راهه از روی نیاز
                  چیزی نگذاری که نمی آیی باز

                  دیدگاه


                    #10
                    پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                    نوشته اصلی توسط HR_MEHRABIAN
                    4 - راه حل برای بالا بردن سرعت نمایش توی LCD تغییر بیس شروع اطلاعات LCD روی RAM خارجیه. مثلا اگه بخوایم یه فیلم رو روی LCD نمایش بدیم باید فریم هارو به ترتیب توی RAM قرار بدیم. حالا فقط کافیه آدرس بیس بافر LCD رو به ترتیب اول هر فریم قرار بدیم. اینجوری با سرعت خیلی بالا میشه فیلم پخش کرد روی LCD.
                    من قبلا تجربه ی این کارو داشتم...
                    منظورتون را خب متوجه نشدم!
                    یعنی شما یک رم را به ورودی دیتای LCD وصل کردید و فقط با میکرو این دو را باهم هماهنگ می کنید؟
                    اگر این کار را انجام داده باشید باید مد LCD و RAM یکی باشه یعنی جفتشون 8 بیت یا 16 بیت باشن درسته؟
                    این کار باعث می شه میکرو فقط RAM و LCD را کانفیگ کند.
                    خب حالا شما باید به اندازه ی طول یک فیلم (حجم) رم داشته باشید و پین های دیتا از پین آدرس در رم باید مجزا باشد درسته؟
                    دکتر چمران در 1311 در تهران متولد شد
                    وي در زمان اقامت در آمريکا انجمن اسلامي آمريکا را تأسيس کرد که منجر به قطع بورسيه وي توسط شاه شد.
                    او با اينکه يکي از دانشمندان مطرح آمريکا به حساب مي آمد بدون توجه به مدرک به مصر رفت و آموزش نظامي ديد.

                    دیدگاه


                      #11
                      پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                      نوشته اصلی توسط meerkat
                      این مقدار از رم داخلی بیشتره پس اساسا امکان دادن آدرس داخلی را ندارید.
                      آدرسش که نیازی به رم داخلی نداره!؟
                      اگر می گن 768000 بایت نیاز هست برای آدرس ، اینقدر بایت که نیاز نیست ، این مقدار حجم است نه آدرس
                      دکتر چمران در 1311 در تهران متولد شد
                      وي در زمان اقامت در آمريکا انجمن اسلامي آمريکا را تأسيس کرد که منجر به قطع بورسيه وي توسط شاه شد.
                      او با اينکه يکي از دانشمندان مطرح آمريکا به حساب مي آمد بدون توجه به مدرک به مصر رفت و آموزش نظامي ديد.

                      دیدگاه


                        #12
                        پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                        نوشته اصلی توسط plasma
                        DMA با GPIO نمیتونه LCD رو راه بندازه چون پین های کنترلی هم باید هماهنگ باشن.
                        اما اگه باس خارجی باشه میشه.


                        در ضمن برای این کار به رم زیادی هم نیازه.


                        مثلا STM32F103ZET6 میتونه مناسب باشه.
                        ببینید اشتباه نشه
                        من نمی خوام LCD راه به صورت پایه ای راه بندازم ، یعنی بهتر بگم LCD من درایور دارد و میکرو فقط کار پر کردن درایور LCD را انجام می دهد.
                        در نتیجه مثلا می خوام یک فیلم با 15 فریم در سایز 240*320 پخش کنم با فرمت 565 که می شود 16 بیت
                        پس می شود
                        240*320*15=1152000 اینقدر word در ثانیه
                        که نیازی نیست همش باهم انتقال پیدا کنه چون LCD ما درایور دارد و فقط ما باید جای این اطلاعات را عوض کنیم.

                        و اینکه پین های کنترلی هم باید تنظیم بشن حرف درستی هست ولی اگر بخواهیم فقط یک فریم را نمایش بدیم پین های کنترلی خاصی نمی مونه به جز یک کلاک که اون کار زیاد مشکلی نیست. و برای فریم بعدی هم از خود CPU کمک می گیریم.
                        دکتر چمران در 1311 در تهران متولد شد
                        وي در زمان اقامت در آمريکا انجمن اسلامي آمريکا را تأسيس کرد که منجر به قطع بورسيه وي توسط شاه شد.
                        او با اينکه يکي از دانشمندان مطرح آمريکا به حساب مي آمد بدون توجه به مدرک به مصر رفت و آموزش نظامي ديد.

                        دیدگاه


                          #13
                          پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                          St.com
                          یه مثال داره با عنوان
                          Lcd direct drive
                          در مورد راه اندازی ال سی دی با استفاده از dma هست و البته fsmc
                          خودش گفته فقط 2٪ وقت کنترلر بابت این کار صرف میشه
                          یه نگاهی بهش بنداز،بد نیست
                          هميشه به ياد خدا باش !

                          دیدگاه


                            #14
                            پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                            فقط به عنوان یع اظهارنظر می خواستم بگم که؛
                            واسه میکروهای با سرعت نهایتا 80MHz نمایشگرهای تا سایز 3اینچ مناسب هستن.
                            واسه میکروهای تا سرعت نهایتا 180MHz نمایشگرهای تا سایز 5اینچ مناسب هستن.
                            دیگه نمایشگرهای بزرگتر از 5 رو بهتره با مثلا Raspberry Pi یا Beaglebone انجام داد. واقعا اگه حساب و کتاب کنیم با Raspberry قیمت پروزه معقول در میاد(هر چند من خودم Beaglebone رو ترجیح میدم).

                            معمولا کارهایی که انجام شده و از این چیزی که گفتم بالاتر بوده، توش واقعا پردازنده جون کنده انگار.

                            دیدگاه


                              #15
                              پاسخ : راه اندازی LCD با تکنیک DMA GPIO

                              فلیکر نداشتید ؟
                              فرکانس رم را 120 مگ گذاشته بودید؟
                              آره فرکانس رم 120م بود. مثلا ساعت پایین رو 10 بار تو ثانیه رندر کردم (هر بار کل بافر جایگزین میشد) بدون هیچ فلیکری.

                              من یه کتابخونه ی کامل واسه ی کار با LCD نوشتم ک کلی تابع گرافیکی داره. اما مزیتش اینه که دوتا بافر برای تصویر توی حافظه در نظر گرفته شده و یه تابع ب نام SwapBuffers وجود داره ک با کمک DMA اطلاعات بافر انتظار رو به بافر تصویر منتقل میکنه و بافر انتظار رو ریفرش میکنه. این روشیه که توی کارت گرافیک PC هم استفاده میشه.
                              کد:
                              void SwapBuffer(){
                              	GPDMA_Channel_CFG_Type *DMI_SDRAM = (GPDMA_Channel_CFG_Type*)malloc(sizeof(GPDMA_Channel_CFG_Type));
                              	uint32_t i=0,j=0;
                              	LPC_LCD->UPBASE = (VIDEOWAITBUFFER_BASE_ADDR) & ~7UL ;
                              	DMI_SDRAM->TransferType = GPDMA_TRANSFERTYPE_M2M;
                              	DMI_SDRAM->TransferSize = 4000;
                              	DMI_SDRAM->TransferWidth = 2;		
                              	for(j=0;j<6;j++){
                              		for(i=0;i<8;i++){
                              			DMI_SDRAM->ChannelNum = i;
                              			DMI_SDRAM->SrcMemAddr = VIDEOWAITBUFFER_BASE_ADDR+4000*i*4+16000*8*j;
                              			DMI_SDRAM->DstMemAddr = VIDEOBUFFER_BASE_ADDR+4000*i*4+16000*8*j;
                              			GPDMA_Setup(DMI_SDRAM);
                              			GPDMA_ChannelCmd(i,ENABLE);
                              		}
                              		for(i=0;i<65000;i++);
                              	}
                              	LPC_LCD->UPBASE = (VIDEOBUFFER_BASE_ADDR) & ~7UL ;
                              	free(DMI_SDRAM);
                              }
                              منظورتون را خب متوجه نشدم!
                              یعنی شما یک رم را به ورودی دیتای LCD وصل کردید و فقط با میکرو این دو را باهم هماهنگ می کنید؟
                              اگر این کار را انجام داده باشید باید مد LCD و RAM یکی باشه یعنی جفتشون 8 بیت یا 16 بیت باشن درسته؟
                              این کار باعث می شه میکرو فقط RAM و LCD را کانفیگ کند.
                              خب حالا شما باید به اندازه ی طول یک فیلم (حجم) رم داشته باشید و پین های دیتا از پین آدرس در رم باید مجزا باشد درسته؟
                              خوب بافر LCD توی رم 1788 جا نمیشه. یعنی حتی یه فریم هم توی رم میکرو جا نمیشه. مجبوریم از RAM خارجی استفاده کنیم. من از K4S561632 استفاده کردم ک باس دیتاش 16 بیته و از نوع داینامیکه و خود واحد EMC میکرو مدیریتش میکنه.

                              دیدگاه

                              لطفا صبر کنید...
                              X