stm32 gpio zu dma

Ich habe ein paar Fragen zur Verwendung des DMA des stm32f7-Boards (Nucleo F722ZE).

1) Um zu beginnen, erkläre ich, was ich tue:

Ich muss Daten von 2 GPIO-Pins (ADC) lesen und bekomme ein Taktsignal von dem Gerät, das die Daten liefert, an den stm32f7. Ich plane, das Taktsignal einen Interrupt-Timer auslösen zu lassen, und wann immer der Timer ausgelöst wird, möchte ich, dass der DMA eine Übertragung vom Speicher zum Peripheriegerät durchführt. Der Speicher beträgt 2 Bit am GPIO-Port, wobei das Peripheriegerät eine SPI-Leitung ist, die mit einer SD-Karte gekoppelt ist.

2) Zugriff auf die Daten:

Ich habe auf das Arm Cortex 7-Handbuch verwiesen und Folgendes gefunden:

Der GPIOC-Port wird auf 0x40020800 - 0x40020BFF abgebildet und die Eingangsdatenregister werden auf einen Offset von 0x14 gesetzt .

Also nehme ich das speicherabgebildete Basisregister (0x40020800 und füge 0x14 hinzu). Daher ist die Quelladresse, die ich dem DMA liefere, 0x40020814?

3) Veranlassen, dass der DMA diese Daten herausschiebt.

Das dürfte das größere Problem sein. Sobald ich die Daten an den GPIO-Pins habe, empfange ich sie im Wesentlichen Bit für Bit und die Daten sind tatsächlich 24 Bit lang, pro Pin. Insgesamt erhält also jeder GPIO-Pin 24-Bit-Datenpakete. Wenn das externe Signal den Timer auslöst, habe ich jedoch nur ein Bit an jedem der GPIOs.

Gibt es eine Möglichkeit, dass der DMA die Daten Bit für Bit selektiv herausziehen kann, bis alle 24 Bits vorhanden sind, und sie dann über die SPI senden kann. Verwenden Sie eine Art Puffer- und Burst-Übertragung? Ansonsten scheint der DMA mindestens eine Byte-Übertragung durchführen zu können, was erfordert, dass ich für jedes Bit, das ich übertrage, riesige Mengen an Müllbits senden muss.

Abschließend: Zusammenfassend bin ich mir nicht sicher, wo sich die GPIO-Daten befinden. Ist die Adresse, die ich eingegeben habe, korrekt, und ich bin mir völlig unsicher, wie ich diese Daten über den DMA übertragen soll?

Jede Hilfe wird geschätzt!

Antworten (3)

  1. GPIO ist nicht der ADC. Ich verstehe nicht was du meinst. Wenn es sich um einen externen ADC handelt, überträgt er ihn wahrscheinlich über Standardschnittstellen wie I2C oder SPI. Wenn Sie die analogen Daten lesen möchten, müssen Sie dann den internen ADC verwenden
  2. Sie haben alles in den CMSIS-Headern definiert. An die physikalischen Adressen brauchen Sie nicht zu denken. Sie werden auf diese Weise auf die GPIO-Register zugreifen: GPIOA -> MODERzum Beispiel. Es gibt alle Bit-Definitionen auch in der für Menschen lesbaren Form.
  3. DMA überträgt keine Bits, sondern Bytes, Halbwörter oder Wörter. Aber Sie müssen überlegen, wie Sie sie intelligenter lesen können als Ihre ursprüngliche Idee. Da Sie nicht geschrieben haben, welches Gerät angeschlossen ist, kann ich Ihnen nicht weiter helfen.
  4. Mein Rat - beginnen Sie mit etwas Einfacherem - lernen Sie, wie Sie CMSIS und die Peripheriegeräte in Ihrem Mikro verwenden. Ich bin mir zu 100% sicher, dass Sie einen der Standardtypen verwenden können: I2C, SPI oder U(S)ART dafür ohne Bitreading vom GPIO

1) Das klingt nach SPI . Haben wir ein XY-Problem ?

