Forum: Mikrocontroller und Digitale Elektronik STM32 Signalerzeugung für Bitmuster


von Massi87 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

(Vorab: das ist mein erstes Projekt mit einem STM32)
Meine verwendete Software:
- STM32CubeMX
- TrueStudio (HAL Libraries)

Anhang: Quellcode main.c

Ich möchte gerne mit einem STM32 (Nucleo64-F446RE) für eine bestimmte 
Bitfolge, die ich über UART einlese, entsprechende Pulse über eine LED 
ausgeben.
Dabei soll die Bitfolge in Blöcken aus je 2 Bits zerlegt und für jeden 
Block ein entsprechendes Signal ausgegeben werden.

Die Einheitsperiode sei zum Beispiel 4 Sekunden lang und wird in 4 Slots 
mit gleicher Dauer geteilt.
  Slot1   Slot2   Slot3   Slot4
| xxxxx | xxxxx | xxxxx | xxxxx |

Die Pulsdauer bei der die LED leuchtet soll beispielsweise 0,2 Sekunden 
lang sein.
Je nachdem wie mein Bitmuster aussieht soll der Puls am Anfang des 
jeweiligen Slot ausgegeben werden (00 -> Puls Slot 1, 01 -> Puls Slot 2, 
10 -> Puls Slot 3, 11 -> Puls Slot 4)

Beispiel:
Fall 00:
|1000|0000|0000|0000|

Fall 01:
|0000|1000|0000|0000|

Fall 10:
|0000|0000|1000|0000|

Fall 11:
|0000|0000|0000|1000|

Wenn ich nun die Bitmuster '00' und '10' habe soll folgendes ausgegeben 
werden:
|1000|0000|0000|0000| |0000|0000|1000|0000|

Ich hatte mir überlegt die Signale mithilfe von Timern zu generieren 
aber es klappt nicht.
Ich habe die Funktion "void 
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)" verwendet, um zu 
prüfen, welcher Timer überläuft, den entsprechenden Timer zu stoppen und 
den nächsten zu starten.
Aber es klappt leider nicht.

Meine Fragen sind:
- macht es Sinn sowas mithilfe von Timern zu programmieren?
- Wie wäre es stattdessen möglich, den entsprechenden Pulse zu 
generieren?

Ich habe mir auch das Dokument "en.DM00135183" STM32F446xx advanced 
Arm®-based 32-bit MCUs runtergeladen und lese mir die Seiten bezüglich 
der Timer durch aber irgendwie habe ich leider noch nicht die 
Erläuchtung, wie ich es zum Laufen bekomme.

von UweBonnes (Gast)


Lesenswert?

Timer musst Du verwenden, wenn du Genauigkeiten von vielleicht besser 
100 us brauchst. Du kannst Doch in einer Schleife zuerst die Werte 
ausgeben, die Du in der letzten Schleife ausgerechnet hast, dann neue 
Werte berechen und schliesslich warten, bis die Zeitscheibe vorbei ist 
und eine neue Schleife beginnt.

von Harry L. (mysth)


Lesenswert?


von Massi87 (Gast)


Lesenswert?

Vielen Dank für die Antworten @UweBonnes und @Harry L.!

@UweBonnes: um die Timer werde ich nicht rum kommen, weil ich später das 
Signal mit einer Photodiode empfangen und verarbeiten will. Da muss ich 
dann mit einer Präambel den Empfänger entsprechend synchronisieren.

@Harry L.: Das Cookbook hört sich vom Namen her schon sehr interessant 
an. Ich werde es durchlesen und mir die beiden empfohlenen Kapitel 
genauer anschauen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.