Ich empfand das verlinkte Programm auch ein wenig undurchsichtig, vor allem die Structs und Unions, kann man zwar so machen, muss man aber nicht. Auch ist, obwohl's tatsächlich nicht viel ausmacht, bei jedem Triggern des Input Capture eine Messung möglich. Ein Unterscheiden zwischen erster und zweiter Flanke ist nicht notwendig.
Die normale Vorgehensweise ist so, man nimmt sich 'ne unsigned 16Bit Variable und zieht in der ISR immer den alten Zählerstand vom Neuen ab. Dass dann auch z.B. 200 - 65000 richtig behandelt wird, wird durch Berücksichtigung der Overflows erreicht. Die Overflows werden mit der Zählerbreite multipliziert und zum Ergebnis addiert.
Wichtig ist dabei auf race-conditions aufgrund der Codelaufzeit zu achten, die im Bereich des Zählerüberlaufs vorkommen können, als auch das Ergebnis atomar zu übergeben, damit während der Ausgabe nichts vefälscht wird.