Уточню то, что не даёт покоя: SystemClockSpeed - динамическая
величина? Если даже так, вряд ли она произвольные значения
принимает. Понимаю, что ситуация уже решена; я ход мыслей при
написании кода понять затрудняюсь. И даже так, как у вас "правильно
было так" - странно: DSFSMtimer += (uint32_t)(500e-3 * SystemClockSpeed);
// SystemClockSpeed сначала преобразуется double,
// потом умножение, преобразование в целое.
const uint32_t _time_500sm = 500e-3 * SystemClockSpeed; // Если тактовая - константа.
DSFSMtimer += _time_500ms;
// Ещё вариант: исхожу из того, что тип тактовой - целочисленный.
DSFSMtimer += SystemClockSpeed * 500 / 1000; // в миллисекундах.
Если что - без болванчика набросал, но верить не принуждаю. (-: