Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 ADC DMA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
*Leks*
Проц STM32F103C8T6

Пытаюсь в режиме DMA читать каналы ADC12_IN1, ADC12_IN2, ADC12_IN3. При этом читать ADC12_IN0 не нужно.

Настраиваю так:

CODE
#define DMA_BUFF_SIZE 3
uint16_t buff[DMA_BUFF_SIZE];

...


//длина последовательности равна 3, первый канал (010)
ADC1->SQR1 |= ADC_SQR1_L_1; // первый бит установлен в 1
// ADC1->SQR1 &= ~ADC_SQR1_L_0 & ~ADC_SQR1_L_2; // нулевой и второй биты сброшены в 0

// Выбираем последовательность каналов для сканирования

//Bits 4:0 SQ2[4:0]: 1st conversion in regular sequence PA1/ADC12_IN1 pin11
ADC1->SQR3 |= ADC_SQR3_SQ2_0; //1
ADC1->SQR3 &= ~ADC_SQR3_SQ2_1; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ2_2; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ2_3; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ2_4 //0

//Bits 4:0 SQ3[4:0]: 2st conversion in regular sequence PA2/ADC12_IN2 pin 12
ADC1->SQR3 &= ~ADC_SQR3_SQ3_0; //0
ADC1->SQR3 |= ADC_SQR3_SQ3_1; //1
ADC1->SQR3 &= ~ADC_SQR3_SQ3_2; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ3_3; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ3_4; //0

//Bits 4:0 SQ4[4:0]: 3st conversion in regular sequence PA3/ADC12_IN3 pin 13
ADC1->SQR3 |= ADC_SQR3_SQ4_0; //1
ADC1->SQR3 |= ADC_SQR3_SQ4_1; //1
ADC1->SQR3 &= ~ADC_SQR3_SQ4_2; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ4_3; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ4_4; //0



ADC1->CR2 |= ADC_CR2_DMA //включаем работу с DMA
| ADC_CR2_EXTTRIG //включаем работу от внешнего события
| ADC_CR2_EXTSEL //выбираем триггером запуска регулярной последовательности событие SWSTART
| ADC_CR2_JEXTSEL; // выбираем триггером запуска выделенной последовательности событие JSWSTART
ADC1->CR1 |= ADC_CR1_SCAN; // включаем автоматический перебор всех каналов в последовательности



DMA1_Channel1->CPAR = (uint32_t) &ADC1->DR; // Загружаем адрес регистра DR
DMA1_Channel1->CMAR = (uint32_t) &buff[0]; //грузим адрес буфера обмена
DMA1_Channel1->CNDTR = DMA_BUFF_SIZE; //длина буфера
DMA1_Channel1->CCR |= DMA_CCR1_MINC //инкремент адреса памяти
| DMA_CCR1_PSIZE_0 //размерность данных периферии 16 бит
| DMA_CCR1_MSIZE_0 //размерность данных памяти 16 bit
| DMA_CCR1_CIRC; // закольцевать буфер

//макросы для включения/выключения АЦП с DMA
ADC1->CR2 |= ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_SWSTART;

DMA1_Channel1->CCR |= DMA_CCR1_EN; //включаем преобразование и прерывание DMA


Проблема в том, что читаются не ADC12_IN1...ADC12_IN3, а читаются ADC12_IN0...ADC12_IN2
Получается, что нулевой канал включен по умолчанию, т.к. биты ADC_SQR3_SQ1_0 ... ADC_SQR3_SQ1_4 равны нулю. Пробовал в них записывать единицы - не помогает. Всё равно читает этот IN0 канал, но в результат равен нулю.

Как сделать так, чтобы в режиме DMA этот нулевой канал вообще не читался? Пока в виде костыля читаю четыре канала IN0...IN3 и игнорирую нулевой.
Reflector
Цитата(*Leks* @ Feb 26 2018, 08:57) *
Проблема в том, что читаются не ADC12_IN1...ADC12_IN3, а читаются ADC12_IN0...ADC12_IN2

Ты начал с SQ2, в SQ1 остался 0, а SQ4 оказался лишним, вот и получаются каналы 0..2.
AHTOXA
Вы начинаете настройку последовательности со второй позиции. В первой по умолчанию ноль, вот и получается так.

Где ADC_SQR3_SQ1_x?
*Leks*
Цитата(AHTOXA @ Feb 26 2018, 09:51) *
Вы начинаете настройку последовательности со второй позиции. В первой по умолчанию ноль, вот и получается так.

Где ADC_SQR3_SQ1_x?

Нулями этот канал включается. Как надо начать с первой позиции, чтобы его отключить? Я подозреваю, что никак.
Так он включается:

Код
  ADC1->SQR3   &= ~ADC_SQR3_SQ1_0;    //0
  ADC1->SQR3   &= ~ADC_SQR3_SQ1_1;    //0
  ADC1->SQR3   &= ~ADC_SQR3_SQ1_2;    //0
  ADC1->SQR3   &= ~ADC_SQR3_SQ1_3;    //0
  ADC1->SQR3   &= ~ADC_SQR3_SQ1_4;    //0
ViKo
В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например.
*Leks*
Цитата(ViKo @ Feb 26 2018, 10:44) *
В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например.

Да, действительно так заработало! cheers.gif

Неправильно я понимал эту настройку каналов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.