В программном режиме надо каждый раз делать hal adc stop после серии считывания значений. А начинать с hal adc start.. вот такая тупость и проц жрет именно hal adc stop
Я к сожалению пропустил часть разговора и често лень искать, но если я правильно понял, когда вы делаете запуск ADC by soft то вам на каждое преобразование нужно делать ADC_Start -> ADC_Poling ->GetVAlue->Adc_Stop