Спасибо каждому ответившему. Решил тем, что в функции чтения
времени предусмотрел ситуацию не только возникновения прерывания из пользовательского кода, но и из более приоритетного опросом флага контроллера. Примерно
так. do {
limit = SYSTICK_TM->CMPR;
capt = SYSTICK_TM->TDR;
limit_x = SYSTICK_TM->CMPR;
} while(limit != limit_x));
// А этот блок делает возможным применение в обработчике прерывания более высого приоритета.
// Ловим установку флага запроса прерывания. TMR3_Irq = 31
if ( (inpw(REG_AIC_ISR)&0x80000000) != 0) { // Переделать на вычисляемый в компиляции
limit = (limit + step) & ((1<<24)-1);
now.seconds++;
}