Я в нувотоне вот так делаю. Без запрета прерываний. Без останова
таймера. Без использования регистров захвата. С работой в
вытесняющей многозадачности. Значение переменной cntTimer2Irq у меня увеличивается на 1 при переполнении таймера в обработчике IRQ, в вашем случае это абсолютное значение второго 16-битного таймера.
Таймер 24-битный, увеличивается на единицу с периодом 1 мкс.
uint32_t getTicksBy10us_32bit()
{
const uint32_t n1 = cntTimer2Irq;
const uint32_t t1_24bit = getclock_24bit();
const uint32_t n2 = cntTimer2Irq;
if (n1 == n2)
{
const uint64_t v_us = (uint64_t)t1_24bit | (uint64_t)(n1 << 24);
return (uint32_t)(v_us / 10ULL);
}
else
{
const uint32_t t2_24bit = getclock_24bit();
const uint64_t v_us = (uint64_t)t2_24bit | (uint64_t)(n2 << 24);
return (uint32_t)(v_us / 10ULL);
}
}
Предполагается, что второй счётчик может увеличиться максимум на 1 в течение работы этой функции, то есть относительно медленный.