реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32 ADC DMA, как НЕ читать нулевой канал
*Leks*
сообщение Feb 26 2018, 05:57
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 28-01-06
Из: Москва
Пользователь №: 13 719



Проц 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 и игнорирую нулевой.
Go to the top of the page
 
+Quote Post
Reflector
сообщение Feb 26 2018, 06:39
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836



Цитата(*Leks* @ Feb 26 2018, 08:57) *
Проблема в том, что читаются не ADC12_IN1...ADC12_IN3, а читаются ADC12_IN0...ADC12_IN2

Ты начал с SQ2, в SQ1 остался 0, а SQ4 оказался лишним, вот и получаются каналы 0..2.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 26 2018, 06:51
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вы начинаете настройку последовательности со второй позиции. В первой по умолчанию ноль, вот и получается так.

Где ADC_SQR3_SQ1_x?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
*Leks*
сообщение Feb 26 2018, 07:10
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 28-01-06
Из: Москва
Пользователь №: 13 719



Цитата(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
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 26 2018, 07:44
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например.
Go to the top of the page
 
+Quote Post
*Leks*
сообщение Feb 26 2018, 08:04
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 28-01-06
Из: Москва
Пользователь №: 13 719



Цитата(ViKo @ Feb 26 2018, 10:44) *
В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например.

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

Неправильно я понимал эту настройку каналов.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 02:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016