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!
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 SysTick
Timer. 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+1
das 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 CC1P
und CC1NP
in Schritt 3 geändert werden.
CCR
Register des Zeitgeberkanals zu einem geeignet großen Array im Speicher zu übertragen.PSC
vergessen Sie nicht, ihn einzustellen ), um bequem einen Zeitstempel in Millisekunden zu erhalten.UG
EGR
DIER
.ARR
.
Benutzer197178
JRE
Chris Stratton
Benutzer197178