32x32 RGB LED Plasma w / STM32F4.

7 Schritt:Schritt 1: Anschließen des RGB LED Matrix zu der STM32F401RE. Schritt 2: Gestalten Sie Ihre BSP mit STM32Cube. Schritt 3: Was der Display-Treiber tun wird. Schritt 4: Interrupts, SPI und DMA, Uhren, GPIOs. Schritt 5: V-Sync und Pufferschalt. Schritt 6: Die Plasma-Effekt. Schritt 7: Setzen sie alle zusammen.

32x32 RGB LED Plasma w / STM32F4.

32x32 RGB LED Plasma w / STM32F4.

Es gibt schon ein paar Tutorials gibt, die, wie man ein 32x32 RGB-LED-Anzeige steuern.
Dieses Projekt hat einige geringfügige Abweichungen mit den folgenden Merkmalen:
Auf der Grundlage einer STM32F401RE Eval Board Software BSP durch STM32CubeMX (v1.4.0 hier verwendeten neueren Version könnte Veränderungen im Quellcode müssen) Eingebauter mit Eclipse Pixeldaten über SPI gefüttert (Weniger Kabel zu laufen) hohe Bildwiederholungsrate, anstatt sich erzeugt ein PWM-Zyklus auf jeder einzelnen Zeile (für eine stetige Bild) Nur 16 Helligkeitsstufen pro Farb obwohl Old skool Plasma-Effekt zu Demonstrationszwecken
Die einzige Quellcode bereitgestellt wird ein Patch auf die automatisch generierte STM32CubeMX Dateien sowie die Eclipse-Projekt.
Benötigte Software:
Windows (yeah, leid. Aber STM32CubeMX läuft in Windows) STM32CubeMX STM32F4 DSP und Standardperipherie Bibliothek GCC ARM Embedded (zB 4,9 bis 2014-Q4) OpenOCD 0.8.0 Git für Windows Eclipse-

Schritt 1: Anschließen des RGB LED Matrix zu der STM32F401RE.

  1. 32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    Alle 9 Artikel anzeigen

    Die 32x32-Display verfügt über zwei 16-Stiftleisten sowie einen 4-Pin-Anschluss. Der Netzanschluss erfolgt wie gewohnt, wahrscheinlich mit dem mitgelieferten Stecker.
    Der Header 'INPUT' beschriftet wird verwendet, um die Pixeldaten und Leitungsauswahl zu liefern. Der Header 'outpu' kann Kette mehrere Displays zusammen verwendet werden. Da wir um eine einzelne Draht und die SPI-Treiber verwenden, um Anzeigedaten an zwei ausgewählten Linien bei versorgen wollen nur einmal gibt es einige kreative Verkabelung notwendig.
    Die Anzeige-Elektronik besteht hauptsächlich aus Schieberegister mit einem gemeinsamen Takt und Anodentreiber, die derzeit betrieben Linien wählen. Es gibt immer zwei Zeilen auf einmal angetrieben, und die 32 * 3 = 96 LEDs pro Zeile sind individuell durch die Schieberegister ausgelöst.
    Im Idealfall liefern Ihnen 6-Bit-Datenströme auf R0, G0, B0, R1, G1, B1 und laden Sie die Schieberegister mit dem gemeinsamen Takt. Verwendung STB, Sie dann die Daten der Schieberegister an die Ausgänge verriegeln, um die LEDs zu treiben. Es gibt auch ein Ausgangsfreigabesignal, bezeichnet mit 'OE', dass Sie verwenden, um keine Nebenwirkungen beim Wechsel Linien und Zwischenspeichern von Daten. Aber dazu später mehr ...
    Die 'OUTPUT' Überschriften in der Tat trägt die serielle Datenausgabe der Schieberegister; nur vorstellen, es als das letzte Stück, das aus dem Schieberegister am letzten Takt wurde fallengelassen. Also, wenn Sie zB auf Kette zwei Anzeigen zusammen möchten, können Sie bis 64 Taktzyklen von Daten benötigen würde, während das erste Bit in dem Bitstrom das letzte LED sein, ausgelöst werden, und das letzte Bit wäre der erste LED in der Reihe sein, .
    Hier wollen wir nur auf eine Anzeige und den Wunsch nach einer minimalen Menge Drähte. Also zurück zu den Eingängen verbinden wir die Ausgänge. In der Tat wir tun:
    out R0 -> in G0 G0 out -> in B0 aus B0 -> in R1 aus R1 -> in G1 aus B1 -> in B1
    Wir werden den Eingang für R0 für den Bitstrom zu verwenden. Mit diesem Setup, müssen wir je zwei Linien streamen 32 * 3 * 2 = 192 Bit. Wir werden dies über die SPI-Ausgang des STM32F4 tun. Berechnung der benötigten Bandbreite für eine gewünschte Farbtiefe und Bildwiederholfrequenz wird später durchgeführt werden.
    Um das Bild müssen wir an den Pins schauen mit A, B, C, D. Diese werden verwendet, um die beiden Linien, die mit Strom versorgt ist auswählen. Diese vier Signale werden in den Zeilen 0-15 decodiert werden kann, und die Leitungstreiber wird die ausgewählte Zeile in der oberen Hälfte und der unteren Hälfte zu ermöglichen.
    Nachdem alle diese Informationen bereits ein klares Bild darüber, was der Display-Treiber benötigen, um zu tun.

