TIC – Zeitstempel und Monitoring
64-Bit-Mikrosekundenzähler, Frame-Dauer, Überlauf und Korrelation mit Linux-Zeit.
TIC – monotone LIN-Zeitbasis
Das BE-IIS LIN HAT verwendet einen gemeinsamen TIC für LIN1 und LIN2. TIM6 erzeugt die 1-MHz-Zeitbasis (1 TIC = 1 µs). Der native C-Interrupt erweitert den 16-Bit-Hardwarezähler auf 64 Bit. Die Zeitbasis läuft ab STM32-Anwendungsstart unabhängig von Linux, I²C-Zugriffen oder MicroPython.
TIC-Befehle
import lin
now = lin.tic() # aktuelle 64-Bit-Zeit in µs
frame = lin.recv(1) # nächstes Frame oder None
if frame:
start = frame['tic_start'] # uint64
duration = frame['tic_duration'] # uint32
end = start + duration
print(start, duration, end)
Im Frame: 64-Bit-Start und 32-Bit-Dauer – 12 Byte Zeitinformationen je Frame. Kein 64-Bit-Endzeitstempel nötig. lin.recv() liefert außerdem ID, Nutzdaten, Länge und Status. Der FIFO hat 15 nutzbare Einträge pro Kanal; überlaufene Einträge werden verworfen.
Zeitgenauigkeit
Die Einheit ist 1 µs; das ist zunächst Auflösung, nicht absolute Genauigkeit. TIM6 überläuft intern alle 65,536 ms, die Erweiterung läuft dabei weiter. Der Software-64-Bit-TIC wird erst nach etwa 584.000 Jahren vollständig überlaufen. Master-Zeitstempel umfassen die blockierenden UART-Funktionsaufrufe; Sniffer und Slave erfassen den Beginn am UART-LIN-Break-Erkennungsereignis. Dies ist nicht die erste Flanke auf der Busleitung. Auch Interruptlatenz und Oszillatortoleranz beeinflussen die Messung.
Zwei Kanäle korrelieren
a = lin.recv(1)
b = lin.recv(2)
if a and b:
print('Startversatz [us]:', b['tic_start'] - a['tic_start'])
print('Endversatz [us]:',
(b['tic_start']+b['tic_duration']) -
(a['tic_start']+a['tic_duration']))
Für langfristiges Logging werden Frame-Daten regelmäßig aus beiden FIFOs ausgelesen und auf dem Host gespeichert. Der LIN-HAT besitzt keine eigene batteriegepufferte Echtzeituhr für UTC.
TIC in echte Uhrzeit übersetzen
Die Zuordnung Unixzeit = Referenz-Unixzeit + (TIC − Referenz-TIC)/1_000_000 erfolgt in der Host-Anwendung. Referenzwerte sollten möglichst nah beieinander aufgenommen werden. I²C-Verzögerung erzeugt Unsicherheit; für lange Aufzeichnungen wiederholt synchronisieren, um Frequenzdrift zu erfassen.
# Auf Linux ausführen: Näherung für einen Zeitbezug
import time
before = time.time_ns()
# tic_value über die beiis-lin-Schnittstelle vom STM32 auslesen
after = time.time_ns()
host_reference_ns = (before + after) // 2
uncertainty_ns = (after - before) // 2
Eine Linux-Uhrzeit wird bewusst nicht in jedem STM32-Frame gespeichert.
Praxistests
Auf dem Raspberry Pi 5 wurden 1.000 LIN-Requests fehlerfrei übertragen. Gemessene Master-Dauern: 4.465–4.712 µs bei 19.200 Baud, vier Nutzdatenbytes. Dabei handelt es sich um Tests der Entwicklungsfirmware und nicht um eine Spezifikation garantierter Messunsicherheit.