Forum: Mikrocontroller und Digitale Elektronik Offset des User Codes für einen Bootloader beim ARM Cortex M4 Infenion XMC4500


von Bubba L. (pic24h)


Lesenswert?

Hallo Miteinander,

ich habe eine allgemeine Frage beim verschieben (Offset) vom User Code 
bei einem ARM Cortex M4.

Ich hab einen Bootloader und dazu eine Windows Applikation erstellt, die 
mit dem Bootloader kommuniziert und die zu ladende Hex File überträgt.

Das Übertragen und speichern scheint zu funktionieren, da der Speicher 
nachdem übertragen der Hex File, ausgelesen wurde und sich an der 
definierten Adresse dann Daten zu finden sind.

Was nicht funktioniert ist das Springen zum User Code.
Der Bootloader befindet sich am Anfang des Flash Speichers und der User 
Code am Anfang vom nächsten Sektor.

Im Linker Script des User Codes wurde wurde ein Offset erstellt.

MEMORY
{
  FLASH_1_cached(RX) : ORIGIN = 0x08004000, LENGTH = 0x100000-0x4000
  FLASH_1_uncached(RX) : ORIGIN = 0x0C004000, LENGTH = 0x100000-0x4000
  PSRAM_1(!RX) : ORIGIN = 0x10000000, LENGTH = 0x10000
  DSRAM_1_system(!RX) : ORIGIN = 0x20000000, LENGTH = 0x10000
  DSRAM_2_comm(!RX) : ORIGIN = 0x30000000, LENGTH = 0x8000
}

In der Map File befindet sich der Reset Handler an der Offset Adresse.

Der Sprung vom Bootloader zum User Code funktioniert leider irgendwie 
nicht.


void RunFlash(void)
{
   __asm(
       "ldr r0, =0x0C004000\n"
         "ldr r1, =0xE000ED08\n"  //VTOR register
     "str r0,[r1]\n"
       "ldr sp, [r0], #4\n"
         "ldr r15, [R0]"
    );
}


Bin recht neu in der ARM Welt unterwegs.

Hat vielleicht jemand einen Tipp für mich?

: Bearbeitet durch User
von Lothar (Gast)


Lesenswert?

Bubba L. schrieb:
> Der Bootloader befindet sich am Anfang des Flash Speichers und der User
> Code am Anfang vom nächsten Sektor

Zur Info: die meisten ARM ausser XMC z.B. LPC, STM32 haben einen ROM 
(oder Flash Security Page) Bootloader. Das ROM wird als High Memory 
eingeblendet. Der User Code beginnt also unabhängig davon, ob ein 
Bootloader existiert oder nicht, bei 0 und beinhaltet die Vektortabelle. 
Somit müssen nicht verschiedene HEX gelinkt werden.

Zum Starten des User Code aus einem Bootloader, der selbst nach der 
Vektortabelle beginnt, wird am einfachsten ein Software-Reset ausgelöst 
mit NVIC_SystemReset()

von boot @ 0000 0000 h (Gast)


Lesenswert?

Da schau ich mal ins Manual:
On system reset, the vector table is fixed at address 0x00000000. 
Privileged software
can write to the VTOR to relocate the vect
or table start address to a different memory
location, in the range 0x00000400 to 0x3FFF
FC00

von Jim M. (turboj)


Lesenswert?

Bubba L. schrieb:
> Hat vielleicht jemand einen Tipp für mich?

Debugger ranhängen und uns mitteilen wo genau er aussteigt.

Was gerne vergessen wird ist das T-Bit bei Vectoradressen, dann würde 
"LDR PC, [R0]" in einem Hardfault enden.

von Bubba L. (pic24h)


Lesenswert?

Lothar schrieb:
> Bubba L. schrieb:
>> Der Bootloader befindet sich am Anfang des Flash Speichers und der User
>> Code am Anfang vom nächsten Sektor
>
> Zur Info: die meisten ARM ausser XMC z.B. LPC, STM32 haben einen ROM
> (oder Flash Security Page) Bootloader. Das ROM wird als High Memory
> eingeblendet. Der User Code beginnt also unabhängig davon, ob ein
> Bootloader existiert oder nicht, bei 0 und beinhaltet die Vektortabelle.
> Somit müssen nicht verschiedene HEX gelinkt werden.
>
> Zum Starten des User Code aus einem Bootloader, der selbst nach der
> Vektortabelle beginnt, wird am einfachsten ein Software-Reset ausgelöst
> mit NVIC_SystemReset()

Nach der Vektortabelle beginnt zuerst der Bootloader. Er wartet 3 
Sekunden auf ein Befehl die UART Schnittstelle. Wenn kein Befehl 
erhalten wird, dann soll er zum User Code an der Adresse (0x0C004000) 
springen.

boot @ 0000 0000 h schrieb:
> Da schau ich mal ins Manual:
> On system reset, the vector table is fixed at address 0x00000000.
> Privileged software
> can write to the VTOR to relocate the vect
> or table start address to a different memory
> location, in the range 0x00000400 to 0x3FFF
> FC00

Das habe ich auch gelesen, aber weiß nicht wie ich den privileged modus 
starte oder ob dieser automatisch bei einem bestimmten Befehl kurz 
aktiviert wird? Ich habe den Offset mit diesen beiden Befehlen versucht.

PPB->VTOR = 0x0C004000;
SCB->VTOR = 0x0C004000;

Jim M. schrieb:
> Bubba L. schrieb:
>> Hat vielleicht jemand einen Tipp für mich?
>
> Debugger ranhängen und uns mitteilen wo genau er aussteigt.
>
> Was gerne vergessen wird ist das T-Bit bei Vectoradressen, dann würde
> "LDR PC, [R0]" in einem Hardfault enden.

Er steigt an der Adresse 0x080042B0 aus mit der Meldung

" No source available for "0x80042b0"  ".

0x08004000 ist identisch zu 0x0C00400. Beim auslesen des Flash sind an 
den Adressen aufwärts die Daten identisch.

