اطلاعیه

Collapse
No announcement yet.

نوشتن بوت لودر دوم و پگریت برای lpc1768

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

    نوشتن بوت لودر دوم و پگریت برای lpc1768

    با سلام
    مدتی است که یک پروژه با lpc1768 را کار می کنم .
    برای اپگریت آن از طربق پورت com با نرم افزار خودم اومدم این تئوری را پیدا کردم :
    یک برنامه ساده نوشتم که و در فضای حافظه از یکتور 0 تا دو یا 3 سکتور برنامه نوشتم .
    در ابن برنامه پورتها عملا هیچ ربطی با پروژه اصلی نداره فقط پورت com رو راه اندازی می کنم و در صورتیکه به مدت چند ثانیه هیچ دیتایی از پورت نگیرم به برنامه اپلیکشن اصلی بروم . این برنامه اصلی در سکتورهای بعدی نوشته می شود مثلا از شکترو 10 به بعد .

    در بوت لودر خودم اگه دیتای معتبری بیاد یا بفهمم که با ریست دریافت اپلیکشن بالا آمده ام برناه دریافتی از پورت سریال را در سکتورها به ترتیب می ریزم .

    برنامه دریافتی چه در اپلیکشن و چه در بوت لودر( دفعه اولی که اصلا اپلیکشن وجود ندارد روی برد ) پس از دریافت در حافظه جانبی که روی بردم دارم قرار می گیرد و پس از فهمیدن اینکه دیتاها کامل دریافت شده در همان حافظه جانبی مجلی را علامت گذاری می کنم و ریست می کنم تا با بوت لودر خودم بالا بیایم
    در بوت لودر به این صورت می فهمم که باید پگریت کنم .
    پگریت هم با توابع iap صورت می پذیرد .

    وقتی که می نویسم هم دقیقا درست در همان فضا قرار می گیرد ( با فلش مجیک چک کردم و دیدم با فایل باینری دقیقا درسته )
    ولی برنامه اپلیکشن در این حالت کار نمی کنه ( بدون بوت لودر درست کار می کرد )
    من پروژه را با iar نوشتم و فکر کنم مشکل در درست کردن فایل اپلبکشن برای آدرس خاص است




    #2
    پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

    این برنامه بوت لودر است که با فلش مجیک پرگرام می کنم و ضاهرا درست کار می کنه :
    کد:
    [left]
    #include <NXP/iolpc1768.h>
    #include "lpc17xx_nvic.h"
    #include "core_cm3.h"
    #include "lpc17xx_gpio.h"
    #include "defines.h"
    #include "func.h"
    #include "externs.h"
    #include "pw700_lib.h"
    
    
    BYTE connect_f,led_line_co;
    unsigned long t_try_connect,t_connect_f,t_startup;
     USARTDataType USART1;
     USARTDataType USART2;
     USARTDataType USART3;
     USARTDataType USART0;
     BYTE b[8],e[8],d[8];
    BYTE time_flag,j1,k1,lux,speed_;
    unsigned char RXBuf[500];
    unsigned int i,l,t_dis,t_dis1,t_dis2,t_dis3,t_alive,t_send_active,j;
    unsigned char cheshm,loop,de1,de2,de3,effect_num,mode1=0,mode2=0,mode3=0,att1,att2,att3;
    unsigned int t_effect1,t_effect2,t_effect3,txt_len;
    BYTE timer0_counter = 0;
    BYTE timer1_counter = 0;
    unsigned long TIME_INTERVAL0=0xd000;//400
    unsigned long TIME_INTERVAL1=(90000000/200 - 1);//900000
    unsigned long TIME_INTERVAL2=0x1000;
     BYTE newFirmwareF;      //1 = new firmware present.
    BUS BUS1;
      unsigned long iu;
    unsigned long program_size;
    unsigned char dem[]="   dariush abbasi iran pw co  ";
    //****************
    void boot_jump(WORD address)
    {
      asm("LDR SP,[R0]"); //Load new stack pointer address
      asm("LDR PC,[R0,#4]");//Load new program counter address
    }
    //************************************
    void execute_user_code(void)
    {
      SCB->VTOR = USER_FLASH_START & 0x1FFFFF80;
      boot_jump(USER_FLASH_START);
    }
    void delay (unsigned int a )
    {
      for(l=0;l<a;l++)
      {
        for (i=0;i<10;i++)
        {
            LPC_WDT->WDFEED=0xaa;
            LPC_WDT->WDFEED=0x55;
        }
      }
    }
    //*******************************
    void delay_ms (unsigned int a )
    {
      unsigned int a1,a2;
    
      for(a1=0;a1<a;a1++)
      {
    
         LPC_WDT->WDFEED=0xaa;
          LPC_WDT->WDFEED=0x55;
      for (a2=0;a2<0x5fff;a2++)
        {
    
        } ;
      }
    }
    //***************************
    void reset_WD(void)
    {
        LPC_WDT->WDFEED=0xaa;
        LPC_WDT->WDFEED=0x55;
    }
    //******************************************
     BYTE WRITE(unsigned long df_add,unsigned long iap_add,BYTE sector,unsigned long offset)
     {
       BYTE rc ;
       unsigned long jk;
    
      read_DF_random((df_add+offset),daT,1024);
      // for(jk=0;jk<2;jk++)
      // {
    
        // for(i=0;i<512;i++)
        //  dem[i]=daT[i+(512*jk)];
        for(i=0;i<1024;i++)
          dem[i]=daT[i];
    
    
      read_DF_random((df_add+1024),daT,1024);
        for(i=0;i<1024;i++)
          dem[i+1024]=daT[i];
      read_DF_random((df_add+2048),daT,1024);
        for(i=0;i<1024;i++)
          dem[i+2048]=daT[i];
      read_DF_random((df_add+3072),daT,1024);
        for(i=0;i<1024;i++)
          dem[i+3072]=daT[i];
    
    
        LPC_WDT->WDFEED=0xaa;
        LPC_WDT->WDFEED=0x55;
        // dem[0]++;
        //dem[1]++;
    
        iap_prepare( sector, sector);
        //rc=iap_copy_ram_to_flash(&dem,(char *)((iap_add+offset)+(512*jk)), 512);
        rc=iap_copy_ram_to_flash(&dem,(char *)((iap_add+offset)),4096);
        // if(rc!=0) return rc;
    
      // }
       return rc;
     }
    //******************************************************************************/
    //*******************************
    void main()
    {
    
    //unsigned char demo[]="   dariush abbasi iran pw co  ";
     L_Byte L2B;
     //SCB->VTOR = 0;
     //boot_jump(0);
     CLK_INIT();
      PLL_Init (70, 1 ) ;
    
    
      init_timer( 0, TIME_INTERVAL0 ); //
      enable_timer( 0 );
    
    // init_timer( 1, TIME_INTERVAL1 ); //
     // enable_timer( 1 );
    
     // init_timer( 2, TIME_INTERVAL2 ); //
     // enable_timer( 2 );
     //en_watch_dog()  ;
    
      uart_init(0);
       NVIC_SetPriority(UART0_IRQn, 0);
    
    
      spi_enable();
       //****************************
      FIO0DIR=0XFfFffFFF;
      FIO1DIR=0XFFFFFFFF;
      FIO2DIR=0XFFFFFFFF;
      FIO3DIR=0XFFFFFFFF;
    
      t_startup=0;
      DataFlashReset();
    
     	IsBusy();
        DataFlashReset();
    
    //*****************************
       //init_dis();
     //************************
      //    LPC_TIM1->TCR = 3;
       //   init_timer( 1, (100000000/(20*speed_) - 1) ); //
       //   LPC_TIM1->TCR = 1;
    
    
    
    
        USART0.EOS= '\n';
      //USART0.pRxBuffer=zLink.rxBuf;  /*RXBuffer;*/
      USART0.RxFirst  = 0x00;
      USART0.RxLast  = 0x00;
      USART0.RxCount  = 0x00;
              //FIO1PIN&=~(1<<18) ;
               FIO1PIN|=(1<<18) ;
     //************************
      read_DF_random(0x3a7fc0,daT,12);
      L2B.xByte[0]=daT[3];
      L2B.xByte[1]=daT[4];
      L2B.xByte[2]=daT[5];
      L2B.xByte[3]=0;
      program_size=L2B.L;
    //***********************************
      if((daT[7]==1)&&(daT[8]==0xaa)&&(daT[9]==0x55))
      {
        __disable_irq();
        iap_init() ;
    
         txt_len=iap_prepare( 10, 20);
         txt_len=iap_erase_sector(10, 20);
           //***************************************  sectore 10
         txt_len=WRITE(0x3a8000,0xa000,10,0);
        //***************************************  sectore 11
         txt_len=WRITE(0x3a9000,0xb000,11,0);
        //***************************************  sectore 12
         txt_len=WRITE(0x3aa000,0xc000,12,0);
         //***************************************  sectore 13
         txt_len=WRITE(0x3ab000,0xd000,13,0);
        //***************************************  sectore 14
         txt_len=WRITE(0x3ac000,0xe000,14,0);
        //***************************************  sectore 15
         txt_len=WRITE(0x3ad000,0xf000,15,0);
    //   //***************************************  sectore 16
         txt_len=WRITE(0x3ae000,0x10000,16,0);
         txt_len=WRITE(0x3af000,0x11000,16,0);
         txt_len=WRITE(0x3b0000,0x12000,16,0);
         txt_len=WRITE(0x3b1000,0x13000,16,0);
         txt_len=WRITE(0x3b2000,0x14000,16,0);
         txt_len=WRITE(0x3b3000,0x15000,16,0);
         txt_len=WRITE(0x3b4000,0x16000,16,0);
         txt_len=WRITE(0x3b5000,0x17000,16,0);
    //       //***************************************  sectore 17
         txt_len=WRITE(0x3b6000,0x18000,17,0);
         txt_len=WRITE(0x3b7000,0x19000,17,0);
         txt_len=WRITE(0x3b8000,0x1a000,17,0);
         txt_len=WRITE(0x3b9000,0x1b000,17,0);
         txt_len=WRITE(0x3ba000,0x1c000,17,0);
         txt_len=WRITE(0x3bb000,0x1d000,17,0);
         txt_len=WRITE(0x3bc000,0x1e000,17,0);
         txt_len=WRITE(0x3bd000,0x1f000,17,0);
    //       //***************************************  sectore 18
         txt_len=WRITE(0x3be000,0x20000,18,0);
         txt_len=WRITE(0x3bf000,0x21000,18,0);
         txt_len=WRITE(0x3c0000,0x22000,18,0);
         txt_len=WRITE(0x3c1000,0x23000,18,0);
         txt_len=WRITE(0x3c2000,0x24000,18,0);
         txt_len=WRITE(0x3c3000,0x25000,18,0);
         txt_len=WRITE(0x3c4000,0x26000,18,0);
         txt_len=WRITE(0x3c5000,0x27000,18,0);
           //***************************************  sectore 19
         txt_len=WRITE(0x3c6000,0x28000,19,0);
    
         //***************************
          daT[7]=0;
          daT[8]=0;
          write_DF_random(0x3a7fc0,daT,12);
          FIO0PIN|=(1<<30) ;
      //  __enable_irq();
        execute_user_code();
    
      }
      FIO1PIN&=~(1<<18) ;
    
      //***************************
       LPC_WDT->WDFEED=0xaa;
      LPC_WDT->WDFEED=0x55;
     // ******************************
       if( (USART0.RxCount > 0))
         Check_hh_Data0(2000)  ;
       // ******************************
         __disable_irq();
        iap_init() ;
        iap_prepare( 10, 20);
       txt_len= BlankCheckSectors((char *)10) ;
        __enable_irq();
       if(txt_len==0)
       {
         while(1)
         {
              iu++;
                if(iu==800000)
                {
                  FIO1PIN&=~(1<<18) ;
                  FIO0PIN|=(1<<29) ;
    
                }
               if(iu==400000)
               {
                  FIO0PIN&=~(1<<29) ;
                  FIO1PIN|=(1<<18) ;
               }
              if(iu>900000)
               iu=0;
           LPC_WDT->WDFEED=0xaa;
           LPC_WDT->WDFEED=0x55;
    
          if(USART0.RxCount >0)
            Check_hh_Data0(100)  ;
    
         }
       }
        // ******************************
        __disable_irq();
       execute_user_code();
    
    }
    
    [/left]

    دیدگاه


      #3
      پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

      به نظرم باید آدرس شروع برنامه رو توی برنامه اعلام کنی ولی تو IAR نمی دونم چیه

      دیدگاه


        #4
        پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

        البته در مورد کمپایلر iar در قسمت linker configuration یک چیزهایی هست ولی من درست درک نمی کنم که چکار باید بکنم با آنها !

        دیدگاه


          #5
          پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

          نوشته اصلی توسط داریوش عباسی
          البته در مورد کمپایلر iar در قسمت linker configuration یک چیزهایی هست ولی من درست درک نمی کنم که چکار باید بکنم با آنها !
          اونا رو که من کلا نمی دونم اصلا با IDE کامپایلر iar کار نکردم
          توی کیل تو قسمت Main برنامه باید اینو بنویسی
          NVIC_SetVTOR(X)
          x آدرش شروع برنامه تو حافطه هستش

          دیدگاه


            #6
            پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

            آیا کسی با کمپایلر IAR کار کرده که بتونه به من کمک کنه
            من برای درست کردن USE APPLICATION که در آدرس 0XA000 باشد و در صورت SET شدن به آن :
            void boot_jump(WORD address)
            {
            asm("LDR SP,[R0]" //Load new stack pointer address
            asm("LDR PC,[R0,#4]"//Load new program counter address
            }
            //************************************
            void execute_user_code(void)
            {
            SCB->VTOR = USER_FLASH_START & 0x1FFFFF80;
            boot_jump(USER_FLASH_START);
            }

            برنامه درست کار کند
            مشکل دارم

            دیدگاه


              #7
              پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

              الان مشکلت چی هست دقیقا؟
              بعد از بوت لودر نمی تونیjump بزنی به برنامت؟
              هميشه به ياد خدا باش !

              دیدگاه


                #8
                پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

                نوشته اصلی توسط DDR3
                الان مشکلت چی هست دقیقا؟
                بعد از بوت لودر نمی تونیjump بزنی به برنامت؟
                چرا به اون آدرس جامپ می کنم ولی برنامه اجرا نمی شود
                حدس می زنم برنامه اپلیکیشن باید تنظیماتی داشته باشد که از یک اپلیکیشن عادی متفاوت باشد چون آدرس شروع آن دیگر از 00 نیست و از A000 است

                اگر تنظیمات کمپایلر IAR رو بدونم که چطوری میشه اینکار رو کرد فکر کنم حل بشه

                دیدگاه


                  #9
                  پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

                  من ir کار نکردم و همینطور lpc
                  ولی بنظرم از لحاظ پاسه و اساس تفاوتی نداشته باشند
                  روند اینطوری هست،در زمان نوشتن برنامه اپلیکشن شما آدرسات باید طبق همونی باشه که رو فلش هست،با دیباگر اجرا کن بدوم بوت لودر باید تو همون آدرس شروع بشه
                  و اجرا هم بشه
                  اگر انجام شد،پس برنامه با آدرس جدید درست هست
                  آیتم بعدی تنظیم nvic هست،تو برنامه بوت که هموون آدرس اپلیکشن هست
                  بعدش باید پرش کنی بدون شرط به 4 بایت بعدش
                  توی stm با کامپایلر کیل هست اینها که گفتم
                  تطبیقش بده به lpc و ir
                  ببین انجام میشه
                  هميشه به ياد خدا باش !

                  دیدگاه


                    #10
                    پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

                    کمپایلر iar قسمتی در منوی linker دارد که ظاهرا برای همین منظوره ولی من هر کاری می کنم کار نمی کنه .
                    کسی با IAR کار نکرده ؟

                    دیدگاه


                      #11
                      پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

                      ظاهرا در iar برخلاف pcexpersoo علاوه بر تغییر آدرس شروع برنامه باید verctor ها رو هم تغییر آدرس داد ولی هیچ سنخیتی در فایل باینری خروجی با مقدار تعیین شده در تنظیمات ندارد !

                      دیدگاه


                        #12
                        پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

                        سلام
                        در فایل flash.icf آدرس شروع اپلیکیشن را تغییر داده اید؟
                        موفق باشید
                        بازیه ز ندگی اون نیست که تاسه خوب بیاری , اینه که تاسه بد رو خوب بازی کنی

                        دیدگاه


                          #13
                          پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

                          در فایل flash.icf آدرس شروع اپلیکیشن را تغییر داده اید؟
                          آره هم آدرس rom و هم آدرس وکتور و البته هر دو را برابر هم قرار دادم
                          در همان فایل قسمتی به نام crp start , stop وجود دارد این رو باید چکارش کنم . چون وقتی تغییرش می دم فایل باینری آدرس شروع و .. تغییر می کنه

                          دیدگاه


                            #14
                            پاسخ : نوشتن بوت لودر دوم و پگریت برای lpc1768

                            من فقط تو قسمت ROM تغییر میدهم آدرس رو

                            __ICFEDIT_region_ROM_start__
                            بازیه ز ندگی اون نیست که تاسه خوب بیاری , اینه که تاسه بد رو خوب بازی کنی

                            دیدگاه

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