Forum: Mikrocontroller und Digitale Elektronik STM32F303 SPI-DMA-Kommunikation Interrupts zeitweise sperren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich nutzte den STM32F303 Microcontroller. Dieser soll per SPI und DMA 
Daten empfangen und senden. Zur Zeit werden die Funktionen der HAL 
Bibliothek genutzt. Hauptsächlich die Funktion

HAL_SPI_TransmitReceive_DMA

Nach Abschluss des Empfangs- und Sendezyklus wird eine Callbackfunktion 
aufgerufen.In Callbackfunktion befindet sich eine Zustandsmaschine, 
welche die Länge des nächsten Nachrichtenzykluses festlegt und den 
Sendebuffer mit neuen Daten füttert.

Nun zu meiner Frage. Die Kommunikation funktionirt soweit. Jedoch ist 
die Callbackfunktion ein kritischer Abschnitt. Dieser soll geschützt 
werden damit kein Interrupt dazwischenfunken kann.

Besteht die Möglichkeit es elegater zu lösen als die kompletten 
Peripherie Interrupts zu sperren (UART,ADC,DAC,...).

vielen Dank im vorraus.

von Schang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Dieser soll geschützt werden damit kein Interrupt dazwischenfunken kann.

"Geschützt" gegen was?

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Nun zu meiner Frage. Die Kommunikation funktionirt soweit. Jedoch ist
> die Callbackfunktion ein kritischer Abschnitt. Dieser soll geschützt
> werden damit kein Interrupt dazwischenfunken kann.
>
> Besteht die Möglichkeit es elegater zu lösen als die kompletten
> Peripherie Interrupts zu sperren (UART,ADC,DAC,...).

Es darf keinerlei ISR angesprungen werden - welche Lösung wäre also 
eleganter, als für diese Zeit alle Interrupts via "CPSIE I" zu sperren?



Allerdings könnte es eleganter sein, die Originalvorgabe zu ändern, 
statt generell alle Interrupts zu verbieten...

von Martin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Marcus H. schrieb:
> Es darf keinerlei ISR angesprungen werden - welche Lösung wäre also
> eleganter, als für diese Zeit alle Interrupts via "CPSIE I" zu sperren?

Ich muss gestehen, dass mir die Funktion mit CPSIE I nicht bekannt war. 
Ich habe es getestet und es funktioniert so wie es soll, Danke.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Marcus H. schrieb:
>> Es darf keinerlei ISR angesprungen werden - welche Lösung wäre also
>> eleganter, als für diese Zeit alle Interrupts via "CPSIE I" zu sperren?
>
> Ich muss gestehen, dass mir die Funktion mit CPSIE I nicht bekannt war.
> Ich habe es getestet und es funktioniert so wie es soll, Danke.

Ah, ok. Freut mich, dass ich Dir helfen konnte.
Vielleicht magst Du gelegentlich mal die RMxxx und PMxxx, sowie die 
ARM-Core-Doku für Deinen Controller lesen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.