mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EFM32 UART DMA


Autor: bubi_00 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe hier vor mir ein EFM32 DVK liegen.
Aktuell versuch ich den DMA-Controller für ein UART Protokoll zum laufen 
zu kriegen. Das ganze läuft in einer RTX Umgebung und demnach in Keil 
µVision.

Aufgabe:

Ich schicke ein Startzeichen (0x1F) und starte danach einen DMA Transfer 
mit fester Länge (6 Bytes immo) und disable den UART Interupt. In der 
Callback-Function, löse ich ein Event aus und der Task verarbeitet die 
Daten. Danach aktiviere ich wieder den UART Interrupt und warte auf das 
Startzeichen. Funktioniert soweit auch schon.

Mein Problem ist, dass nach dem ersten Telegram:
-der UART Interrupt kommt
-das Startzeichen erkannt wird
-der DMA Transfer gestartet wird
-die Daten im Speicher landen (mit Debugger)
-der DMA_IRQ für vollständigen Transfer ausgelöst wird
-ABER NICHT die Callback-Function angesprungen wird...Die Adresse im 
CB-Descriptor ändert sich!

Ich konnte mittels Debugger folgendes feststellen:

aus der efm32_dma.h und dort ein Teil aus dem IRQ Handler
        /* Normally, no point in enabling interrupt without callback, but */
        /* check if callback is defined anyway. Callback info is always */
        /* located in primary descriptor. */
        cb = (DMA_CB_TypeDef *)(descr[channel].USER);
        if (cb)
        {
          /* Toggle next-descriptor indicator always prior to invoking */
          /* callback (in case callback reconfigurs something) */
          primaryCpy   = cb->primary;
          cb->primary ^= 1;
          if (cb->cbFunc)
          {
            cb->cbFunc(channel, (bool) primaryCpy, cb->userPtr);
          }
        }
      }

der CB Descriptor zeigt auf die richtige Adresse:
(beim ersten Aufruf, wo der Sprung zur CallBackfuntion geht)

cb:
-> 0x20001234
cbFunc:
->0x00002011 (Im Treiber im Anhang ist das die DMA_checkByte Routine)

beim zweiten Aufruf wo es nicht mehr geht:
cb:
->0x20001234
cbFunc:
->0x0000182D

Im Speicher kann ich sehen das sich die Adresse beim Sprung in die 
Callback Funktion ändert...das heißt wenn ich im Singelstep das Programm 
durchlaufe, bewirkt die erste Aktion in der cbFunction eine änderung des 
Pointers...obwohl ich sowas natürlich nicht will...

Woran scheiterts?
Ich hoffe es kann mir wer weiterhelfen

Autor: bubi_00 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich vergessen habe:

0x00002010 B570      PUSH     {r4-r6,lr}
0x00002012 4604      MOV      r4,r0
0x00002014 460D      MOV      r5,r1
0x00002016 4616      MOV      r6,r2

Das steht dort an der Adresse!

r4: 0x20001234
r5: 0x00000000
r6: 0x00000001
lr: 0x0000182D !!!!!!!!!!!

Was macht das Ding hier? :(

Autor: bubi_00 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Selbstgespräch, Frage im Startpost ändert sich in:

Wenn ich "cb" als static definiere...warum gehts dann?
(...das heißt es geht jetzt, wüsste aber noch gerne warum)

Schöne Grüße

Autor: Tante Käthe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal hier versucht?
Meine letzte Frage wurde in 1 Tag beantwortet.

http://support.energymicro.com/home

Viel Erfolg ...

TK

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.