Forum: Mikrocontroller und Digitale Elektronik STM32F373 Interrupts


von Felix E. (Firma: Frankfurt) (felix9de)


Lesenswert?

Hallo,
Mein Programm soll 12 ADC Kanäle abtasten und mittels des 
DMA-Controllers in ein Array im Speicher transferieren. Ich möchte zwei 
Interrupts auslösen: Bei der Hälfte der Transfers und dann, wenn alle 
Transfers stattgefunden haben.

Ich benutzt den Debugger von der IAR Embedded Workbench. Dort sieht es 
so aus, als würden die Interrupts zur gleichen Zeit stattfinden, da alle 
Flags zum gleichen Zeitpunkt von 0 auf 1 wechseln. Jetzt habe ich 
erfahren, dass ich mich nicht auf den Debugger verlassen kann, weil der 
DMA-Controller schneller als der Debugger ist.

Wie kann ich nun prüfen, ob alles so vonstatten geht, wie ich mir das 
vorstelle?

Ich habe schon einen Forumeintrag direkt bei STMicroelectronics erstellt 
mit meinem Code, falls jemand diesen sehen will: 
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fCode%20Question&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=40

von Marcus W. (marcusaw)


Lesenswert?

Setz einen unbenutzten Pin auf High in der Mitte und auf Low am Ende und 
klemm ein Oszilloskop an. Da hast du dann eine genau Zeitbasis.

von holger (Gast)


Lesenswert?

>Wie kann ich nun prüfen, ob alles so vonstatten geht, wie ich mir das
>vorstelle?

OMG.

Variable nehmen und Null setzen.
Bei HalfInt ein Bit setzen.
Bei VollInt noch ein Bit setzen.
Debugger und Variable lesen.

von Felix E. (Firma: Frankfurt) (felix9de)


Lesenswert?

Marcus W. schrieb:
> Setz einen unbenutzten Pin auf High in der Mitte und auf Low am Ende und
> klemm ein Oszilloskop an. Da hast du dann eine genau Zeitbasis.

Vielen Dank für die schnelle Antwort. Ich habe leider kein Oszilloskop 
zur Verfügung. Gibt es noch einer andere Möglichkeit?

holger schrieb:
> Variable nehmen und Null setzen.
> Bei HalfInt ein Bit setzen.
> Bei VollInt noch ein Bit setzen.
> Debugger und Variable lesen.

Auch dir vielen Danke für die schnelle Antwort. So einfach ist es leider 
nicht, oder ich stelle mich bisschen zu blöd an.
Genau das, was du vorschlägst, habe ich auch probiert. Dabei habe ich 
folgendes Problem:

Wenn ich den DMA Vorgang mit einer bestimmten Anzahl von Transfers genau 
einmal durchlaufen lasse, geht der Debugger ein einziges Mal in die 
Interrupt Service Routine rein. Zu diesem Zeitpunkt ist das Array in der 
Debugger Ansicht schon komplett gefüllt und beide Flags (half and full 
transfer) sind gesetzt. Also werden beide Zählvariablen auf einmal 
erhöht. Ich kann so aber nicht erkennen, ob ich einen Grundlegenden 
Fehler gemacht habe oder ob der Debugger "lügt". Mir wurde bei STM 
nämlich gesagt, dass der Debugger den ADC/DMA Vorgang nicht anhält... 
Deswegen frage ich mich jetzt, wie ich das prüfen kann.

P.S.: Ich habe schon ein paar Tage mit dem Problem zu kämpfen und schon 
ein paar verschiedene Implementierungen gefunden, die eine ähnliche 
Funktion haben. Mein Code sieht fast genauso aus, mit dem einzigen 
Unterschied, dass ich nicht nur den "transfer complete interrupt", 
sondern auch den "half transfer interrupt" behandeln will. Außerdem ist 
das auch das erste Mal, dass ich einen Mikrocontroller programmiere.

von Zeit (Gast)


Lesenswert?

Kannst du die AD Wandlung oder den DMA ausbremsen? Man könnte den Takt 
reduzieren oder mehr Wandlungen anfordern.
Das Ganze damit genug Zeit für den Eintritt in die ISR bleibt.

von Little B. (lil-b)


Lesenswert?

Meine spontane Idee: Hardware Timer verwenden.

Starte den Timer zusammen mit dem ADC Vorgang und speichere Timestamps 
in den jeweiligen ISRs

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.