*Leks* 0 26 февраля, 2018 Опубликовано 26 февраля, 2018 · Жалоба Проц 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 и игнорирую нулевой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reflector 0 26 февраля, 2018 Опубликовано 26 февраля, 2018 · Жалоба Проблема в том, что читаются не ADC12_IN1...ADC12_IN3, а читаются ADC12_IN0...ADC12_IN2 Ты начал с SQ2, в SQ1 остался 0, а SQ4 оказался лишним, вот и получаются каналы 0..2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 26 февраля, 2018 Опубликовано 26 февраля, 2018 · Жалоба Вы начинаете настройку последовательности со второй позиции. В первой по умолчанию ноль, вот и получается так. Где ADC_SQR3_SQ1_x? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*Leks* 0 26 февраля, 2018 Опубликовано 26 февраля, 2018 · Жалоба Вы начинаете настройку последовательности со второй позиции. В первой по умолчанию ноль, вот и получается так. Где 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 1 26 февраля, 2018 Опубликовано 26 февраля, 2018 · Жалоба В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*Leks* 0 26 февраля, 2018 Опубликовано 26 февраля, 2018 · Жалоба В SQ1 занесите номер канала 1, в SQ2 - 2, в SQ3 - 3. Это разные вещи - позиция канала в последовательности и аппаратный номер канала. Вы можете все 16 позиций забить одним номером, например. Да, действительно так заработало! :cheers: Неправильно я понимал эту настройку каналов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться