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
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()
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
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.
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.
Hier ein Screenshot der beiden Adressen vom Flash
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.
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.
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 :(
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
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
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 | }
|
Habe es hinbekommen. Danke für eure Hilfe.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.