Schritt 2: Gestalten Sie Ihre BSP mit STM32Cube.

  1. 32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    32x32 RGB LED Plasma w / STM32F4.

    Alle 7 Artikel anzeigen

    In diesem Schritt konfigurieren wir die Peripheriegeräte und Uhren der STM32F4.
    Zu springen beginnen, dass können Sie auch öffnen Sie einfach die 32x32.ioc Datei im hw / Unterordner mit STM32CubeMX.
    Wir müssen im Grunde die folgenden IOs:
    SPI-Ausgangsdaten und Takt (SPI1_MOSI und SPI1_SCK) Vier GPIOs, die Leitungsauswahl zu fahren (A, B, C, D) Zwei GPIOs zu OE und STB fahren
    Man beachte, daß die Stifte für das SPI-Port fixiert. Die anderen Ports gewählt werden, um jegliche freie GPIO sein. Ich habe PC0 für A bis D und PB0, PB1 für OE und STB PC3.
    In Bezug auf die Taktkonfiguration wir Uhr die kleine STM32F4 bei 64 MHz. Nur um auf der sicheren Seite zu sein. Dies kann durch die Einstellung der Haupt PLL und Vorteiler Werte zu etwas, das funktioniert erfolgen.
    Wir müssen auch die SPI-Treiber enthalten, Interrupts, und ermöglichen DMA. Nur die erste Seite der Registerkarten werden angezeigt, der Rest ist ziemlich selbsterklärend. Um den DMA, das Richtige zu haben wir auch die Konfiguration, das zu tun bekommen. Wir wollen im Grunde das DMA, um den Speicherplatz der Quelle ändern, und immer auf den gleichen SPI-Register zu schreiben. Deshalb überprüfen wir "Inkrement-Adresse" für die "Memory", und halten Sie sie nicht markiert für "Peripheral".
    Zu einem späteren Zeitpunkt zu tun, um die PWM-Helligkeitsstufen und tun die Bildschirmaktualisierung, verwenden wir TIM3. Wir müssen die Interrupts auf dem zweiten Register (hier nicht gezeigt) zu ermöglichen.
    Unter Verwendung der Konfiguration in der ersten Registerkarte setzen, können wir die Interrupt-Rate berechnen:
    (64000000Hz / 32 (Vorteiler)) / 130 = 15384Hz
    Wir werden verstehen, warum wir uns für diese Nummer bei der Diskussion über die Display-Treiber.

