STM32L0 - Verzögerung in Mikrosekunden

Ich verwende ein B-L072Z-LRWAN1-Board (das über eine STM32L072-MCU verfügt) und möchte Daten von einem DHT11-Sensor abrufen. Um dies zu erreichen, brauche ich eine Verzögerung von Mikrosekunden, die ich nicht erreichen kann.

Die von ST bereitgestellten Bibliotheken haben eine Millisekunden-Verzögerungsfunktion, aber keine Mikrosekunden-Funktion.

Ich brauche Hilfe. Vielen Dank im Voraus!

UPS! Der alte Titel wurde aus einem früheren Beitrag gespeichert. Entschuldigen Sie.
Diese Seite zeigt ein Beispiel für die Verwendung eines STM32 mit dem DHT11. Es enthält Code, aber ich kann nicht hineinsehen, um zu sehen, wie es funktioniert. Der Code wird in einer komprimierten Datei bereitgestellt, die mein Telefon nicht entpacken kann.
Sie müssen genauer sein, um eine beantwortbare Frage zu haben. Wie viele Mikrosekunden? Mit welchem ​​Minimum nach Fehler? Und was maximal?
Ich brauche Verzögerungen von 40 us und 80 us, um Daten vom Sensor lesen zu können.

Antworten (1)

Sie brauchen keine Mikrosekundenverzögerung, sondern einen Timerzähler mit Mikrosekundengenauigkeit.

Wenn Sie sich das von @JRE verlinkte Datenblatt ansehen, handelt es sich um ein asynchrones Protokoll. Der Host sendet einen langen Low-Impuls (mindestens 18 Millisekunden ), und das ist die einzige Zeit, in der die MCU irgendetwas verzögern sollte. Aber Sie haben bereits eine Millisekunden-Verzögerungsfunktion (und es wäre sowieso besser, in dem Millisekunden- Interrupt zu arbeiten , der wahrscheinlich bereits läuft).

Dann antwortet das Gerät mit einem Startzyklus und 40 Datenzyklen, wobei die Länge der High-Phase den Bitwert codiert. Sie müssen die verstrichene Zeit zwischen der steigenden und der fallenden Flanke messen .

Wenn der Millisekunden-Interrupt läuft, dann zählt schon etwas die Zyklen. Normalerweise ist es der SysTickTimer. Warten Sie auf die steigende Flanke am Pin, erhalten Sie einen Zeitstempel von SysTick->VAL, warten Sie auf die fallende Flanke, lesen Sie den Zähler erneut und subtrahieren Sie den vorherigen Zeitstempel. Achten Sie auf Überlauf, addieren Sie SysTick->LOAD+1das Ergebnis, wenn es negativ ist. Teilen Sie das Ergebnis durch die Taktfrequenz (in MHz), um einen Mikrosekundenwert zu erhalten.

Möglicherweise möchten Sie jedoch, dass die MCU etwas Nützliches tut oder sie schlafen lässt, um Strom zu sparen, während die Daten eingehen.

Ein Timer und DMA können die meiste Arbeit alleine erledigen

Lesen Sie den Abschnitt TIM2/TIM3-Funktionsbeschreibung / Eingangserfassungsmodus im Referenzhandbuch.

Da die Low-Phase des Signals immer 50 us lang sein sollte, kann man auch die Zeit zwischen zwei aufeinanderfolgenden fallenden Flanken messen. Das Beispiel im Handbuch ist für steigende Flanken, aber es kann natürlich modifiziert werden, um fallende Flanken zu erfassen, indem die Bits CC1Pund CC1NPin Schritt 3 geändert werden.

  • Wählen Sie einen Timer-Kanal und den entsprechenden DMA-Kanal aus. Verwenden Sie die Tabelle mit dem Titel Zusammenfassung der DMA-Anforderungen für jeden Kanal .
  • Richten Sie den DMA-Kanal ein, um 41 (für 1 Startimpuls + 40 Datenimpulse) Halbwörter (16 Bits) aus dem CCRRegister des Zeitgeberkanals zu einem geeignet großen Array im Speicher zu übertragen.
  • Sie können den DMA-Transfer-Complete-Interrupt aktivieren, um einen Handler auszuführen, wenn die Datenübertragung abgeschlossen ist.
  • Richten Sie den Timer mit einem Vorteiler ein, der Ihrer Systemtaktfrequenz in MHz entspricht (schreiben Sie eins weniger in und PSCvergessen Sie nicht, ihn einzustellen ), um bequem einen Zeitstempel in Millisekunden zu erhalten.UGEGR
  • Fahren Sie mit dem im Abschnitt Eingabeerfassungsmodus beschriebenen Verfahren fort . Es gibt sogar ein einfaches Codebeispiel im Anhang. Passen Sie es für die Erfassung fallender Flanken an und aktivieren Sie im letzten Schritt DMA anstelle des Kanal-Interrupts in DIER.
  • Als Sicherheitsnetz können Sie den Timer-Update-Interrupt aktivieren. Es wird nach 65535 Mikrosekunden ausgelöst und teilt dem Programm mit, dass die Übertragung abgelaufen ist. Ein niedrigerer Timeout-Wert kann in eingestellt werden ARR.