Тема конечно очень старая. Но мне помогла, дала пинок в нужном направлении. Я аналогичным образом тупил и очень долго. Только на ST не стал мысленно гнать. Давно уже понял, что 99,(9)% глюков камня в голове у программера. Как всегда, надо читать мануал. В нем в нескольких местах написано, что порядок чтения регистров ADC_DRH и ADC_DRL, зависит от состояния бита ALIGN регистра ADC_CR2. А именно, если выравнивание результата АЦП настроено по правому краю, то сначала читается младший байт и наоборот. И это не касается буферных регистров результата АЦП.
А я скопипастил кусок кода из своего другого проекта, который точно работал, и даже не думал что с ним может быть что-то не так, вот только в том проекте выравнивание было по другой стороне.
В общем не могу не добавить, может кому-то пригодится.