The ADC is basically a simple sequential machine, there is hardly anything that can "get stuck".
In my experience, there are 3 issues that might cause the observed behavior.
1. Overvoltage at the inputs. Check that you never ever exceed the maximum allowed input voltage in analog mode, perhaps clamp the inputs if necessary. I had been observing very strange behavior in such cases on a wide variety of devices over the years.
2. Unhandled interrupts. Check that all enabled interrupt events are handled, including overflow and threshold compare. If set, always clear this flags in the handler.
3. Time overrun in the ADC/DMA handler. Avoid too much code in interrupt context, especially code that relies on other interrupts. Especially, never call printf (semihosting) functions in interrupt context. Use flags to do core-intensive operations in normal user context.
I suspect issue 3 most likely applies to your case.