В основном коде включаю порт А:
Код
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
Код
void AdcInit(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта PORT A
//Конфигурирование PORT PA.3 - аналоговый вход
GPIOA->CRL &= ~GPIO_CRL_MODE3; //Очистить биты MODE
GPIOA->CRL &= ~GPIO_CRL_CNF3; //Очистить биты CNF
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //подаем тактирование АЦП
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //входной делитель
ADC1->CR1 = 0; //
ADC1->SQR1 = 0; //
ADC1->CR2 |= ADC_CR2_CAL; //запуск калибровки
while (!(ADC1->CR2 & ADC_CR2_CAL)){}; //ждем окончания калибровки
ADC1->CR2 = ADC_CR2_EXTSEL; //выбрать источником запуска разряд SWSTART
ADC1->CR2 |= ADC_CR2_EXTTRIG; //разр. внешний запуск регулярного канала
ADC1->CR2 |= ADC_CR2_CONT; //режим непрерывного преобразования
/* Задаем длительность выборки */
ADC1->SMPR2 |= (ADC_SMPR2_SMP4_2 | ADC_SMPR2_SMP4_1 | ADC_SMPR2_SMP4_0);
ADC1->SQR3 = 3; //загрузить номер канала
ADC1->CR2 |= ADC_CR2_ADON; //включить АЦП
ADC1->CR2 |= ADC_CR2_SWSTART; //запустить процес преобразования
}
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта PORT A
//Конфигурирование PORT PA.3 - аналоговый вход
GPIOA->CRL &= ~GPIO_CRL_MODE3; //Очистить биты MODE
GPIOA->CRL &= ~GPIO_CRL_CNF3; //Очистить биты CNF
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //подаем тактирование АЦП
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //входной делитель
ADC1->CR1 = 0; //
ADC1->SQR1 = 0; //
ADC1->CR2 |= ADC_CR2_CAL; //запуск калибровки
while (!(ADC1->CR2 & ADC_CR2_CAL)){}; //ждем окончания калибровки
ADC1->CR2 = ADC_CR2_EXTSEL; //выбрать источником запуска разряд SWSTART
ADC1->CR2 |= ADC_CR2_EXTTRIG; //разр. внешний запуск регулярного канала
ADC1->CR2 |= ADC_CR2_CONT; //режим непрерывного преобразования
/* Задаем длительность выборки */
ADC1->SMPR2 |= (ADC_SMPR2_SMP4_2 | ADC_SMPR2_SMP4_1 | ADC_SMPR2_SMP4_0);
ADC1->SQR3 = 3; //загрузить номер канала
ADC1->CR2 |= ADC_CR2_ADON; //включить АЦП
ADC1->CR2 |= ADC_CR2_SWSTART; //запустить процес преобразования
}
А вот подключить второй АЦП и заставить его работать в инжекторном режиме не получается.
Нужно считывать периодически 4 канала (на каждый подключено Vcc через кнопки), таким образом с АЦП по каждому каналу нужно проверять есть ли Vcc или нет.
Вот код для инициализации АЦП2:
Код
void AdcInjInit(void)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; //подаем тактирование АЦП
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //входной делитель
ADC2->CR1 = 0; //предочистка регистра
ADC2->CR2 |= ADC_CR2_CAL; //запуск калибровки
while (!(ADC2->CR2 & ADC_CR2_CAL)){}; //ждем окончания калибровки
ADC2->CR2 = ADC_CR2_JEXTSEL; //выбрать источником запуска разряд JSWSTART
ADC2->CR2 |= ADC_CR2_JEXTTRIG; //разр. внешний запуск инжектированной группы
ADC2->CR2 |= ADC_CR2_CONT; //режим непрерывного преобразования
ADC2->CR1 |= ADC_CR1_SCAN; //режим сканирования (т.е. несколько каналов)
ADC2->CR1 |= ADC_CR1_JAUTO; //автомат. запуск инжектированной группы
ADC2->JSQR = (uint32_t)(4-1)<<20; //задаем количество каналов в инжектированной группе
ADC2->JSQR |= (uint32_t)10<<(5*0); //номер канала для первого преобразования (10)
ADC2->JSQR |= (uint32_t)11<<(5*1); //номер канала для второго преобразования (11)
ADC2->JSQR |= (uint32_t)12<<(5*2); //номер канала для третьего преобразования
ADC2->JSQR |= (uint32_t)13<<(5*3); //номер канала для четвертого преобразования
ADC2->CR2 |= ADC_CR2_ADON; //включить АЦП
ADC2->CR2 |= ADC_CR2_JSWSTART; //запустить процес преобразования
}
{
RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; //подаем тактирование АЦП
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //входной делитель
ADC2->CR1 = 0; //предочистка регистра
ADC2->CR2 |= ADC_CR2_CAL; //запуск калибровки
while (!(ADC2->CR2 & ADC_CR2_CAL)){}; //ждем окончания калибровки
ADC2->CR2 = ADC_CR2_JEXTSEL; //выбрать источником запуска разряд JSWSTART
ADC2->CR2 |= ADC_CR2_JEXTTRIG; //разр. внешний запуск инжектированной группы
ADC2->CR2 |= ADC_CR2_CONT; //режим непрерывного преобразования
ADC2->CR1 |= ADC_CR1_SCAN; //режим сканирования (т.е. несколько каналов)
ADC2->CR1 |= ADC_CR1_JAUTO; //автомат. запуск инжектированной группы
ADC2->JSQR = (uint32_t)(4-1)<<20; //задаем количество каналов в инжектированной группе
ADC2->JSQR |= (uint32_t)10<<(5*0); //номер канала для первого преобразования (10)
ADC2->JSQR |= (uint32_t)11<<(5*1); //номер канала для второго преобразования (11)
ADC2->JSQR |= (uint32_t)12<<(5*2); //номер канала для третьего преобразования
ADC2->JSQR |= (uint32_t)13<<(5*3); //номер канала для четвертого преобразования
ADC2->CR2 |= ADC_CR2_ADON; //включить АЦП
ADC2->CR2 |= ADC_CR2_JSWSTART; //запустить процес преобразования
}
и забираю таким способом:
Код
short adc_btn1 = ADC2->JDR1;
short adc_btn2 = ADC2->JDR2;
short adc_btn3 = ADC2->JDR3;
short adc_btn4 = ADC2->JDR4;
short adc_btn2 = ADC2->JDR2;
short adc_btn3 = ADC2->JDR3;
short adc_btn4 = ADC2->JDR4;
Но на выходе почему то всегда значения 25-28 в не зависимости от нажатия кнопок.