Forum: Mikrocontroller und Digitale Elektronik STM32F103 HardFault wenn CRC


von donvido (Gast)


Lesenswert?

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.

von A. B. (Gast)


Lesenswert?

Die üblichen Verdächtigen sind:

1) In RCC_AHBENR das Bit CRCEN gesetzt? Clock für CRC

2) CRC-Register erlauben nur Word-Zugriff

von donvido (Gast)


Lesenswert?

CRCEN ist gesetzt.
Ein einfaches
1
CRC->DR=0;
liefert bereits einen HardFault.

von A. B. (Gast)


Lesenswert?

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.

von donvido (Gast)


Lesenswert?

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.

von Pandur S. (jetztnicht)


Lesenswert?

Allenfalls hat die Entwicklungsumgebung einen Simulator, der Singlestep 
kann, eingebaut ?

von A. B. (Gast)


Lesenswert?

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;'.

von Jim M. (turboj)


Lesenswert?

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...

von donvido (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.