Schritt 3: Was der Display-Treiber tun wird.


  1. Wie zuvor dargestellt, sind die Schieberegister nun wie folgt gekoppelt:
    R0 -> G0 -> B0 -> R1 -> G1 -> B1
    Jeder dieser Einträge ist 32bit. Der Eingang ist an R0 plaziert. Wenn wir nun zu drücken 32 * 3 * 2 Bits via SPI an das Display, die wir in der Tat füllen diese beiden Linien. Auf der Grundlage der Verdrahtung, wir schieben B1, G1, R1, B0, G0, R0, wie das, was wir im vergangenen schieben später erste.
    Stellen Sie sich vor, die keine Farben für Farben, werden wir nun auf Zyklus müssen durch alle Linien, indem Sie folgendermaßen über und über:
    Antriebsleistung (OE) hoch, um durch Ziehen STB niedrige Antriebsleistung ermöglichen die LED-Laufwerk GPIO-Pins für Leitungsauswahlzwischenspeicherdaten in den Schieberegistern an die Ausgänge deaktivieren (OE) niedrig, um die LED auf Start SPI Übertragung zu ermöglichen, in die nächste Zeile zu laden die Schieberegister
    Ich werde diese später als "Frame-Scan 'verweisen.
    In unserem Fall gehen wir davon aus, dass der SPI Transfer zu beenden, bevor wir Strobe in der nächsten Zeile. Dies kann ziemlich leicht, wenn nur mit zB einem best case Annahme (SPI Bitrate = Pixeltakt) berechnet werden.
    Um nun verschiedene Schattierungen ermöglichen für Farben (und so in der Lage, Farben mischen ein wenig anspruchsvoller sein), müssen wir LEDs ein und aus ziemlich schnell drehen. In diesem Beispiel verwenden wir 4-Bit-Intensitätswerte zu kodieren. Das macht sich für 15 + Intensitäten aus. Für jede "Rahmen-Scan" (siehe oben), werden wir eine Bit-Maske, die wir vergleichen, um jedes 4-Bit-Pixelwert haben und entscheiden, ob wir die LED nicht aktivieren oder. Der Pseudo-Code ist wie folgt:
      <P> Bitmaske = bit_angle_modulation_lookup [CTR]; </ p> <p> für jedes Pixel für beide zwei Zeilen:
    	 if (pixel_value & Bitmaske) LED [Pixel] = ON;  sonst LED [Pixel] = AUS;
     ctr = (ctr + 1)% 15; </ p> 

    Die BAM_MASK entspricht zB der binären Darstellung des Wertes ctr + 1, und sollte die folgenden Eigenschaften haben:
    Wenn pixel_value 0 ist, dann keine LED wird über alle 'Rahmen Scans Wenn pixel_value 1 ist, (durch die logische oder gegeben) dann über die 15 Zyklen, die LED wird auf einmal sein ... Wenn pixel_value ist 15, dann über die 15 Zyklen wird die LED immer eingeschaltet sein
    Als Randbemerkung: Handeln die Maske mit der "logischen AND" war eine Zufallsentscheidung statt mit 'vergleichen gleich ", wie es spart dabei Maskierungsoperationen auf jeden Wert in dem Ende.
    Der "Rahmen-Scan 'Rate kann nun berechnet werden:
    15384Hz / 16 Zeilen / 15 Intensitätsstufen = 64.1Hz
    Wir haben nur 15 Intensitätsstufen, so schwarz ist wie 'immer aus' gegeben.

