STM32 Interrupt Priority (preemption) Problems
I just found the answer from a very helpful poster on the STM32 forum

The following isn't correct. SysTick is a 'System Handler', and as such the priority isn't set in this way at all:

  NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // Highest priority
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&amp;NVIC_InitStructure);


It's actually set with:

  NVIC_SetPriority(SysTick_IRQn, 0);


Calling that code instead solves the problem!