Forum: Mikrocontroller und Digitale Elektronik Bootloader und JumpToFirmware


von Jürgen H. (nobody)


Lesenswert?

Hallo,

ich suche mich jetzt schon ne ganze Weile dumm und deppert.

Ich habe mir einen Bootloader für den M4 geschrieben, der ja nach 
Anforderung zwei unterschiedliche Images im Flash aufrufen soll.

Das funktionierte auch immer gut.

Da sich aber nun der Speicher geändert hat, habe ich die Sprungadresse 
von 0x800C000 auf 0x8010000 ändern müssen. Und nun wird zwar die 
Firmware noch angesprungen aber landet bei der Initialisierung der 
globalen Variablen auf der Adresse 0xFFFF FFFE.

Gelinkt wurde die Firmware natürlich auch für den neuen Speicherbereich. 
Gibt es Einschränkungen welchen Speicher man starten kann? Oder wo 
könnte das Problem liegen?

Beide Adressen liegen am Start eines Flashsectors.

Hier der Code zum Sprung der funktioniert.
1
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x800C000);
2
3
JumpAddress = *(__IO uint32_t*) (0x800C000 + 4);
4
Jump_To_Firmware = (pFunction)JumpAddress;
5
// Initialize user production's Stack Pointer 
6
__set_MSP(*(__IO uint32_t*) 0x800C000);
7
Jump_To_Firmware();

von Peter D. (peda)


Lesenswert?

Jürgen H. schrieb:
> Ich habe mir einen Bootloader für den M4 geschrieben

Und jetzt raten wir alle mal, welcher M4 das sein könnte.

von Jürgen H. (nobody)


Lesenswert?

Kein Problem.....

STM32F417

: Bearbeitet durch User
von Jürgen H. (nobody)


Lesenswert?

Hier noch ein Auszug aus dem Mapfile.
Hier sieht man schön das dass Image auch im richtigen Brereich liegt.
1
Memory Map of the image
2
3
  Image Entry point : 0x08010189
4
5
  Load Region LR_IROM1 (Base: 0x08010000, Size: 0x0000d8e8, Max: 0x00054000, ABSOLUTE, COMPRESSED[0x0000d7f4])
6
7
    Execution Region ER_IROM2 (Base: 0x08010000, Size: 0x0000d700, Max: 0x00054000, ABSOLUTE)
8
9
    Base Addr    Size         Type   Attr      Idx    E Section Name        Object
10
11
    0x08010000   0x00000188   Data   RO            3    RESET               startup_stm32f4xx.o
12
    0x08010188   0x00000008   Code   RO        17969  * !!!main             c_w.l(__main.o)
13
    0x08010190   0x00000034   Code   RO        18772    !!!scatter          c_w.l(__scatter.o)
14
    0x080101c4   0x0000005a   Code   RO        18770    !!dczerorl2         c_w.l(__dczerorl2.o)
15
    0x0801021e   0x00000002   PAD
16
    0x08010220   0x0000001a   Code   RO        18774    !!handler_copy      c_w.l(__scatter_copy.o)
17
    0x0801023a   0x00000002   PAD
18
    0x0801023c   0x0000001c   Code   RO        18776    !!handler_zi        c_w.l(__scatter_zi.o)

von Jürgen H. (nobody)


Lesenswert?

Nochmal ne Info.

Das Problem tritt immer dann ein, wenn ein SVC Aufruf (KEIL RTX) gemacht 
wird.

von Martin (Gast)


Lesenswert?

Der 2. Parameter von NVIC_SetVectorTable ist ein Offset und keine 
absolute Adresse

von Jürgen H. (nobody)


Lesenswert?

Ja Martin da hast du recht. Danke.

Aber das kam durch mein probieren. Hatte vorher den direkten Zugriff auf 
VTOR drinnen.
1
SCB->VTOR = 0x800C000; // Vector Table Relocation in Internal FLASH

Aber das ändert leider nichts an meinem Problem.

von Jürgen H. (nobody)


Lesenswert?

So hab's gefunden.

Eine std lib von STM hat mir den VTOR umgeschrieben.
Nun läuft es wie es soll.

von Bülent C. (mirki)


Lesenswert?

Jürgen H. schrieb:
> So hab's gefunden.
>
> Eine std lib von STM hat mir den VTOR umgeschrieben.
> Nun läuft es wie es soll.

klassiker

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.