STM32F373 Interrupts

OP (Firma: Frankfurt) #4102227
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
Gast #4102236
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.
OP (Firma: Frankfurt) #4102273
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren