2017-11-22 1 views
0

Ich implementiere Peripheriegeräte, die auf STM32F4 ablegen. Ich lese die meisten Peripheriegeräte Byte für Byte und spüe sie über die UART-Schnittstelle. Es funktioniert gut für fast jedes Peripheriegerät.Hardfault beim Versuch, die nicht ausgerichtete DMA-Registeradresse auf STM32F4 zu lesen

Wenn ich versuche, die DMA1 (0x40026000 ...) oder DMA2 (0x40026400 ...) registriert Byte-für-Byte- es bei 0x40026401 mit präzisen Busfehler nicht zu lesen.

Wenn ich versuche, es auf 4-Byte-Wörter ausgerichtet zu lesen, funktioniert es gut.

Meine Frage ist: Warum scheitert es auf DMA, während alle anderen Peripheriegeräte wie SCB, RCC, SPI, UART, TIM und andere mir erlauben, es zu tun? Gibt es dafür einen bestimmten Grund?

+0

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

+0

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

+0

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

Antwort

1

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.

+0

So wie ich das Zitat aus dem Handbuch gelesen habe, sind die Zugriffe * durch den DMA * von der MPU nicht betroffen.Ich denke, dieser Absatz hat nichts mit dem OP-Problem zu tun, da er die DMA-Steuerregister von der CPU liest. – PaulR

+0

@PaulR: Für den ersten Teil des Zitats - ja. Aber der zweite Teil des Zitats bezieht sich ausdrücklich auf "SW-Zugriff auf die DMA-Register" (wenn ich das Zitat zitieren darf). – goodvibration

+1

Das [Referenzhandbuch] (http://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files /DM00031020.pdf/jcr:content/translations/de.DM00031020.pdf) bestätigt Ihre erste Schätzung: "Der AHB-Slave-Port wird zur Programmierung des DMA-Controllers verwendet (er unterstützt nur 32-Bit-Zugriffe )" – PaulR

Verwandte Themen