Forum: Mikrocontroller und Digitale Elektronik [ GELÖST ] Stm32 Cortex-M3 -> Hardfault beim lesen der Peripherie?


von Johannes V. (johannes_v)


Lesenswert?

Hallo und einen wunderschönen,

ich bin jetzt schon ein paar Stunden am grübeln und debugg, aber ich 
komme einfach nicht drauf was da passiert. Ich dachte erst es gäbe ein 
Problem mit schreiben an böse Adressen, aber der Sprung in den Hardfault 
geschieht beim letzten ldrh. R3 hat dabei den Wert 0x40026008, das DMA1 
Kanal1 Konfigurationsregister.

Über die IDE kann ich dort auch einzelne Bits setzen, sie werden auch 
gesetzt und im memorywatch passend angezeigt. Clock ist natürlich auch 
eingeschaltet. Andere Peripherie habe ich auch schon gelesen und 
geschrieben.

bin für jede Hilfe dankbar :)
1
this = 0x40026000, chan = 0, irq = 0x4 
2
void DMA::enable(eChannel chan, eInterrupt irq) {
3
  channel_[chan].configuration_ |= (irq & 0b1110);
4
}
5
    B480        push {r7}
6
    B083        sub sp, sp, #12
7
    AF00        add r7, sp, #0
8
    6078        str r0, [r7, #4]
9
    4613        mov r3, r2
10
    460A        mov r2, r1
11
    70FA        strb r2, [r7, #3]
12
    70BB        strb r3, [r7, #2]
13
    78FA        ldrb r2, [r7, #3] r2 = 0x0
14
    78F9        ldrb r1, [r7, #3] r1 = 0x0
15
    6878        ldr r0, [r7, #4]  r0 = 0x40026000
16
    460B        mov r3, r1        r3 = 0x0
17
    EA4F0383    lsl.w r3, r3, #2  r3 = 0x0
18
    185B        adds r3, r3, r1   r3 = 0x0
19
    EA4F0383    lsl.w r3, r3, #2  r3 = 0x0
20
    18C3        adds r3, r0, r3   r3 = 0x40026000
21
    F1030308    add.w r3, r3, #8  r3 = 0x40026008
22
    881B        ldrh r3, [r3]


[Lösung]
Ich habe nochmal gedebuggt mit eingestellter optimisierung. Dabei wurden 
die LDR Befehle ausgeführt und es zeigte sich, dass der DMA den 
Halbwortzugang nicht mag. Register wurden dann als 0x0000AAAA ausgelesen 
und ziemlicher Murks zurückgeschrieben.
Ich dachte die ganze Peripherie kann sogar Bytewise beschrieben werden. 
Naja, so kann man sich täuschen.

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.