ORG 2000 benzeri bir kod mevcutmu start adress için.

Başlatan muhittin_kaplan, 22 Ekim 2013, 17:54:36

muhittin_kaplan

stm32f4 ile çalışırken programın 0 sectorden itibaren değilde 3 sectorden itibaren yüklenmesini ve çalışmasını nasıl sağlarım
mümkünse idelerin configuration pencereleriyle değilde kod ile olursa makbule geçer.

camby

Hocam .s dosyasina baktin mi , ilk calisan oydu

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mustafabudak

#3
hocam aşagıdaki kodu stm32f4_flash.ld dosyasının içine yapıştır gitsin




/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = 0x20020000; /* end of 128K RAM on AHB bus */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
  VECTOR (rx) : ORIGIN = 0x08000000, LENGTH = 16K                /* Interrupt vector space */
  EEPROM (rx) : ORIGIN = 0x08004000, LENGTH = 16K                /* Emulated eeprom space */
  FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 992K                /* Main Embedded FlashROM */ /* buradan sonra program başlayacak*/
  SRAM         (xrw)         : ORIGIN = 0x40024000, LENGTH = 4K                /* Backed up SRAM */
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112K                /* Main Embedded SRAM */
  RAM1 (xrw)         : ORIGIN = 0x2001C000, LENGTH = 16K                /* Etheret & USB Specific Embedded SRAM */
  CCM         (xrw)         : ORIGIN = 0x10000000, LENGTH = 64K                /* Core-Coupled SRAM */
}

/* Define output sections */
SECTIONS
{
  /* The startup code goes first into VECTOR */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >VECTOR

  /* EEPROM Emulation in EEPROM */

  .eeprom :
  {
    . = ALIGN(4);
        *(.eeprom)
    . = ALIGN(4);
  } >EEPROM

  /* The program code and other data goes into FLASH */
  .text :
  {
    . = ALIGN(4);
    *(.text) /* .text sections (code) */
    *(.text*) /* .text* sections (code) */
    *(.rodata) /* .rodata sections (constants, strings, etc.) */
    *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
    *(.glue_7) /* glue arm to thumb code */
    *(.glue_7t) /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .; /* define a global symbols at end of code */
    _exit = .;
  } >FLASH


   .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    .ARM : {
    __exidx_start = .;
      *(.ARM.exidx*)
      __exidx_end = .;
    } >FLASH

  .preinit_array :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

  /* used by the startup to initialize data */
  _sidata = .;

  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data : AT ( _sidata )
  {
    . = ALIGN(4);
    _sdata = .; /* create a global symbol at data start */
    *(.data) /* .data sections */
    *(.data*) /* .data* sections */

    . = ALIGN(4);
    _edata = .; /* define a global symbol at data end */
  } >RAM

  /* Uninitialized data section */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .; /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .; /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(4);
  } >RAM

   /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

  .ARM.attributes 0 : { *(.ARM.attributes) }
}


muhittin_kaplan

Alıntı yapılan: z - 22 Ekim 2013, 19:09:57
Sektor dediğin ne?
Memory bolumu

Mustafa hocam coidenin urettigi  ld dosyayi bulamadim. Oyuzden kaynak kodun icerisinde kullanabilecegim kod yada makro ariyorum

muhittin_kaplan

gerbay hocam CoIde ile çalışıyorum linker ı bir türlü bulamadım.

CoIde nin derleme esnasında verdiği çıkıştır

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -g -Wl,-Map=MustafaBey.map -O0 -Wl,--gc-sections -LC:\CooCox\CoIDE\configuration\ProgramData\MustafaBey -Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\MustafaBey/arm-gcc-link.ld -g -o MustafaBey.elf ..\obj\startup_stm32f4xx.o ..\obj\main.o ..\obj\stm32f4xx_rcc.o ..\obj\stm32f4xx_gpio.o ..\obj\stm32f4xx_flash.o ..\obj\system_stm32f4xx.o ..\obj\eeprom.o

yukardaki bölüm ü acaba kullandığı linker.

mustafabudak

hocam ben truestudio kullanıyorum

zannedersem ikiside yani cooide de yine aynı compileri kullanıyor

adı xxxx.ld olmasada başka birşeydir bakalım derim

