اطلاعیه

Collapse
No announcement yet.

راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

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

    راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

    سلام دوستان من یه برد اموزشی میکرو stm32f103zet6 از همینجا خریدم.کار با پین ها و دسترسی به رجیسترهارو بدون استفاده از کتابخونه یاد گرفتم.در واقع واسه GPIO خورم یه کتابخونه نوشتم.اما حالا میخوام این ال سیدی رو راه بندازم.همه چیزشو بلدم دیتا شیتشم خوندم اما مشکل اینجاست که 16 تا پایه دیتای ال سی دی به پین های مختلف میکرو وصله و ترتیبش از قرار زیره که من برا هر پایه یه اسم تعریف کردم:
    کد:
    #define DB1 GPIOD_ODR_bit.ODR14
    #define DB2 GPIOD_ODR_bit.ODR15
    #define DB3 GPIOD_ODR_bit.ODR0
    #define DB4 GPIOD_ODR_bit.ODR1
    #define DB5 GPIOE_ODR_bit.ODR7
    #define DB6 GPIOE_ODR_bit.ODR8
    #define DB7 GPIOE_ODR_bit.ODR9
    #define DB8 GPIOE_ODR_bit.ODR10
    #define DB10 GPIOE_ODR_bit.ODR11
    #define DB11 GPIOE_ODR_bit.ODR12
    #define DB12 GPIOE_ODR_bit.ODR13
    #define DB13 GPIOE_ODR_bit.ODR14
    #define DB14 GPIOE_ODR_bit.ODR15
    #define DB15 GPIOD_ODR_bit.ODR8
    #define DB16 GPIOD_ODR_bit.ODR9
    #define DB17 GPIOD_ODR_bit.ODR10
    حالا مشکل اینه که اگه بخوام تابع واسه مقدار دهی به این پایه ها بنویسم باید هر بار همه این 16 تا رو دستی صفرو یک کرد که طبیعتا کار غیر عاقلانه و طاقت فرساییه!! :icon_razz:
    اما سوال اینجاست که چطور میشه همه این پین ها رو به عنوان یک متغیر یا یه چیزی شبیه پورت مجازی در نظر گرفت که مثلا با یکبار مقدار دادن مثلا یه عدد هگز مثل 0xffff همه پایه ها مثلا یک بشه یا یک همچین چیزی!
    من که هرکار کردم موفق نشدم.دوستان شما راهی به ذهنتون میرسه؟؟ :angry:
    در ضمن جواب این سوال بیشتر مربوط به زبان سی هست و خیلی فرق نداره تو IAR باشه یا keil :nice:
    خطاب به داعش:
    ای وای اگر پا به حرم بگذاری/یک تکه ز دیوار حرم برداری/شیعه به بین الحرمین حساس است/گفتم که به گوش سگیت بسپاری
    ما از سبوی شاه دین مجنون و مستیم/برگرد تا سربند یا زهرا(س) نبستیم

    #2
    پاسخ : راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

    سلام
    خوب همین مقداری که فرمودید 0xffff را بریزید داخل رجیستر دیگه
    مثلا :
    USART1->BRR = 0x0271; /* 115200 baud @ PCLK2 72MHz */
    فيلم آموزشي ميکروکنترلر LPC1768
    فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
    فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
    فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

    دیدگاه


      #3
      پاسخ : راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

      داداش گلم سوال من رو درست متوجه نشدی.من گفتم 16 تا پین که از میکرو به ال سی دی وصله هر کدوم مال یه پورته.مثلا سه تاش از پورتD چندتاش از E و دوتا هم G.مشکل اینه که نمیشه همشو یکجا عدد داد که.میخوام 16 تا پین رو کاری کنم که وفتی یکبار متغیرم رو مقدار دادم همه این 16 تا پین مقدار دهی بشن
      خطاب به داعش:
      ای وای اگر پا به حرم بگذاری/یک تکه ز دیوار حرم برداری/شیعه به بین الحرمین حساس است/گفتم که به گوش سگیت بسپاری
      ما از سبوی شاه دین مجنون و مستیم/برگرد تا سربند یا زهرا(س) نبستیم

      دیدگاه


        #4
        پاسخ : راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

        دوست عزیز من شماتیک برد رو نمیدونم ولی احتمالا بهFSMC وصل شده باشن اگه پاسخ درسته برید دنبال راه اندازی FSMC
        راه اندازی enc28j60 و enc424j600 برای RL-TCPnet

        راه اندازیks0108 با emwin

        راه اندازی lcd7 اینچ با داریور داخلی stm32f429

        دیدگاه


          #5
          پاسخ : راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

          بله دوست عزیز درست میفرمایید.
          من چند وقتیه دارم رو FSMC کار میکنم و تو یه تاپیک راجع بهش حرف زدیم.الان دیگه تئوریش کامل شد و دارم رو قسمت عملی و برنامه نویسی کار میکنم.یک اتفاق بسیار عجیبی افتاده!!! oo:
          من این برنامه زیر رو برای خوندن یکی از رجیسترهای ال سی دی ili9325 با ادرس 00 هگز توی IAR به صورت مستقیم و رجیستری نوشتم که کد 9325 مقدار داخل اونه که توسط fsmc باید خونده بشه و در صورت خوانده شدن یک ال ای دی روشن میشه اما وقتی برنامه رو اجرا و دیباگ سخت افزاری میکنم دو تا اتفاق جالب میافته.!!!!!!!!!! oo: oo: oo: oo:
          یکی اینکه مقدار رجیسترهای کلاک به محض عبور از خط تابع تنظیم اونها اتوماتیک تغییر میکنن و یکی اینکه برنامه بعد از اجرای خط تابع read_data که اونم خودش تابع write_address رو فرا میخونه متوقف میشه و انگار توی یک حلقه گیر کنه شبیه اون دیگه هیچ کاری نمیکنه!!!نمیدنم ایراد کجاست! oo: :angry: :angry:
          کسی نمیدونه چشه؟؟؟
          عکسشم میزارم
          کد:
          #include <iostm32f10xxE.h>
          #include <io_macros.h>
          #include <stdio.h>
          #include <stdlib.h>
          #include <math.h>
          #include <time.h>
          //#include <iostream.h>
          
          
          
          void delay(int num)
          {
           double i;
           for(i=0;i<num;i++)
           {
           
           }
          }
          
          //CLK init function
          void clk_init(void)
          {
          RCC_CR = 0x01010000;
          RCC_CFGR = 0x005d0001;
          RCC_APB2ENR = 0x000001fd;
          RCC_AHBENR = 0x00000104;
          }
          //GPIO pins configuared in output alternate push/pull
          void gpio_init(void)
          {
          GPIOD_CRH = 0xbb000bbb;
          GPIOD_CRL = 0x00bb00bb;
          GPIOE_CRH = 0xbbbbbbbb;
          GPIOE_CRL = 0xb0008000;
          GPIOE_ODR_bit.ODR3=1;
          GPIOG_CRH = 0x000b0000;
          GPIOG_CRL = 0x0000000b;
          GPIOF_CRH=0x00003000;
          GPIOB_CRL=0x00000003;
          
          }
          
          void fsmc_init(void)
          {
          FSMC_BCR1=0x00004059;
          FSMC_BTR1=0x10000501;
          FSMC_BWTR1=0x10000501;
          }
          
          void write_data(unsigned short int data)
          {
          FSMC_BCR1=0x00005059;
          *(volatile unsigned short int *)(0x6c000200) = data;
          }
          
          void write_address(unsigned short int address)
          {
          FSMC_BCR1=0x00005059;
          *(volatile unsigned short int *)(0x6c000000) = address;
          }
          
          
          unsigned char read_data(unsigned short int address)
          {
          write_address(address);
          FSMC_BCR1=0x00004059;
          unsigned char s;
          s=*(volatile unsigned short int *)(0x6c000200);
          
          return s;
          }
          
          
          
           void main()
           {
           clk_init();
           gpio_init();
           fsmc_init();
           //write_address(0x00000000);
           
           while(1)
            {
            unsigned short int k=0;
            k=read_data(0x00);
           // int k=0x0;
            if(k==0)
            {
             GPIOB_ODR_bit.ODR0=1;
             GPIOF_ODR_bit.ODR11=1;
            delay(10000);
             GPIOB_ODR_bit.ODR0=0;
             GPIOF_ODR_bit.ODR11=0;
             delay(10000);
            }
            else if(k==0x9325) 
            {
             GPIOB_ODR_bit.ODR0=1;
             GPIOF_ODR_bit.ODR11=1;
            }
           else
            {
             GPIOB_ODR_bit.ODR0=1;
             GPIOF_ODR_bit.ODR11=1;
            delay(100000);
             GPIOB_ODR_bit.ODR0=0;
             GPIOF_ODR_bit.ODR11=0;
             delay(100000);
            }
            
             //write_data(0x0101);
           }
           
          }
          خطاب به داعش:
          ای وای اگر پا به حرم بگذاری/یک تکه ز دیوار حرم برداری/شیعه به بین الحرمین حساس است/گفتم که به گوش سگیت بسپاری
          ما از سبوی شاه دین مجنون و مستیم/برگرد تا سربند یا زهرا(س) نبستیم

          دیدگاه


            #6
            پاسخ : راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

            اینم عکس از اتفاق عجیبی که تو پست قبل گفتم: oo: oo: oo: oo:
            خطاب به داعش:
            ای وای اگر پا به حرم بگذاری/یک تکه ز دیوار حرم برداری/شیعه به بین الحرمین حساس است/گفتم که به گوش سگیت بسپاری
            ما از سبوی شاه دین مجنون و مستیم/برگرد تا سربند یا زهرا(س) نبستیم

            دیدگاه


              #7
              پاسخ : راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

              سلام دوست عزیز. اول راجب مشکلت باید بگم که همینجوری نمیشه که مقدار یه رجیستر رو عوض کرد.مخصوصن رجیستر های RCC رو که ممکن هست توی SYSTEM INIT یه جور دیگه کانفیگ شده باشن یا حتی بعضی از قسمت ها رزرو باشن.برای این کار معملا OR میکنن که ما بقی محتوا تغییر نکنه و بیت های که میخوان یک بشه.

              برای FSMC هم باید بگم که در کل توی میکرو های 100 پین خطوط ادرس و خطوط دیتا روی 16 پین یکسان هستند و از 144 پین این خطوط جدا میشن که حالا کاری نداریم ولی LCD رو هم اگه مثل رم در نظر بگیریم خطوط ادرس و دیتاش روی پین های یکسان هستند(در نتیجه نیازی به استفاده از خطوط ادرس FSMC ندارند).این قضایا از چند بانک استفاده میکنه و توی برنامه ها معمولا از این قضیه برای راه اندازی LCD استفاده میکنند که پین RS رو به انتخاب بانک میدن و توی دو اشاره گر که معمولا هم 0x60020000 و 0x60020000 انتخاب میشن با توجه به تفاوت بانک(البته از ادرس هم میشه استفاده کرد) و تغییر پین RS ، دیتا یا رجیستر سلکت میشن.(رجیستر انتخاب بشه یا محتوای رجیستر LCD(

              دیدگاه


                #8
                پاسخ : راه اندازی LCD N96 با چیپ ILI9325 در IAR برای STM32f10xx

                تشکر از پاسختون.
                اما باید بگم اگه تاپیک FSMC رو دیده باشید این نکات رو اونجا گفتیم و البته درست فرمودید اما درباره رجیسترها باید بگم که من مقادیر رزرو رو با مقدار ریست پرکردم و این توی دیتاشیت گفته شده بود.مشکل اینجاست که مقادیر غیر رزرو به طور اتوماتیک تغییر میکنن.حالا اونا زیاد مهم نیست.مشکل دومی که گفتم دربارش تو تاپیک FSMC توضیح دادم اگه میتونید اونجام یه سر بزنید خیلی ممنون میشم.
                خطاب به داعش:
                ای وای اگر پا به حرم بگذاری/یک تکه ز دیوار حرم برداری/شیعه به بین الحرمین حساس است/گفتم که به گوش سگیت بسپاری
                ما از سبوی شاه دین مجنون و مستیم/برگرد تا سربند یا زهرا(س) نبستیم

                دیدگاه

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