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!
GPIOA -> MODER
zum Beispiel. Es gibt alle Bit-Definitionen auch in der für Menschen lesbaren Form.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.
3) Es ist nicht der effizienteste Weg mit dem DMA, die Bitrate wäre niedrig (kHz), aber es ist möglich.
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.
eine SPI-Leitung, die mit einer SD-Karte gekoppelt ist
Der STM32F722ZE
verfü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 ( IDR
is 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.
folgte Monica zu Codidact
Jeroen3