Hallo miteinander, Ich wollte eigentlich gerne an einem STM32F103CBT6 die CRC-unit nutzen. Wenn ich aber z.B. auf CRC->DR oder CRC->CR schreiben will bekomme ich einen HardFault. Woran liegt das? Im Reference Manual steht: Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes. Da sollte das doch eigentlich unterstützt werden.
Die üblichen Verdächtigen sind: 1) In RCC_AHBENR das Bit CRCEN gesetzt? Clock für CRC 2) CRC-Register erlauben nur Word-Zugriff
CRCEN ist gesetzt. Ein einfaches
1 | CRC->DR=0; |
liefert bereits einen HardFault.
Auf einem STM32F103C8T6 geht das problemlos: > reset halt target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x0800018c msp: 0x20005000 > mdw 0x40021014 0x40021014: 00000014 > mdw 0x40023000 3 0x40023000: 00000000 00000000 00000000 > mww 0x40021014 0x54 > mdw 0x40021014 0x40021014: 00000054 > mdw 0x40023000 3 0x40023000: ffffffff 00000000 00000000 > mww 0x40023000 0xA5A5A5A5 > mdw 0x40023000 3 0x40023000: 29928e70 00000000 00000000 Vor dem Einschalten des Takts liest man aus den CRC-Registern 00000000 00000000 00000000, nach dem Einschalten wie zu erwarten ffffffff 00000000 00000000, und schreiben geht auch, die CRC-Einheit gibt's also ... Da macht offenbar der Compiler, Linker, ... Mist.
A. B. schrieb: > nach dem Einschalten wie zu erwarten ffffffff Das kann ich bestätigen. Ist bei mir auch so. Ich bin in ASM nicht so fit aber vielleicht könnt ihr damit was anfangen?
1 | 20 data->crc = 0; |
2 | 08002ad2: movs r3, #0 |
3 | 08002ad4: str.w r3, [r0, #748] ; 0x2ec |
4 | 21 CRC->DR=0; |
5 | 08002ad8: ldr r2, [pc, #40] ; (0x8002b04 <checkCRC(data*)+56>) |
6 | 08002ada: str r3, [r2, #0] |
7 | 22 CRC->CR = CRC_CR_RESET; |
8 | 08002adc: movs r4, #1 |
9 | 08002ade: str r4, [r2, #8] |
Zeile 20 wird noch ausgeführt, aber bei Zeile 21 gibts dann Probleme.
Allenfalls hat die Entwicklungsumgebung einen Simulator, der Singlestep kann, eingebaut ?
0x08002ad8 + 4 + 40 ist 0x8002b04, das stimmt. Wenn in 0x8002b04 tatsächlich die richtige Adresse (0x40023000) steht, kann es nicht dieser Schreibzugriff sein. Der Offset 8 für CRC_CR ist ja auch richtig ... Da liegt die Vermutung nahe, dass die Ursache knapp davor liegt, also z. B. beim 'data->crc = 0;'.
donvido schrieb: > Zeile 20 wird noch ausgeführt, aber bei Zeile 21 gibts dann Probleme. Man kann auch instruktionsweise debuggen, dann lassen sich Fehler leichter eingrenzen. Eventuell kommt wegen dem Schreibpuffer der Hardfault eine Instruktion zu spät an, schau mal nach wo data hin zeigt. Nicht das einfach nur dieser Pointer in den Wald zeigt...
A. B. schrieb: > Da liegt die Vermutung nahe, dass die Ursache knapp davor liegt, also z. > B. beim 'data->crc = 0;'. Das wars. data zeigt auf den Flash und da kann ich nicht mal so eben schreiben. Vielen Dank
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.