If you only need 'time' less than the possible 16-bit count (at your FTM frequency) you don't need anything 'special', just a static 'time save' and a simple unsigned-int 16-bit difference. Let the counter 'free run' with 'no' mod (0xFFFF) for simple rollover. The difference-math will 'ignore overflow/underflow' and give you exactly the right time difference. I do this from a continuous stream to measure a varying PWM from the one capture-interrupt:
static uint16_t time_saved = 0;
void TPM_DRV_IRQHandler( )
{
uint16_t time_dif;
uint16_t time_cnt;
time_cnt = TPM_HAL_GetChnCountVal( tpmBase, channel );
//Counts are of 1.5MHz (48MHz/2/16), or 667ns. Max diff 43.69ms
time_dif = ( time_cnt - time_saved );
time_saved = time_cnt;
...
So if the 'saved' count was 0xFFFD (-3, three counts up will include the next 'zero'), and the next time_cnt is 6, then 6-0xFFFD is the correct 9 in unsigned 16-bit math, ignoring the underflow. By a similar token, 6-7 yields 0xFFFF: 65535 counts, the max possible difference.
I suppose if 16bit resolution is NOT going to do it, then by all means also run that 'overflow' interrupt, BUT you will have to handle some 'special cases' right around overflow. That is, if the 'time_cnt' is NOT a 'very low' number, then the overflow happened AFTER the count-trigger, and you will have to 'save' this overflow indication for the NEXT interrupt and 'add' 1<<16 to the now-32bit-time_saved value after THAT time. Else, process said overflow interrupt first here by appending the updated upper-16bits to the captured count.
By NOT trying to 'modify' any FTM registers 'on the fly' this will ALWAYS give you the exact time (down to FTM-clock-rate-resolution of course) between interrupt edges, assuming that your overall interrupt environment allows you to service the interrupt 'at some point' between every pair of edges.