Обнаружилась любопытная особенность:
Если снять флаги ADC_CR2_DMA|ADC_CR2_DDS(наверное, достаточно только DMA) при работающем АЦП, то возможно "подвисание" соответствующего канала DMA, при котором флаг DMA_SxCR_EN нельзя будет сбросить путём записи в CR(можно только через общий сброс). Вероятно, подвисание происходит при наложении записи в ADC_CR2 нового значения со сброшенными флагами DMA|DDS и выдачи очередного запроса DMA по завершению преобразования, так как подвисание носит случайный характер, и возникает редко.
Например, чтобы правильно остановить циклическое преобразование из одного канала АЦП с кольцевым DMA буфером нужно:
-снять флаг ADC_CR2_CONT
-подождать по таймеру не менее времени одного преобразования АЦП(что очень мило, так как сам АЦП не умеет корректно сообщать, когда он закончил работу).
-снять флаги ADC_CR2_DMA и ADC_CR2_DDS
-снять в DMA флаг DMA_SxCR_EN.
А если снимать ADC_CR2_DMA и ADC_CR2_DDS одновременно с ADC_CR2_CONT, то будет глюк.
Кстати, насколько я понимаю, в любимом многими HAL предусмотрен останов циклического преобразования только путём выключения и включения АЦП, что гораздо дольше, так как при этом реально аналоговое питание АЦП дёргается.