Так вроде работает. Только здесь был канал 2 и время выборки меньше:
Код
s32 i;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC1->SMPR2=ADC_SMPR2_SMP2_0*2; // 2 = время выборки 13.5 циклов такт частоты АЦП, Rвых <= 11.4 Ком
ADC1->SQR1=ADC_SQR1_L_0*(1-1); // 1 = кол-во каналов
ADC1->SQR3=ADC_SQR3_SQ1_0*2; // 2 = канал номер 2
ADC1->CR1=0;
ADC1->CR2=ADC_CR2_EXTSEL_0*7 | // 7 = программный старт АЦП с помощью ADC_CR2_SWSTART
ADC_CR2_EXTTRIG; // разрешить запуск, в том числе программный запуск
ADC1->CR2 |= ADC_CR2_ADON; // включить
ADC1->CR2 |= ADC_CR2_RSTCAL; // сбросить калибровку
i=0;
while(i<10000 && (ADC1->CR2 & ADC_CR2_RSTCAL)) i++; // дождаться пока сбросится
ADC1->CR2 |= ADC_CR2_CAL; // калибровка
i=0;
while(i<10000 && (ADC1->CR2 & ADC_CR2_CAL)) i++; // дождаться
потом
Код
ADC1->SR = ~ADC_SR_EOC;
ADC1->CR2 |= ADC_CR2_EXTTRIG|ADC_CR2_SWSTART; // начать преобразование
i=0;
while((!(ADC1->SR & ADC_SR_EOC)) && i<1000) i++; // конец преобразования - сбрасывается при чтении ADC_DR
acp_d = ADC1->DR; // результат АЦП