Schritt 4: Interrupts, SPI und DMA, Uhren, GPIOs.


  1. Durch die CubeMX Software mit dem "Code generieren" Button wird die Konfiguration für die Peripheriegeräte erzeugt. Der Initialisierungscode für die Systemuhr, SPI, Timer (TIM3), DMA und GPIO in die main.c Datei generiert.
    Einige weitere Initialisierungscode für den Pin-Funktionen gehören zB SPI in die stm32f4xx_hal_msp.c Datei generiert.
    Die Callbacks, die später aufgerufen, um die Interrupt-Code ausführen, werden als "schwach" Funktionsdefinitionen in den HAL-Treiber definiert. Sie werden in dem Code in Main.c durch überschrieben:

    Leere HAL_SPI_TxCpltCallback (SPI_HandleTypeDef * HSPI) {...}
    nichtig HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {...}

    Gerade falls Sie suchten nach einem Register Rückruf "oder ähnlich.

Schritt 5: V-Sync und Pufferschalt.


  1. Nur eine kurze Erklärung, was diese sind und warum wir sie brauchen:
    Wie bereits erwähnt, ist die Bildwiederholfrequenz 64.1Hz. Während jeder Aktualisierung, bekommen das Bild der neu gezeichnet mehrmals. Wir müssen sicherstellen, dass der Inhalt nicht in der Neuzeichnung ändern in einem Zyklus als:
    dies würde mess up Farbwiedergabe würde Artefakte einzuführen (Reißen)
    Wir werden ein Beginn eines neuen Refresh-Zyklus anzuzeigen, durch Auslösen eines V-SYNC-Signal. Diese Terminologie stammt aus den Tagen der CRT-Displays und war ähnlich dem Elektronenstrahl geht von unten nach rechts zurück zu der oberen linken.
    Theoretisch wir gerade brauchen, um sicherzustellen, dass neue Display-Inhalt ist zum Zeitpunkt des V-Sync zur Verfügung. Um Kopie Overhead zu reduzieren, nutzen wir auch von Double-Buffering: Es gibt immer einen aktiven Frame-Buffer, die auf dem Display gezeichnet wird, und eine zweite Back-Puffer, die für die Darstellung der Grafiken verwendet wird. In unserem Fall ist der Plasmaeffekt.
    In der Praxis haben wir zwei Wege Ausführung von Code zu einem Zeitpunkt:
      Haupt-Thread, die das Plasma-Display-Thread, der LEDs schaltet macht

    Der Haupt-Thread werden die folgenden Schritte zu tun:
      Warten Sie, V-Sync Draw Plasma-Effekt, um Back-Puffer Weiter mit Schritt 1

    Das Display Faden durch die Timer-Interrupts ausgelöst werden den folgenden Schritt zu tun:
      Wenn neue Rahmenzyklus, Trigger V-Sync und Wechselpuffer umschalten LEDs für Strom 'Frame Scan' Schrittweite 'Frame Scan' counter Weiter mit Schritt 1

Schritt 6: Die Plasma-Effekt.

  1. 32x32 RGB LED Plasma w / STM32F4.

    Es gibt viele Tutorials für Plasma-Effekte auf dem Netz. Dies ist auch nur eine wilde Mischung aus Sinoiden zusammen, um etwas zu tun. Einige Dinge, obwohl beachten Sie:
    Es nutzt die Gleitkomma-Version für den Cortex M4. Ich habe nicht die Mühe mit dem Fix-Punkt-math. Es gibt keine Gammakorrektur. Da es nur 16 Intensitäten, das klang wie ein Overkill. Das Layout des Bildspeichers ist ein wenig umständlich, und größtenteils gebaut den Code einfach zu machen, aber nicht unbedingt lesbar. Aber Sie werden es heraus out :)

Schritt 7: Setzen sie alle zusammen.

  1. 32x32 RGB LED Plasma w / STM32F4.

    Draht alles auf, dann laden Sie die Projekte aus
    https://github.com/cpmetz/32x32-instructable
    Gebäude wird schwer sein, aber nach allem, was kompiliert werden Sie ein Meister der STM32F4 sein. Das ist ganz nett.
    Am Ende sollte es so aussehen:
    http://youtu.be/u-XY1kCQB6s