Was ist ein T-Bit? Wiki hat mich nicht schlauer gemacht 
(https://de.wikipedia.org/wiki/Sticky_Bit).

Den Sprung befehl habe ich aus dem Bootloader Beispiel von Infenion 
entnommen.

von Bubba L. (pic24h)


Angehängte Dateien:

Lesenswert?

Hier ein Screenshot der beiden Adressen vom Flash

von Bubba L. (pic24h)


Angehängte Dateien:

Lesenswert?

Hier ein ein Screenshot vom Disassembly während dem Debuggen.
Hier scheint es so als ob an der Adresse 0x0C004000 keine Befehle 
vorhanden sind?

Er gelangt aber trotzden bis zur Adresse 0x080042B0 bevor die Meldung
"No source available for "0x80042b0" ausgegeben wird.

von Jim M. (turboj)


Lesenswert?

Bubba L. schrieb:
> Er steigt an der Adresse 0x080042B0 aus mit der Meldung
>
> " No source available for "0x80042b0"  ".

Das ist dann wohl ein Fault, denn im anderen Posting sieht man dass das 
die Default Handler Addresse ist. Und zwar die von der Applikation.
Ich definiere mir immer einen eigenen Handler dafür, dann sieht man 
Fehler besser.

Für die Source müsstest Du jetzt die Symbole der Applikation nachladen, 
der
Default Handler ist aber oft in einem Assembler File deklariert.


Bubba L. schrieb:
> Was ist ein T-Bit?
Das unterste Bit der Addresse, bei Dir überall korrekt gesetzt. Schaltet 
bei ARM zwischen ARM- und Thumb Instruktionen um.

Was Du überprüfen solltest sind die Linker Flags der Applikation. Wenn 
die flachsen Libs verlinkt wurden wäre das eine Ursache für einen Fault, 
man mus auch dem Linker den CPU Typ mitgeben.

von Bubba L. (pic24h)


Lesenswert?

Jim M. schrieb:
> Das ist dann wohl ein Fault, denn im anderen Posting sieht man dass das
> die Default Handler Addresse ist. Und zwar die von der Applikation.
> Ich definiere mir immer einen eigenen Handler dafür, dann sieht man
> Fehler besser.

Blöde Frage...wie definiert man den am Besten? Hast du da ein Beispiel?

in der startup.S Datei ist folgendes bereits drin
1
/* ======================================================================== */
2
/* ========== START OF EXCEPTION HANDLER DEFINITION ======================== */
3
4
/* Default exception Handlers - Users may override this default functionality by
5
   defining handlers of the same name in their C code */
6
7
  .align  1
8
    .thumb_func
9
    .weak Default_Handler
10
    .type Default_Handler, %function
11
Default_Handler:
12
    b .
13
    .size Default_Handler, . - Default_Handler
14
15
     Insert_ExceptionHandler NMI_Handler
16
     Insert_ExceptionHandler HardFault_Handler
17
     Insert_ExceptionHandler MemManage_Handler
18
     Insert_ExceptionHandler BusFault_Handler
19
     Insert_ExceptionHandler UsageFault_Handler
20
     Insert_ExceptionHandler SVC_Handler
21
     Insert_ExceptionHandler DebugMon_Handler
22
     Insert_ExceptionHandler PendSV_Handler
23
     Insert_ExceptionHandler SysTick_Handler
24
25
     Insert_ExceptionHandler SCU_0_IRQHandler
26
     Insert_ExceptionHandler ERU0_0_IRQHandler
27
     Insert_ExceptionHandler ERU0_1_IRQHandler
28
     Insert_ExceptionHandler ERU0_2_IRQHandler
29
     Insert_ExceptionHandler ERU0_3_IRQHandler
30
     Insert_ExceptionHandler ERU1_0_IRQHandler
31
     Insert_ExceptionHandler ERU1_1_IRQHandler
32
     Insert_ExceptionHandler ERU1_2_IRQHandler
33
     Insert_ExceptionHandler ERU1_3_IRQHandler
34
     Insert_ExceptionHandler PMU0_0_IRQHandler
35
     Insert_ExceptionHandler VADC0_C0_0_IRQHandler
36
     Insert_ExceptionHandler VADC0_C0_1_IRQHandler
37
     Insert_ExceptionHandler VADC0_C0_2_IRQHandler
38
     Insert_ExceptionHandler VADC0_C0_3_IRQHandler
39
     Insert_ExceptionHandler VADC0_G0_0_IRQHandler
40
     Insert_ExceptionHandler VADC0_G0_1_IRQHandler
41
     Insert_ExceptionHandler VADC0_G0_2_IRQHandler
42
     Insert_ExceptionHandler VADC0_G0_3_IRQHandler
43
     Insert_ExceptionHandler VADC0_G1_0_IRQHandler
44
     Insert_ExceptionHandler VADC0_G1_1_IRQHandler
45
     Insert_ExceptionHandler VADC0_G1_2_IRQHandler
46
     Insert_ExceptionHandler VADC0_G1_3_IRQHandler
47
     Insert_ExceptionHandler VADC0_G2_0_IRQHandler
48
     Insert_ExceptionHandler VADC0_G2_1_IRQHandler
49
     Insert_ExceptionHandler VADC0_G2_2_IRQHandler
50
     Insert_ExceptionHandler VADC0_G2_3_IRQHandler
51
     Insert_ExceptionHandler VADC0_G3_0_IRQHandler
52
     Insert_ExceptionHandler VADC0_G3_1_IRQHandler
53
     Insert_ExceptionHandler VADC0_G3_2_IRQHandler
54
     Insert_ExceptionHandler VADC0_G3_3_IRQHandler
55
     Insert_ExceptionHandler DSD0_0_IRQHandler
56
     Insert_ExceptionHandler DSD0_1_IRQHandler
57
     Insert_ExceptionHandler DSD0_2_IRQHandler
58
     Insert_ExceptionHandler DSD0_3_IRQHandler
59
     Insert_ExceptionHandler DSD0_4_IRQHandler
60
     Insert_ExceptionHandler DSD0_5_IRQHandler
61
     Insert_ExceptionHandler DSD0_6_IRQHandler
62
     Insert_ExceptionHandler DSD0_7_IRQHandler
63
     Insert_ExceptionHandler DAC0_0_IRQHandler
64
     Insert_ExceptionHandler DAC0_1_IRQHandler
65
     Insert_ExceptionHandler CCU40_0_IRQHandler
66
     Insert_ExceptionHandler CCU40_1_IRQHandler
67
     Insert_ExceptionHandler CCU40_2_IRQHandler
68
     Insert_ExceptionHandler CCU40_3_IRQHandler
69
     Insert_ExceptionHandler CCU41_0_IRQHandler
70
     Insert_ExceptionHandler CCU41_1_IRQHandler
71
     Insert_ExceptionHandler CCU41_2_IRQHandler
72
     Insert_ExceptionHandler CCU41_3_IRQHandler
73
     Insert_ExceptionHandler CCU42_0_IRQHandler
74
     Insert_ExceptionHandler CCU42_1_IRQHandler
75
     Insert_ExceptionHandler CCU42_2_IRQHandler
76
     Insert_ExceptionHandler CCU42_3_IRQHandler
77
     Insert_ExceptionHandler CCU43_0_IRQHandler
78
     Insert_ExceptionHandler CCU43_1_IRQHandler
79
     Insert_ExceptionHandler CCU43_2_IRQHandler
80
     Insert_ExceptionHandler CCU43_3_IRQHandler
81
     Insert_ExceptionHandler CCU80_0_IRQHandler
82
     Insert_ExceptionHandler CCU80_1_IRQHandler
83
     Insert_ExceptionHandler CCU80_2_IRQHandler
84
     Insert_ExceptionHandler CCU80_3_IRQHandler
85
     Insert_ExceptionHandler CCU81_0_IRQHandler
86
     Insert_ExceptionHandler CCU81_1_IRQHandler
87
     Insert_ExceptionHandler CCU81_2_IRQHandler
88
     Insert_ExceptionHandler CCU81_3_IRQHandler
89
     Insert_ExceptionHandler POSIF0_0_IRQHandler
90
     Insert_ExceptionHandler POSIF0_1_IRQHandler
91
     Insert_ExceptionHandler POSIF1_0_IRQHandler
92
     Insert_ExceptionHandler POSIF1_1_IRQHandler
93
     Insert_ExceptionHandler CAN0_0_IRQHandler
94
     Insert_ExceptionHandler CAN0_1_IRQHandler
95
     Insert_ExceptionHandler CAN0_2_IRQHandler
96
     Insert_ExceptionHandler CAN0_3_IRQHandler
97
     Insert_ExceptionHandler CAN0_4_IRQHandler
98
     Insert_ExceptionHandler CAN0_5_IRQHandler
99
     Insert_ExceptionHandler CAN0_6_IRQHandler
100
     Insert_ExceptionHandler CAN0_7_IRQHandler
101
     Insert_ExceptionHandler USIC0_0_IRQHandler
102
     Insert_ExceptionHandler USIC0_1_IRQHandler
103
     Insert_ExceptionHandler USIC0_2_IRQHandler
104
     Insert_ExceptionHandler USIC0_3_IRQHandler
105
     Insert_ExceptionHandler USIC0_4_IRQHandler
106
     Insert_ExceptionHandler USIC0_5_IRQHandler
107
     Insert_ExceptionHandler USIC1_0_IRQHandler
108
     Insert_ExceptionHandler USIC1_1_IRQHandler
109
     Insert_ExceptionHandler USIC1_2_IRQHandler
110
     Insert_ExceptionHandler USIC1_3_IRQHandler
111
     Insert_ExceptionHandler USIC1_4_IRQHandler
112
     Insert_ExceptionHandler USIC1_5_IRQHandler
113
     Insert_ExceptionHandler USIC2_0_IRQHandler
114
     Insert_ExceptionHandler USIC2_1_IRQHandler
115
     Insert_ExceptionHandler USIC2_2_IRQHandler
116
     Insert_ExceptionHandler USIC2_3_IRQHandler
117
     Insert_ExceptionHandler USIC2_4_IRQHandler
118
     Insert_ExceptionHandler USIC2_5_IRQHandler
119
     Insert_ExceptionHandler LEDTS0_0_IRQHandler
120
     Insert_ExceptionHandler FCE0_0_IRQHandler
121
     Insert_ExceptionHandler GPDMA0_0_IRQHandler
122
     Insert_ExceptionHandler SDMMC0_0_IRQHandler
123
     Insert_ExceptionHandler USB0_0_IRQHandler
124
     Insert_ExceptionHandler ETH0_0_IRQHandler
125
     Insert_ExceptionHandler GPDMA1_0_IRQHandler
126
     
127
/* ============= END OF INTERRUPT HANDLER DEFINITION ====================== */


Jim M. schrieb:
> Für die Source müsstest Du jetzt die Symbole der Applikation nachladen,
> der
> Default Handler ist aber oft in einem Assembler File deklariert.

Nachladen? Wie genau? Die müssten doch bereits im Flash liegen, oder?

Jim M. schrieb:
> Was Du überprüfen solltest sind die Linker Flags der Applikation. Wenn
> die flachsen Libs verlinkt wurden wäre das eine Ursache für einen Fault,
> man mus auch dem Linker den CPU Typ mitgeben.

Das müsste doch im linker script stehen oder? Finde da nichts :(

von Markus S (Gast)


Lesenswert?

Hallo,

vom Prinzip ist dein Linkerscript schon richtig.
Bei mir liegt der Bootloader in den ersten 64K. Und die Applikation ab 
0x8080000.

Wenn ich aus dem Bootloader die Applikation starten möchte, dann biege 
ich den internen Bootloader auf den "Alternative Boot mode" um (Siehe 
Kapitel: 26 "Startup modes" im Reference Manual)

Hier ein Beispiel wie ich es mache:
Zuvor noch den Sektor für "flash_abm0" im Linkerscript definieren usw.
Wenn du eine andere Startadresse benutzt, dann entsprechend die CRC32 
neu berechnen.


static const ABM_Header_t __attribute__((section(".flash_abm0"))) 
ABM0_Header=
{
    // 0x5AC3E10F (RM : Kap 26.2.5)
    .MagicKey = MAGIC_KEY,
    // Adresse ab der die Applikation liegt
    .StartAddress = 0x08080000,
    .Length = 0xFFFFFFFF,
    .ApplicationCRC32 = 0xFFFFFFFF,
    .HeaderCRC32 =  0xCBF94C7D
};


void StartApplication(void)
{
  SCU_RESET->RSTCLR = 1<<SCU_RESET_RSTCLR_RSCLR_Pos;

  WR_REG( SCU_GENERAL->STCON,
      SCU_GENERAL_STCON_SWCON_Msk,
      SCU_GENERAL_STCON_SWCON_Pos,
      SW_CONFIG_ABM0);

  PPB->AIRCR =  (1 << PPB_AIRCR_SYSRESETREQ_Pos)
          | (0x5FA<<PPB_AIRCR_VECTKEY_Pos)
          | (0x1 << PPB_AIRCR_PRIGROUP_Pos);
}


Gruss Markus

von Bubba L. (pic24h)


Lesenswert?

Markus S schrieb:
> Wenn ich aus dem Bootloader die Applikation starten möchte, dann biege
> ich den internen Bootloader auf den "Alternative Boot mode" um (Siehe
> Kapitel: 26 "Startup modes" im Reference Manual)

Ich habe auch mit dem Gedanken gespielt, es mit dem ABM Modus zu 
versuchen, aber habe es doch nicht probiert :(

Markus S schrieb:
> Hier ein Beispiel wie ich es mache:
> Zuvor noch den Sektor für "flash_abm0" im Linkerscript definieren usw.

Der Sektor für "flash_abm0" ist laut Reference Manual die letzten 32 
Bytes des PSRAMS. also von 0xFFFFFFF00 bis zum Ende. Ich werde es dann 
so definieren.
1
MEMORY
2
{
3
  FLASH_1_cached(RX) : ORIGIN = 0x08004000, LENGTH = 0x100000-0x4000
4
  FLASH_1_uncached(RX) : ORIGIN = 0x0C004000, LENGTH = 0x100000-0x4000
5
  PSRAM_1(!RX) : ORIGIN = 0x10000000, LENGTH = 0xFF00
6
  PSRAM_ABM (!RX) : ORIGIN = 0x1000FF00, LENGTH = 0x100
7
  DSRAM_1_system(!RX) : ORIGIN = 0x20000000, LENGTH = 0x10000
8
  DSRAM_2_comm(!RX) : ORIGIN = 0x30000000, LENGTH = 0x8000
9
}

Du hast den ABM aber im flash wie ich sehe??

Markus S schrieb:
> Wenn du eine andere Startadresse benutzt, dann entsprechend die CRC32
> neu berechnen.

Zur CRC Berechnung werde ich mal den Code ausm Infenion Forum 
verwenden... 
[http://www.infineonforums.com/threads/2114-Crc32?p=6561&viewfull=1#post6561]

Ein System Reset hast du ja nicht gebraucht,oder?

Danke für die Tipps. Werde es morgen früh mal testen.

: Bearbeitet durch User
von Bubba L. (pic24h)


Lesenswert?

Hallo zusammen,

bin erst heute wieder dazu gekommen an dem Bootloader weiter zu 
arbeiten.

Aktueller Status:

Ich habe mir jetzt den ABM Header erstellt.
Eine Frage zu den CRC Prüfsummen. Diese müssen ja auf den "leeren" 
Speicherbereich angewendet werden, also wenn noch keine Applikation über 
den Bootloader geladen wurde?

Der Header wird einmal an die Adresse 0x0C00FFE0 geflasht und gut is.
Jedoch wenn ich den internen Bootloader auf den Alternate Boot Mode 
umbiege, dann läuft was schief und der Mikrocontroller reagiert nicht, 
auch nicht auf einen system reset. Nach einem PORST ist dann wieder 
alles normal bis der interne Bootloader wieder auf den ABM Mode gebogen 
wird.

Ich nehme an dass der diagnostics monitor mode gestartet (RM: Kap 
26.2.6) wird weil der Stromverbauch sinkt, nachdem auf ABM gestellt 
wurde und ein system reset erfolgt. Der Header ist vermutlich corrputed.


Für die Berechnung habe ich folgende Funktionen (aus einem ABM 
Beispielcode von Infenion) verwendet
1
uword crc_gen (uword *data, uword size)
2
{
3
uword crc = 0xFFFFFFFF;
4
for(uword i=0; i<size; ++i) {
5
uword word = *(data+i);
6
uword feedback =
7
((crc & (1 << 31)) ? 1 : 0) ^
8
((crc & (1 << 30)) ? 1 : 0) ^
9
((crc & (1 << 29)) ? 1 : 0) ^
10
((crc & (1 << 27)) ? 1 : 0) ^
11
((crc & (1 << 26)) ? 1 : 0) ^
12
((crc & (1 << 24)) ? 1 : 0) ^
13
((crc & (1 << 23)) ? 1 : 0) ^
14
((crc & (1 << 21)) ? 1 : 0) ^
15
((crc & (1 << 20)) ? 1 : 0) ^
16
((crc & (1 << 19)) ? 1 : 0) ^
17
((crc & (1 << 15)) ? 1 : 0) ^
18
((crc & (1 << 9)) ? 1 : 0) ^
19
((crc & (1 << 8)) ? 1 : 0) ^
20
((crc & (1 << 5)) ? 1 : 0);
21
22
crc = ((word ^ ((crc & 0x7fffffff) << 1)) & 0xfffffffe) | (feedback ^ ((word & 1) ? 1 : 0));
23
}
24
25
return crc;
26
27
}
28
29
30
uword Calculate_WordSize (uword start, uword end)
31
{
32
uword size;
33
34
size = (end-start);
35
size = size >> 2;
36
37
return size;
38
}

Die Size der Applikation wurde mit folgenden Parametern berechnet.
1
size = Calculate_WordSize (0x0C080000, 0x0C010000)
2
crc_gen(0x0C080000,size);

und ABM Header habe ich berechnet mit
1
size = Calculate_WordSize (0x0C00FFE0, 0x0C00FFF8)
2
crc_gen(0x0C00FFE0,size);

Mein Fehler liegt womöglich daran dass ich bei Berechnen der crc nicht 
einen pointer auf die Daten übergeben habe. Im Beispiel wurde die start 
adresse wie folgt berechnet
1
start = (uword *)abm0[2];

Werde es morgen nochmal probieren.

@Markus S

Nach der Funktion StartApplication() muss ein SystemReset erfolgen, 
oder?
1
void StartApplication(void)
2
{
3
  SCU_RESET->RSTCLR = 1<<SCU_RESET_RSTCLR_RSCLR_Pos;
4
5
  WR_REG( SCU_GENERAL->STCON,
6
      SCU_GENERAL_STCON_SWCON_Msk,
7
      SCU_GENERAL_STCON_SWCON_Pos,
8
      SW_CONFIG_ABM0);
9
10
  PPB->AIRCR =  (1 << PPB_AIRCR_SYSRESETREQ_Pos)
11
          | (0x5FA<<PPB_AIRCR_VECTKEY_Pos)
12
          | (0x1 << PPB_AIRCR_PRIGROUP_Pos);
13
}

von Bubba L. (pic24h)


Lesenswert?

Habe es hinbekommen. Danke für eure Hilfe.

von W.S. (Gast)


Lesenswert?

Ein Nachtrag:

Lothar schrieb:
> Zur Info: die meisten ARM ausser XMC z.B. LPC, STM32 haben einen ROM
> (oder Flash Security Page) Bootloader. Das ROM wird als High Memory
> eingeblendet. Der User Code beginnt also unabhängig davon, ob ein
> Bootloader existiert oder nicht, bei 0 und beinhaltet die Vektortabelle.
> Somit müssen nicht verschiedene HEX gelinkt werden.

Tja. Diese XMC sind eben genau deshalb auf meiner privaten schwarzen 
Liste. Bei den M4 Varianten könnte man ja (vermutlichst) die 
Vektortabelle umverlegen, aber bei den M0 und M0+ geht das nicht, also 
ist man auf deren von DAVE generierten Krempel angewiesen - und das ist 
mir so unangenehm wie ne Kette am Nasenring und damit bei Infineon 
angeschmiedet.

W.S.

von Bernd K. (prof7bit)


Lesenswert?

W.S. schrieb:
> aber bei den M0 und M0+ geht das nicht

Bei allen Cortexen ab (inclusive) M0+ aufwärts kann man die 
Vektortabelle verlegen. Das ist ein Feature von ARM, nicht des 
Herstellers. Nur bei M0 bin ich mir nicht sicher ob das da auch geht.

: Bearbeitet durch User
von Leo (Gast)


Lesenswert?

Hallo,

das mit der CRC Berechnung für den ABM funktioniert bei mir ebenfalls 
nicht.
Welche CRC Funktion müsste ich dazu verwenden? Welche Übergabeparamter 
muss ich der CRC Funktion geben?

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.