Перейти к содержанию
    

STM32 ADC DMA

Проц STM32F103C8T6

 

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

 

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

 

#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 и игнорирую нулевой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в том, что читаются не ADC12_IN1...ADC12_IN3, а читаются ADC12_IN0...ADC12_IN2

Ты начал с SQ2, в SQ1 остался 0, а SQ4 оказался лишним, вот и получаются каналы 0..2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Где ADC_SQR3_SQ1_x?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Где 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например.

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

 

Неправильно я понимал эту настройку каналов.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...