Simple (probably) question about ADC sampling frequency
You really mustn't do something as complex as an fft in a callback-that breaks basically all timing constraints. Your callback is probably still doing the fft while the next conversion is complete. This alone suffices to break things.
Other than that, on chips like the stm32, interrupts can (and do) have variable latency, and also other interrupts can preempt yours or still be running with a higher priority.
The timer is an actual deterministic element meant for exactly this, triggering things at deterministic intervals. Using it is not only convenient, but the only way to guarantee constant rate of anything in your MCU.