Zum Inhalt

Dokumentation

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.

Zur Befehlsreferenz · Zur Übersicht