www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STR9 comstick - CS0/CS1 Bank0 Bank1 Bootloader


Autor: mydani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Frage an alle ARM9-core oder COMSTICK Besitzer:

Ich versuche den STR9 Comstick mit einem Bootloader auszusatten.
Den Bootloader möchte ich in BANK1 legen (die 32KB Bank).
(Dazu muss man per JTAG einstellen dass der µC von BANK1 booten soll).

Allerdings kann ich nicht wirklich sagen ob das beigelieferte Hitop das 
macht - die Einstellungsmöglichkeit bietet es auf jeden Fall.

Gemappt wird Bank1 auf
0x0000000 - 0x00007FFF,
und Bank2 auf
0x00080000 bis +480k.

Wie würdet ihr nun die Startup.asm anlegen?
Die Interruptvektoren usw. muss ja alles bei Adresse 0x0000000 liegen, 
sprich im Bootblock.
Eventuell die Vektoren durchschleusen zu festen Adressen auf Bank0?

Und - hat das Ummappen schon jemand erfolgreich hinbekommen? Mit Hitop 
gibts hier Flash-Verifikationsfehler.

Gruß,
Daniel

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Erratasheet hast du gelesen? Der diesbezüglich interessante Teil 
nennt sich "Flash memory remapping" im Erratasheet vom STR91xFA, mit dem 
alten STR91xF ist man aber auch nicht besser dran.

http://www.st.com/mcu/forums-cat-5096-21.html
http://www.st.com/mcu/forums-cat-5212-21.html

Autor: mydani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

danke für die Links. Gibt da ja 2 Lösungen, die elegantere kannte ich 
noch nicht! Super.

Jetzt ist nur noch die Frage - das CAPS Tool von ST unterstützt 
Flash-Link oder R-LINK. Auf dem Stick ist aber ein FTDI 2232 USB->JTAG 
Umsetzer drauf.
Kann man dieses Memory Remapping (muss per JTAG gemacht werden) auch 
ohne das CAPS Tool machen und stattdessen mit nem anderen Tool (dass den 
FTDI unterstützt)?

Gruß,
Daniel

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Wie würdet ihr nun die Startup.asm anlegen?
Die Interruptvektoren usw. muss ja alles bei Adresse 0x0000000 liegen,
sprich im Bootblock. Eventuell die Vektoren durchschleusen zu festen 
Adressen auf Bank0?"

- die Vektoren auf eine Tabelle im RAM springen lassen
- von dort weiter entweder zu den Routinen in Bank0 und/oder in Bank1
  springen, umprogrammieren jeweils im startup code

das Ummappen funktioniert, wie verwenden Keil + Ulink2 + eigene Hardware

Gruß Dirk

Autor: mydani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe den Stick inzwischen erfolgreich im Betrieb und bin fast 
glücklick.
Bisher habe ich allerdings das Vektor-Problem umgangen indem ich vom 
Bootblock (Flash Bank 1, Adresse 0x0) direkt auf den Applikationsflash 
(Flash Bank 0, Adresse 0x80000) branche.

Jetzt versuche ich gerade stattdessen eine Vektortabelle im Ram zu 
benutzen.

Auf embedded.com gibts einen Artikel - allerdings schmeckt mir gar nicht 
wie hier die Tabelle angelegt wird:
void init_mc(void)
{  
  /* RAM Start */ 
  static unsigned long const LDR_PC_PC = 0xE59FF000U;  

  /* LDR table */
  *(unsigned long volatile *)(&__data_start__ + 0x00) = (LDR_PC_PC | 0x18); /* Reset Handler */
  *(unsigned long volatile *)(&__data_start__ + 0x04) = (LDR_PC_PC | 0x18);   
  *(unsigned long volatile *)(&__data_start__ + 0x08) = (LDR_PC_PC | 0x18);
  *(unsigned long volatile *)(&__data_start__ + 0x0C) = (LDR_PC_PC | 0x18);
  *(unsigned long volatile *)(&__data_start__ + 0x10) = (LDR_PC_PC | 0x18);
  *(unsigned long volatile *)(&__data_start__ + 0x14) = (LDR_PC_PC | 0x18);
  *(unsigned long volatile *)(&__data_start__ + 0x18) = (LDR_PC_PC | 0x18);
  
  /* Address table */
  *(unsigned long volatile *)(&__data_start__ + 0x20) = _reset;   /* Should never be reached because the reset vector is handled in the flash vector table */  
  *(unsigned long volatile *)(&__data_start__ + 0x24) = Undefined_Handler;   
  *(unsigned long volatile *)(&__data_start__ + 0x28) = Undefined_Handler;   
  *(unsigned long volatile *)(&__data_start__ + 0x2C) = Undefined_Handler;   
  *(unsigned long volatile *)(&__data_start__ + 0x30) = Undefined_Handler;   
  *(unsigned long volatile *)(&__data_start__ + 0x34) = Undefined_Handler;   
  *(unsigned long volatile *)(&__data_start__ + 0x38) = Undefined_Handler;     
};
Mir gefällt das jedoch nicht so richtig... - z.B. LDR_PC_PC...

Wie habt ihr eure Vektortabellen angelegt?

Mein gewünschter Ansatz wäre wie folgt:
Syntaktisch (sprich in Assembler) die Vektortabelle im RAM gleich wie 
die erste Vektortabelle im Flash (Adresse 0x0) anzulegen und dann beim 
Ausführen des Reset-Handlers einfach 1:1 ins RAM kopieren.
Meine Vektortabelle an 0x0 sieht wie folgt aus:
#*************************************************************************
# Exception Vectors FLASH
#*************************************************************************

  .text
  .section .vectors_flash, "ax"
  
  .arm
  .code 32

  .global  Reset_Vec
  .global _start
  .func  _start

_start:

  Reset_Vec:  LDR     PC, Reset_Addr           /* 0x0000 */
  Undef_Vec:  LDR     PC, Undef_Addr           /* 0x0004 */
  SWI_Vec:     LDR     PC, SWI_Addr             /* 0x0008 */
  PAbt_Vec:    LDR     PC, PAbt_Addr            /* 0x000C */
  DAbt_Vec:  LDR     PC, DAbt_Addr            /* 0x0010 */
             NOP                              /* 0x0014 Reserved Vector */
  IRQ_Vec:  LDR     PC, IRQ_Addr           /* 0x0018 IRC */
        #LDR     PC, [PC, #-0xFF0]        /* 0x001C wraps around address space to 0xFFFFFF030. Vector from VicVECAddr */
  FIQ_Vec:  LDR     PC, FIQ_Addr             /* 0x0020 FIQ has no VIC vector slot! */

  /* Function table */
  Reset_Addr:     .word   _reset                /* CPU reset vector and entry point */

#  Undef_Addr:     .word   UndefinedHandler
#  SWI_Addr:       .word   SWIHandler
#  PAbt_Addr:      .word   PrefetchHandler
#  DAbt_Addr:      .word   AbortHandler
#                  .word   0                      /* Reserved Address */
#  IRQ_Addr:       .word   IRQHandler
#  FIQ_Addr:       .word   FIQHandler        /* Does not get used due to "LDR PC, [PC, #-0xFF0]" above */

Hat jemand einen konkreten Vorschlag wie diese zweite Tabelle in Code 
zu realisieren ist?

Danke!!

Gruß,
mydani

Autor: mydani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, hat sich erledigt - hab selber nochmal eine Variante gebastelt und 
RAM mit FLASH verglichen... jetzt tuts ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.