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

 
 
> 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



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

 


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


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