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.