Forum: Mikrocontroller und Digitale Elektronik Probleme AVRStudio und externer Speicher


von Max Forster (Gast)


Lesenswert?

Hallo zusammen!
Ich hab schon ein paar Stunden mit der Suche im Internet zu meinem 
Problem verbacht, hab aber nix gescheites gefunden! Vielleicht könnt ihr 
mir ja weiterhelfen!
Ich habe einen AT90CAN128 an dessen Speicherbus ein externes RAM ist! 
Wenn ich das richtig verstanden habe, lässt sich dieses dann über die 
Adressen 0x1100 bis 0xFFFF ansprechen.
Ich würde nun gern den .data Bereich oder zumindest einige recht große 
Arrays in den externen Speicher verschieben!
Wenn ich beim AVRStudio eine Section anlege, die .exram heisst, als SRAM 
konfiguriert ist und an der Adresse 0x1100 beginnt und dann hinter mein 
Array _attribute_ ((section (".exram"))) schreibe, kann ich das 
erzeugte HEX-File nicht mehr auf meinen AVR laden. Es kommt zu einer 
Fehlermeldung, dass der Inhalt der Datei nicht zu meinem Device passen 
würde.
Wenn ich auf gleichem Wege eine Section "anlege" die .data heisst, als 
SRAM konfiguriert ist und an der Adresse 0x1100 beginnt, kommt diese 
Fehlermeldung nicht! Sind nun alle meine Variablen im externen Speicher 
oder lieg ich da generell falsch! Irgendwie kapier ich das glaub ich 
ned!
Wie benutz ich denn nun das externe Ram für meine Variablen, damit das 
interne SRAM für den Stack da is?

Auf jeden Fall schon mal Danke für eure Hilfe und eure Antworten!
MfG Max

von Max Forster (Gast)


Lesenswert?

Weiß denn keiner eine Antwort? :-(

von Gast (Gast)


Lesenswert?

Ich mache es über die .init Sctions und den Linker, weil das im 
AVR-Studio auch nicht funktioniert hat.

http://www.nongnu.org/avr-libc/user-manual/mem_sections.html

Folgende Linker Section legt die Data-Area ab 0x1000 fest:

-Wl,--section-start=.data=0x801000,--defsym=__heap_end=0x80ffff


Folgende Code-Sequenzen stehen ganz oben im Code:

Externen Speicher in .init1 deklarieren:
1
//-------------------------------------------------------------------
2
//    .init1
3
//
4
//    used to enable external ram in XMCRA register
5
//    also possible at top of main()
6
//
7
//    Following linker section is necessary to set .data area:
8
//
9
//     -Wl,--section-start=.data=0x801000,--defsym=__heap_end=0x80ffff
10
//
11
//-------------------------------------------------------------------
12
void my_init_external_ram (void) __attribute__ ((naked)) \
13
    __attribute__ ((section (".init1")));
14
15
void my_init_external_ram(void)
16
{
17
  // enable external sram
18
  XMCRA |= (1 << SRE);
19
20
  // one wait states for read/write upper sector
21
//  XMCRA |= (1 << SRW10) | (0 << SRW11);
22
23
  // two wait states for read/write upper sector
24
  XMCRA |= (0 << SRW11) | (1 << SRW11);
25
26
  // two wait states for read/write upper sector
27
  // one wait state befor driving out new address
28
//  XMCRA |= (1 << SRW11) | (1 << SRW10);
29
30
  XMCRA &= ~(1 << SRW11);
31
}


Den Stack-Pointer in .init3 auf 0x09FF legen:
1
//-------------------------------------------------------------------
2
//    .init3
3
//
4
//    used to set the stack pointer to 0x09FF (4096)
5
//    cause .data area reach from 0x1000 to 0xFFFF (4096..65535)
6
//
7
//    Following linker section is necessary to set .data area:
8
//
9
//     -Wl,--section-start=.data=0x801000,--defsym=__heap_end=0x80ffff
10
//
11
//-------------------------------------------------------------------
12
void my_init_stack_pointer (void) __attribute__ ((naked)) \
13
    __attribute__ ((section (".init3")));
14
15
void my_init_stack_pointer (void)
16
{
17
  // stack-pointer at 0x09FF
18
  asm volatile("ldi r29, 0x09"::);
19
  asm volatile("out __SP_H__,r29"::);
20
  asm volatile("ldi r28, 0xFF"::);
21
  asm volatile("out __SP_L__,r28"::);
22
}

Vieleicht hilft Dir das.

von Max Forster (Gast)


Lesenswert?

Danke....das hats gebracht! :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.