ayrıca aslında bu boot işlemlerini ve satrup dosyalarını ayrı bir başlıkta incelemek lazım

gonderdiğim memory.h ve memory .c inceleyebildinizmi


muhittin_kaplan

#7
bazen muziplik yapıyorum
CoIDE ye açtığım konu


i try to eeprom working on stm32f407
I'd like to use flash sector0 and flash sector1 as eeprom.
sector 0 adr is 0x08000000
sector 1 adr is 0x08004000
and
i want program start at flash sector 2.

briefly,
My user code, start  at 0x08008000 address on flash
Chestnuts, I wait for the answer quickly.



mesaj birleştirme:: 22 Ekim 2013, 23:59:41

Alıntı yapılan: mustafabudak - 22 Ekim 2013, 23:49:50
hocam ben truestudio kullanıyorum

zannedersem ikiside yani cooide de yine aynı compileri kullanıyor

adı xxxx.ld olmasada başka birşeydir bakalım derim

ayrıca aslında bu boot işlemlerini ve satrup dosyalarını ayrı bir başlıkta incelemek lazım

gonderdiğim memory.h ve memory .c inceleyebildinizmi
Mustafa Hocam İnceledim ama bu starting adress le alakalı bir durum yok, sadece sectorleri vb tanımlamış.


z

Startup kodunda reset vectorunde Reset rutininin adresi var.
Reset rutininin hemen onune 4000 bytelik alan ac. Bunlarin sonun da reset rutinini olsun.

Keilde bu is kolay da senin su cocox mu herneyse onda nasil yapilir bilmiyorum.

Keil dururken neden cocoxla falan ugrasiyorsunuz ki? Sonucta oyle yada boyle ikise de bedava.....
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

#9
keil de nasıl
Alıntı YapReset rutininin hemen onune 4000 bytelik alan ac. Bunlarin sonun da reset rutinini olsun.

mesaj birleştirme:: 23 Ekim 2013, 00:51:11

Ayrıca Açtığım Bu Alanı Eeprom olarak kullanacağım

startup daki reseth handler

void Default_Reset_Handler(void)
{
  /* Initialize data and bss */
  unsigned long *pulSrc, *pulDest;

  /* Copy the data segment initializers from flash to SRAM */
  pulSrc = &_sidata;

  for(pulDest = &_sdata; pulDest < &_edata; )
  {
    *(pulDest++) = *(pulSrc++);
  }
  
  /* Zero fill the bss segment.  This is done with inline assembly since this
     will clear the value of pulDest if it is not kept in a register. */
  __asm("  ldr     r0, =_sbss\n"
        "  ldr     r1, =_ebss\n"
        "  mov     r2, #0\n"
        "  .thumb_func\n"
        "zero_loop:\n"
        "    cmp     r0, r1\n"
        "    it      lt\n"
        "    strlt   r2, [r0], #4\n"
        "    blt     zero_loop");
#ifdef __FPU_USED
  /* Enable FPU.*/ 
  __asm("  LDR.W R0, =0xE000ED88\n"
        "  LDR R1, [R0]\n"
        "  ORR R1, R1, #(0xF << 20)\n"
        "  STR R1, [R0]");
#endif

muhittin_kaplan

hocam 10 ve 11 numaralı sectorler 128 den 256kb lık ve maalesef biz bunun hepsini kullanmak zorundayız. (yayınlanan eepromc ve eeprom.h emulatorde dosyalarından dolayı)
256kb yazık günah. Hadi bunu yaptın ST şöyle 1kb lık iki sectör yapsana.

z

Alıntı yapılan: muhittin_kaplan - 23 Ekim 2013, 00:49:43
keil de nasıl
mesaj birleştirme:: 23 Ekim 2013, 00:51:11


Keil'de EXPORT Reset_Handler satırını buluyorsun.

sola dayalı Reset_Handler labelinin hemen üstüne FILL 0x4000,0xFF,1 yazıyorsun.

Yani aşağıdaki gibi


              
              EXPORT Reset_Handler

              FILL 0x4000,0xFF,1

Reset_Handler


Bu sana yazacağın programın 0x4000 byte daha ileriden yüklenmesini sağlar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com