Ok, so I've stripped this back to be much simplier.
Using just channels 2 & 3 I am trying to create a 10us pulse, a 10us gap, and then a 20us pulse on the CH2 output pin:

Due to my "end goal" I don't want to stop the timer after the first pulse, or reset the CNT value, I just want to force load the C2V and C3V registers from the buffers with new values.
Channels 2 & 3 are set to "Combine PWM", and I've enabled synchronisation (SYNCEN1 in FTM0_COMIBINE register) believing that doing so will mean that the CnV registers for this channel pair will be included when I perform my software sync.
Processor Expert has generated the following "init" code, based on the settings:
void FT0_Init(void)
{
SIM_SCGC6 |= (uint32_t)0x01000000UL;
(void)(FTM0_SC == 0U);
FTM0_SC = (uint32_t)0x00UL;
(void)(FTM0_C2SC == 0U);
(void)(FTM0_C3SC == 0U);
FTM0_C0SC = (uint32_t)0x00UL;
FTM0_C1SC = (uint32_t)0x00UL;
FTM0_C2SC = (uint32_t)0x00UL;
FTM0_C3SC = (uint32_t)0x00UL;
FTM0_C4SC = (uint32_t)0x00UL;
FTM0_C5SC = (uint32_t)0x00UL;
FTM0_C6SC = (uint32_t)0x00UL;
FTM0_C7SC = (uint32_t)0x00UL;
FTM0_SC &= (uint32_t)~0xA0UL;
FTM0_MODE |= (uint32_t)0x04UL;
FTM0_MODE |= (uint32_t)0x01UL;
FTM0_COMBINE = (uint32_t)((FTM0_COMBINE & (uint32_t)~0x72525672UL) | (uint32_t)0x00202100UL);
FTM0_INVCTRL &= (uint32_t)~0x0FUL;
FTM0_C0SC &= (uint32_t)~0xFFFFFFBEUL;
FTM0_C1SC &= (uint32_t)~0xFFFFFFBEUL;
FTM0_C2SC = (uint32_t)((FTM0_C2SC & (uint32_t)~0xFFFFFFC7UL) | (uint32_t)0x08UL);
FTM0_C3SC = (uint32_t)((FTM0_C3SC & (uint32_t)~0xFFFFFF87UL) | (uint32_t)0x48UL);
FTM0_C4SC &= (uint32_t)~0xFFFFFFBEUL;
FTM0_C5SC &= (uint32_t)~0xFFFFFFBEUL;
FTM0_C6SC &= (uint32_t)~0xFFFFFFBEUL;
FTM0_C7SC &= (uint32_t)~0xFFFFFFBEUL;
FTM0_C2V = (uint32_t)0xDEADUL;
FTM0_C3V = (uint32_t)0xBEEFUL;
FTM0_POL &= (uint32_t)~0x0CUL;
FTM0_FILTER &= (uint32_t)~0xFF00UL;
FTM0_OUTINIT &= (uint32_t)~0xFFFFFF0CUL;
FTM0_OUTMASK &= (uint32_t)~0x0CUL;
FTM0_FLTCTRL &= (uint32_t)~0x0F00UL;
FTM0_FLTPOL &= (uint32_t)~0x0FUL;
FTM0_FLTCTRL &= (uint32_t)~0xFFUL;
FTM0_SYNC &= (uint32_t)~0xFBUL;
FTM0_EXTTRIG &= (uint32_t)~0x7FUL;
FTM0_MOD |= (uint32_t)0xFFFFUL;
FTM0_CNTIN &= (uint32_t)~0xFFFFUL;
FTM0_DEADTIME &= (uint32_t)~0xFFUL;
FTM0_CNT &= (uint32_t)~0xFFFFUL;
FTM0_MODE = (uint32_t)((FTM0_MODE & (uint32_t)~0xFFFFFFE8UL) | (uint32_t)0x03UL);
FTM0_SYNCONF = (uint32_t)0x0281UL;
FTM0_SC &= (uint32_t)~0xFFUL;
FTM0_FMS &= (uint32_t)~0xCFUL;
FTM0_SWOCTRL &= (uint32_t)~0x0CUL;
FTM0_CONF &= (uint32_t)~0x06DFUL;
FTM0_PWMLOAD &= (uint32_t)~0x02FFUL;
}
The relevant sections for syncing (as I understand it all look ok to me):
FTMEN is set, and the SYNCEN bits are set for channel group 1:
FTM0_MODE |= (uint32_t)0x01UL;
FTM0_COMBINE = (uint32_t)((FTM0_COMBINE & (uint32_t)~0x72525672UL) | (uint32_t)0x00202100UL);
SYNCMODE is 1, and SWWRBUF is also 1 (so that the CnV registers will be updated on the trigger:
FTM0_MODE = (uint32_t)((FTM0_MODE & (uint32_t)~0xFFFFFFE8UL) | (uint32_t)0x03UL);
FTM0_SYNCONF = (uint32_t)0x0281UL;
Unless I am missing something?
The K60 reference Manual has this to say regarding C(n)V and C(n+1)V register synchronization:
40.4.11.6 C(n)V and C(n+1)V register synchronization
The C(n)V and C(n+1)V registers synchronization updates the C(n)V and C(n+1)V registers with their buffer values.
This synchronization is enabled if (FTMEN = 1) and (SYNCEN = 1). The synchronization mechanism is the same as the MOD register synchronization.
However, it is expected that the C(n)V and C(n+1)V registers be synchronized only by the enhanced PWM synchronization (SYNCMODE = 1).
and the reference MOD section:
40.4.11.4 MOD register synchronization
The MOD register synchronization updates the MOD register with its buffer value.
This synchronization is enabled if (FTMEN = 1).
The MOD register synchronization can be done by either the enhanced PWM synchronization (SYNCMODE = 1) or the legacy PWM synchronization (SYNCMODE = 0). However, it is expected that the MOD register be synchronized only by the enhanced PWM synchronization.
In the case of enhanced PWM synchronization, the MOD register synchronization depends on SWWRBUF, SWRSTCNT, HWWRBUF, and HWRSTCNT bits according to this flowchart:

When I want to start the sequence I load the init settings for the first 10us pulse and start the FTM:
void Start_FT0(void)
{
FTM0_SC &= ~FTM_SC_CLKS_MASK;
FTM0_C3SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C2V = 4;
FTM0_C3V = 484;
FTM0_CNT &= (uint32_t)~0xFFFFUL;
IN_SECOND_STAGE = false;
FTM0_SC = (uint32_t)((FTM0_SC & (uint32_t)~0xF7UL) | (uint32_t)0x08UL);
}
..and my interrupt handler tries to load the new values when triggered by the falling edge of the first pulse (CH3 event):
if(FTM0_C3SC & FTM_CnSC_CHF_MASK)
{
if(!IN_SECOND_STAGE)
{
const uint32_t endOfPulse = FTM0_C3V;
FTM0_C2V = endOfPulse + 480 ;
FTM0_C3V = endOfPulse + 480 +(480*2) ;
FTM0_SYNC |= FTM_SYNC_SWSYNC_MASK;
IN_SECOND_STAGE = TRUE;
}
else
{
FTM0_SC &= ~FTM_SC_CLKS_MASK;
IN_SECOND_STAGE=FALSE;
}
}
FTM0_C0SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C1SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C2SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C3SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C4SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C5SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C6SC &= ~FTM_CnSC_CHF_MASK;
FTM0_C7SC &= ~FTM_CnSC_CHF_MASK;
The first pulse appears correctly at the pin, and the interrupt handler fires and the code is processed.
The line "FTM0_SYNC |= FTM_SYNC_SWSYNC_MASK;" sets the SWSYNC bit, and the manual indicates that once the sync has taken place that bit will get cleared... but it never does.
It never clears, and my second pulse never appears.
Following the left side of the flowchart down, the difference between an immediate update to the MOD register, and a delayed update (at the next loading point) is whether SWRSTCNT is set or not. I do NOT have this bit set, as the documentation indicates that this would cause the CNT register to reset to its start value, which is not what I want.
I am assuming that as what I want is the C(n)V (and C(n+1)V) registers to be updated but not the CNT value I set the SWWRBUF bit instead:

If I don't set the SWRSTCNT bit as well then it doesn't work, if I DO set the SWRSTCNT bit then the software trigger is handled immediately as expected, but the CNT value is also reset which is NOT wanted.
Is there some setting I have missed, or is it not possible to configure the K60 to update the CnV registers and not restart the CNT value?