Meine Vermutung wäre, dass der Bus zwischen der CPU und dem DMA-Controller nur 32-Bit-Zugriffe ermöglicht.
Sie können innerhalb des Hard-Fault-Interrupts drucken (oder in den Speicher ausgeben).
Was Sie drucken (oder ablegen) müssen, sind die CPU-Register, insbesondere diejenigen, die Ihnen einen besseren Hinweis auf das Problem geben.
Zum Beispiel:
void HardFault_Handler(unsigned int* hardfault_args)
{
printf("R0 = 0x%.8X\r\n",hardfault_args[0]);
printf("R1 = 0x%.8X\r\n",hardfault_args[1]);
printf("R2 = 0x%.8X\r\n",hardfault_args[2]);
printf("R3 = 0x%.8X\r\n",hardfault_args[3]);
printf("R12 = 0x%.8X\r\n",hardfault_args[4]);
printf("LR = 0x%.8X\r\n",hardfault_args[5]);
printf("PC = 0x%.8X\r\n",hardfault_args[6]);
printf("PSR = 0x%.8X\r\n",hardfault_args[7]);
printf("BFAR = 0x%.8X\r\n",*(unsigned int*)0xE000ED38);
printf("CFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED28);
printf("HFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED2C);
printf("DFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED30);
printf("AFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED3C);
printf("SHCSR = 0x%.8X\r\n",SCB->SHCSR);
while (1);
}
Oder Sie können einfach innerhalb der Festfehlerunterbrechung stoppen, und diese Register in Ihrem IDE sehen ...
Von STM32F4 Datenblatt:
The MPU attributes don't affect DMA data accesses to the memory/peripherals address
spaces. therefore, in order to protect the memory areas against inadvertent DMA accesses,
the MPU must control the SW/CPU access to the DMA registers.
So sieht es aus, als gäbe es einige Einschränkungen speziell im Hinblick auf den Zugriff auf DMA-Register.
Antwort von OP erweitert nach paulr Kommentar:
Dokumentation Grab bestätigt, dass Grund ist eine Einschränkung der DMA-AHB-Slave-Programmierschnittstelle.
In DM00031020 Kapitel 10.2 DMA Hauptmerkmale es ist klar geschrieben "AHB Slave-Programmierschnittstelle unterstützt nur 32-Bit-Zugriffe". Im Gegensatz dazu, z.B. DMA2D unterstützt 8-Bit-, 16-Bit- und 32-Bit-Zugriffe, daher kann Byte für Byte zugegriffen werden und es tritt kein Busfehler auf.
Sie können einen Ausdruck (oder einen Speicherauszug in einem lokalen Array) innerhalb des Hard-Fault-Interrupts platzieren. Was Sie drucken (oder ausgeben) müssen, sind die CPU-Register, insbesondere diejenigen, die Ihnen einen besseren Hinweis auf das Problem geben. Meine Vermutung - der Bus zwischen der CPU und dem DMA-Controller erlaubt nur 32-Bit-Zugriffe. – goodvibration
Danke, für den Vorschlag. Ich habe das bereits überprüft - Bus Fault Status Register zeigt auf einen präzisen Busfehler bei 0x40026401, der eine unausgerichtete Adresse 1 Byte nach dem Beginn des DMA-Bereichs ist. Es sieht so aus, als ob es unmöglich ist, es in unkoordinierter Weise zu lesen, und ich versuche zu verstehen, warum, da alle anderen Peripheriegeräte diesen Ansatz akzeptieren. – jedzej
OK, ich habe das als Antwort gepostet und nun einige Informationen aus dem Datenblatt, speziell zu DMA, hinzugefügt, die mehr Licht in das Thema bringen könnten. – goodvibration