Tut HAL_GetTick() return ticks oder Millisekunden? (und wie dies gemessen in Mikrosekunden)
Ich bin neu mit HAL-Funktionen. Die Beschreibung der Funktion HAL_GetTick()
sagt, dass es "bietet eine tick Wert in Millisekunde".
Ich verstehe nicht, wenn diese Funktion gibt zurück, ticks oder Millisekunden. Natürlich die Umrechnung von ticks in Millisekunden die ich brauche, um zu wissen, wie viele Zecken in einer Millisekunde, und es ist CPU-spezifisch.
Also, was bedeutet HAL_GetTick()
genau zurück?
Edit:
Mein eigentliches problem ist, zu wissen, wie zu Messen Sie die Zeit in Mikrosekunden. Also dachte ich, um Zecken von HAL_GetTick()
und konvertieren Sie Sie in Mikrosekunden. Dies ist gerichtet in den Kommentaren und zumindest eine der Antworten, also ich erwähne das hier auch, und ich bearbeitete den Titel.
InformationsquelleAutor Alaa M. | 2017-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
HAL_GetTick()
sollte return die Anzahl der vergangenen Millisekunden seit Systemstart, da viele HAL-Funktionen abhängen. Wie wollen Sie es erreichen, ist bis zu Ihnen. StandardmäßigHAL_Init()
Abfragen der system-Taktfrequenz, und setzt den SysTick-Frequenz auf die 1/1000stel, dass:Dann die Standard-SysTick interrupt handler ruft
HAL_IncTick()
inkrementiert einen internen Zähler einmal pro ms, undHAL_GetTick()
gibt den Wert des Zählers.Alle diese Funktionen sind definiert als
weak
, so können Sie diese überschreiben, solange Ihre version vonHAL_GetTick()
gibt die verstrichene Zeit in Millisekunden, es wird OK sein. Sie können z.B. ersetzenHAL_InitTick()
zu lassen SysTick laufen bei 10 kHz, aber dann sollten Sie sicherstellen, dassHAL_IncTick()
aufgerufen wird, nur bei jedem 10ten unterbrechen. Auf einem 216 MHz STM32F7 controller (oder kaum veröffentlicht 400MHz STM32H743), können Sie tatsächlich gehen bis zu 1 MHz Systick, aber dann sollten Sie sehr vorsichtig zurück so schnell wie möglich aus dem handler. Und es wäre eine schreckliche Verschwendung von kostbaren Prozessor-Zyklen, es sei denn, Sie tun etwas, was in der Prozedur, die ein hardware-counter nicht.Oder Sie können es tun, ohne Konfiguration des SysTick (überschreiben
HAL_InitTick()
mit einer leeren Funktion), sondern ein 32-bit-hardware-timer mit einer ausreichenden vorteiler zählen auf jede Millisekunde an, und lassen SieHAL_GetTick()
Gegenzug wird der timer-Zähler.Zurück zu deiner eigentliche problem, die Zeit zu Messen, in der Größenordnung von Mikrosekunden, gibt es bessere Möglichkeiten.
Wenn Sie eine 32-bit-timer zur Verfügung, dann kann man den MHz-Wert der jeweiligen APB Uhr in der prescaler starten Sie es, und es ist Ihr Mikrosekunden Uhr, nicht wegnehmen Bearbeitungszeit von Ihrer Anwendung überhaupt. Dieser code sollte es ermöglichen können (noch nicht getestet) auf ein
STM32L151/152/162STM32F4:dann erhalten, deren Wert jederzeit durch das Lesen
TIM5->CNT
.Überprüfen Sie Ihre Referenzhandbuch hardware-Timer hat eine 32-bit-Zähler, und wo hört Sie bekommen Ihren Takt aus. Es ist sehr unterschiedlich über das gesamte STM32-Serie, aber sollte man da auf eine F4.
Wenn Sie nicht verwenden können, ein 32-bit timer, dann gibt es die core-Zyklen-Zähler. Aktivieren Sie einfach einmal mit
und Lesen Sie dann den Wert von
DWT->CYCCNT
. Beachten Sie, dass es gibt die verstrichene Prozessor-Zyklen, überlauf wird in ein paar Sekunden.EDIT:ich habe gerade festgestellt, dass Sie über einen STM32L0. Also, vergessen Sie die 32-bit-Timer und 200+ MHz Kerne. Verwenden.DWT->CYCCNT
oder überlegen Sie sehr genau, wie lange sind die Intervalle, die Sie gerne zu Messen, und mit welcher Genauigkeit, dann nehmen Sie eine 16-bit-timer. Man könnte es als eine separate Frage, beschreibt im detail, wie deine hardware aussieht und was sollte Sie es tun. Gibt es vielleicht einen Weg, um die trigger-ein-Zähler-start/stop, direkt von den Ereignissen, die Sie gerne auf Zeit.Stellen Sie sicher, dass Sie Lesen Sie die Handbücher gehören zu Ihrer Steuerung, denn das, was du verlinkt hast ist für die L0-Serie.
Danke, ich fixe den link.
InformationsquelleAutor berendi
Es ist beides. Die meisten der Zeit, die Funktion, die erhöht die HAL-tick-Zähler ist süchtig nach SysTick-interrupt, der konfiguriert ist, um jedes 1ms tick. Daher
HAL_GetTick()
zurück, die Anzahl der Millisekunden, die seit dem SysTick-interrupt konfiguriert ist (im wesentlichen seit dem start des Programms). Dies kann auch sein, obwohl der als "die Anzahl der Zeiten, die SysTick-interrupt hat 'abgehakt'".HAL_IncTick()
"in der Standard-Umsetzung", erhöht den timer jede 1ms. So kann ich dies ändern, erhöht jeder 1us?Wenn Sie möchten, die Anzahl der Millisekunden seit das system gestartet ist, die
HAL_GetTick()
genau das tut, was Sie wollen. Wenn Sie möchten, dass aktuelle Datum und die Uhrzeit der RTC kann die Arbeit mit sub-Sekunden-Genauigkeit. Ich empfehle bezogen auf Referenz-Handbuch wie dieser, wenn Sie möchten, um herauszufinden, was die maximale Genauigkeit ist. Bei der Arbeit mit RTC, halten Sie im Verstand LSI (interner Oszillator) ist nicht geeignet, da es nicht präzise genug ist.Ich sehe keinen Grund, warum SysTick konnte nicht auf diese Weise konfiguriert. Suche für
HAL_SYSTICK_Config
Funktion aufrufen und den parameter ändern, 1000 mal größer (wahrscheinlich - entfernen Sie die Aufteilung der system-clock von 1000). Von nun anHAL_GetTick()
zurückgegebene Wert bedeutet "Anzahl der Mikrosekunden seit das system gestartet". Wenn Sie möchten, umHAL_GetTick()
zu geben Millisekunden, wie es normalerweise funktioniert, kann man immer konfigurieren Sie Ihre eigene 1 Mikrosekunden-timer und erhöhen Sie Ihre eigene variable jedes mal, wenn es Zecken, die im wesentlichen ist, was HAL nicht mit SysTick.und Jacek Ślimok - dies ist eine sehr schlechte Beratung. Sicher - Sie können konfigurieren, SysTick zum generieren eines interrupt alle 1us, aber ich bin mir mehr als sicher, dass Sie wirklich nicht wollen.
HAL_GetTick()
ist interrupt-basiert undHAL_SYSTICK_Config()
konfiguriert, interrupt Periode. Da die ein-und Ausfahrt aus der interrupt auf diesen Kern ist über 20 Taktzyklen, und dass der max clock ist bei diesen chips ist, 32MHz, die Sie erhalten würden, ein Aufwand im Bereich von 70-100%! Das ist richtig - bis zu 100%! Beachten Sie auch, dass ein 32-bit-Zähler, der Mikrosekunden-überläufe nach nur einer Stunde.die Methode sollte definitiv NICHT basiert auf interrupts. Ich schlage vor, Sie verwenden ein frei laufender Zeitgeber, der mit einem Zyklus von 1us (die durch prescaler konfigurieren, beispielsweise um den Wert 31). Dies kann sogar SysTick. Wenn Sie Messen möchten nur "kurze" Dauer (weniger als timer overflow), dann ist das alles, was Sie brauchen. Ansonsten sollten Sie kombinieren, die mit einem interrupt auf den timer overflow zu bekommen, größere Reichweite. Versuchen Sie, starten Sie eine neue Frage, die, wie das ist off-topic hier <:
InformationsquelleAutor Jacek Ślimok
yI brauchte ein timestamp bei 1uS Genauigkeit, und mit TIM5, wie oben beschrieben, gearbeitet, aber ein paar Optimierungen waren nötig. Hier ist, was ich kam mit.
Habe ich nicht vollständig zu erforschen, warum ich hatte zu tun, was ich Tat. Aber ich erkannte zwei Dinge sehr schnell. (1) Die prescalar Skalierung nicht funktioniert, obwohl es ausgesehen hat. Dies war eine von mehreren Dinge, die ich versucht es zum laufen zu bringen (im Grunde eine Hälfte-us Uhr, und dividieren Sie das Ergebnis durch 2). (2) wurde Die Uhr bereits läuft, und gab seltsame Ergebnisse auf den ersten. Ich versuchte mehrere erfolglose Dinge zu stoppen, neu zu Programmieren und starten Sie es neu, und setzen die Zählung auf -10 war eine grobe, aber effektive Möglichkeit, nur lassen Sie es den kompletten aktuellen Zyklus, dann sehr schnell anfangen zu arbeiten, wie gewünscht. Es gibt sicherlich bessere Möglichkeiten dieses Ziel zu erreichen. Aber insgesamt ist dies eine einfache Möglichkeit, sich ein genaues Ereignis-Zeitstempel mit sehr geringem overhead.
Und falsch in mindestens zwei Möglichkeiten: A
PSC
Wert von0
bedeutet prescaling der Faktor1
, so dass die berechnete prescaler-Wert ist von 1 (benötigt eine-1
). Der code nicht unterteilen dieCNT
Wert aber vermehrt, die durch zwei über eine Links shift. - Damit Sie 'optimiert' die richtige Lösung gegeben, die eine etwas off (vorteiler!) Wert, 4x, was es sein sollte und sagen, dass das funktioniert (besser) für Sie?InformationsquelleAutor Jonathan Salzedo