Все правильно, надо добавить volatile, при прямом обращении все
нормально, а если в таком применении, то без volatile не работает. В заголовках все регистры определены как __IO uint32_t, а __IO дефайнится как volatile.
RV_STATIC_INLINE uint32_t delta(uint32_t t0, uint32_t t1)
{
return (t1-t0);
}
void _delay_us(uint32_t us)
{
uint32_t t0 = *(uint32_t*)(&TIM5->CNT);
while (delta(t0, *(uint32_t*)(&TIM5->CNT)) < us);
}