2) Sie benötigen die GPIO port input data register (GPIOx_IDR) (x = A..K), die sich am Offset 0x10 vom Basis-GPIO-Peripheriegerät befindet. Die Basisadresse jedes Peripheriegeräts finden Sie im stm32f7-Header oder in Tabelle 1 des Referenzhandbuchs. (RM0385: Tabelle 1) Sie können auf GPIO-Register im Wort-, Halbwort- oder Byte-Modus zugreifen. (RM0385: 6.4) Hinweis: Sie können nicht auf alle Peripheriegeräte in allen Breiten zugreifen.Tabelle 1. STM32F75xxx- und STM32F74xxx-Registergrenzadressen (Fortsetzung)

3) Es ist nicht der effizienteste Weg mit dem DMA, die Bitrate wäre niedrig (kHz), aber es ist möglich.

  1. Lassen Sie den DMA das Byte beim Triggern in den Speicherpuffer lesen (zirkular). (oder Wörter, wenn die GPIOs weit voneinander entfernt sind)
  2. Bei DMA Complete/Half IRQ das Wort aus dem DMA-Puffer zusammenstellen. Es wäre schön, wenn Sie Bitbanding hätten, aber das fehlt dem Cortex M7.
  3. Verarbeite das Wort. Vorzugsweise in einer anderen Funktion, um die Bitbanging-Schicht von der Datenverarbeitung getrennt zu halten.

Das Ausgeben von Bits mit DMA funktioniert genauso, außer dass Sie das verwenden müssen, GPIO port bit set/reset register (GPIOx_BSRR) (x = A..K)um irrelevante IO nicht zu ändern.

Das Problem ist, dass 2 Bits gleichzeitig eingehen, ein einzelner SPI-Controller kann das nicht verarbeiten.
@berendi Sie haben zwei synchronisierte ADCs, die extern getaktet sind und Daten zuführen? Wenn ja, warum nicht zwei Spis oder vielleicht DFSDM verwenden?

eine SPI-Leitung, die mit einer SD-Karte gekoppelt ist

Der STM32F722ZEverfügt über dedizierte SDMMC-Schnittstellen, die deutlich schneller als SPI sind, insbesondere wenn Sie alle 4 Datenpins anschließen.

Also nehme ich das speicherabgebildete Basisregister (0x40020800 und füge 0x14 hinzu). Daher ist die Quelladresse, die ich dem DMA liefere, 0x40020814?

Das wäre in Ordnung, wenn Sie die Adresse richtig verstanden hätten ( IDRis at offset 0x10), aber es wäre noch besser, die Definitionen aus den Standard-Headern zu verwenden

DMAx->SyPAR = (uint32_t)&(GPIOC->IDR);

und dann wäre es für jeden, der sich Ihren Code ansieht, offensichtlich, worum es bei diesem Stück Code geht. Außerdem hilft es, Fehler bei der Adressberechnung zu vermeiden.

Gibt es eine Möglichkeit, dass der DMA die Daten Bit für Bit selektiv herausziehen kann, bis alle 24 Bits vorhanden sind, und sie dann über die SPI senden kann.

Verbinden Sie jede Datenleitung mit einem anderen SPI-Controller (es gibt 5 davon), verbinden Sie die Taktleitung mit beiden. Lassen Sie sie jeweils einen 256-Byte-Puffer (mit DMA) nebeneinander füllen, um den SD-Controller mit einer Blockgröße von 512 Bytes zufrieden zu stellen (2 * 2048-Byte-Puffer können noch besser sein). Wenn die Puffer voll sind, schreiben Sie den gesamten Block auf die Karte, während die SPI-DMA-Kanäle automatisch auf sekundäre Puffer an einer anderen Adresse umschalten können. Möglicherweise möchten Sie mehr als 2 abwechselnde Puffer verwenden, um Dateisystemaktualisierungen zu ermöglichen, falls Sie welche verwenden (FATFS kann die Aktualisierung der FAT-Tabelle schmerzhaft langsam machen). Ich nehme an, Sie können die Bits später wieder zusammensetzen, wenn Sie die Daten tatsächlich verarbeiten.