Jump to content
Smith2007

STM32F103: ADC+DMA

Recommended Posts

Была аналогичная проблема с STM32F373 и SDADC. Разбираться было некогда. Попробуйте обработать ошибку в прерывании DMA. Если DMA пропускает запрос от периферии он должен выставить флаг ошибки.

Share this post


Link to post
Share on other sites
2 минуты назад, snn_krs сказал:

Попробуйте обработать ошибку в прерывании DMA. Если DMA пропускает запрос от периферии он должен выставить флаг ошибки

Пробовал. DMA не выставляет флаг ошибки и в прерывание не попадаю.

Share this post


Link to post
Share on other sites
40 минут назад, Smith2007 сказал:

Я думаю, что ДМА счетчик не сдвинул как раз. Пропустил запрос от ADC. 

Так вы же написали, что 1 канал АЦП пишет во вторую ячейку. Выходит счетчик как раз сдвинут а данные с прошлого канала.

47 минут назад, Smith2007 сказал:

но данные поместил уже не во второй элемент массива, а в первый.

ну исходя из превого поста все на оборот) Но тут вам виднее, вы дебажили.

 

Share this post


Link to post
Share on other sites

Как сделать ИП с ультрашироким диапазоном?

Ключевыми особенностями высоковольтных SiC MOSFET Wolfspeed являются малое сопротивление канала в открытом состоянии и минимальное значение паразитных емкостей, что позволяет максимально снизить статические и динамические потери, и, соответственно, увеличить рабочую частоту преобразователей.

Подробнее

Это не пропуск запроса от АЦП. Это приход лишних запросов.

Стоит очень внимательно проанализировать все возможные пути запуска преобразования у АЦП.

И весь код работы с таймерами №2 и №4, если они используются.

Ноги у проблемы отсюда растут. Где-то лишние запуски генерируются.

Ну и судя по этой строке
 

ADC1->CR2 |= ADC_CR2_EXTTRIG;		//ADC_CR2_SWSTART;

АЦП должно начинать новое преобразование сразу же по окончанию предыдущего.

Только вот настройки EXTSEL битов на работу с SWSTART событием я в коде не вижу.

Edited by Вуйко

Share this post


Link to post
Share on other sites

Вебинар «Практика разработки IoT-устройств с BlueNRG-LP – волшебной палочкой разработчика» (23/03/2021)

Приглашаем 23 февраля на бесплатный практический вебинар по BlueNRG-LP - новой SoC STMicroelectronics. Будут рассмотрены новые возможности создания прототипов IoT-устройств на BlueNRG-LP с использованием экосистемы и отладочных средств ST, а также практические примеры по использованию BlueNRG-GUI v.4.0.0, настройке и работе в сети BLE-MESH, пример управления умным домом с помощью BlueNRG-LP и другие.

Подробнее

4 часа назад, Вуйко сказал:

Только вот настройки EXTSEL битов на работу с SWSTART событием я в коде не вижу.

Добавил настройку, но ни чего не поменялось.

void Init_ADC_DMA(void) {

	
	uint32_t pin;
	
	// Включаем тактирование GPIOA, AFIO, ADC1
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_ADC1EN;
		
	RCC->CFGR |= RCC_CFGR_ADCPRE_DIV8;	//Предделитель АЦП 72/6 = 12 МГц
	
	// Очистим настройки пинов. Нулевое значение соответствует Input Analog
	GPIOA->CRL &=  ~(	GPIO_CRL_CNF0 | GPIO_CRL_MODE0
									| GPIO_CRL_CNF1 | GPIO_CRL_MODE1
									| GPIO_CRL_CNF5 | GPIO_CRL_MODE5
									| GPIO_CRL_CNF6 | GPIO_CRL_MODE6
									| GPIO_CRL_CNF7 | GPIO_CRL_MODE7 );
	
	// Настройка DMA1
	RCC->AHBENR |= RCC_AHBENR_DMA1EN;					// Включаем тактирование DMA1
	
	// Deinit DMA1 Channel1
	DMA1_Channel1->CCR &= ~DMA_CCR1_EN;		// Отключаем DMA1 CH1
	//DMA1_Channel1->CCR = 0;								// Reset DMA1 Channel1 control register
	DMA1->IFCR |= DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1; // Reset interrupt pending bits for DMA1 Channel1

	// Настраиваем DMA
	DMA1_Channel1->CNDTR = ADC_COUNT;							// Количество передаваемых данных
	DMA1_Channel1->CPAR = (uint32_t) &(ADC1->DR );// Адрес перифирии
	DMA1_Channel1->CMAR = (uint32_t) arrSignal;		// Адрес памяти
	DMA1_Channel1->CCR 	|= DMA_CCR1_MINC					// Инкремент памяти
											| DMA_CCR1_PSIZE_0				// Режим периферии 16 бит
											| DMA_CCR1_MSIZE_0				// Режим памяти 16 бит
											| DMA_CCR1_PL_1						// Channel Priority level hight
											| DMA_CCR1_CIRC						// Circular mode
											| DMA_CCR1_TEIE						// Transfer error interrupt enable
											| DMA_CCR1_TCIE;					// Transfer complete interrupt enable
  DMA1_Channel1->CCR |= DMA_CCR1_EN;						// Включаем DMA1 Channel3

	// Очистим настройки ADC1
	ADC1->CR1 = 0;
	ADC1->CR2 = 0;
	ADC1->SMPR2 = 0;
	ADC1->SQR1 = 0;
	ADC1->SQR2 = 0;
	ADC1->SQR3 = 0;
	
	// Настраиваем ADC1
	ADC1->CR1 |= ADC_CR1_SCAN;		// Scan mode
	ADC1->CR2 |= ADC_CR2_CONT;		// Continuous Conversion
	ADC1->CR2 |= ADC_CR2_DMA;			// DMA mode
	ADC1->CR2 |= ADC_CR2_TSVREFE;	// Temperature Sensor and VREFINT Enable
	ADC1->CR2 |= ADC_CR2_EXTSEL;
	ADC1->CR2 &= ~ADC_CR2_ALIGN;	// Data Alignment
	ADC1->SQR1 |= ((uint32_t)(ADC_COUNT - 1) << 20);			// Сканируем 6 каналов (6-1 = 5)
	
	// Настройка семплирования. Номер канала совпадает с номером пина
	ADC1->SMPR2 |= ADC_SMPR2_SMP0;	// Channel 0 Sample time selection 111: 239.5 cycles
	ADC1->SMPR2 |= ADC_SMPR2_SMP1;	// Channel 1 Sample time selection 111: 239.5 cycles
	ADC1->SMPR2 |= ADC_SMPR2_SMP5;	// Channel 2 Sample time selection 111: 239.5 cycles
	ADC1->SMPR2 |= ADC_SMPR2_SMP6;	// Channel 3 Sample time selection 111: 239.5 cycles
	ADC1->SMPR2 |= ADC_SMPR2_SMP7;	// Channel 4 Sample time selection 111: 239.5 cycles
	ADC1->SMPR1 |= ADC_SMPR1_SMP16;	// Channel 5 Sample time selection 111: 239.5 cycles
	
	// Настройка пинов
	pin = 0x00;
	ADC1->SQR3 |= (pin << (5 * 0));			// Pin0
	pin = 0x01;
	ADC1->SQR3 |= (pin << (5 * 1));			// Pin1
	pin = 0x06;
	ADC1->SQR3 |= (pin << (5 * 2));			// Pin5
	pin = 0x07;
	ADC1->SQR3 |= (pin << (5 * 3));			// Pin6
	pin = 0x05;
	ADC1->SQR3 |= (pin << (5 * 4));			// Pin7
	pin = 0x10;
	ADC1->SQR3 |= (pin << (5 * 5));			// Pin16 - Температурный сенсор
	
	ADC1->CR2 |= ADC_CR2_ADON;		// A/D Converter ON / OFF

	// Обнуляем калибровку
  ADC1->CR2 |= ADC_CR2_RSTCAL; 
  while (ADC1->CR2 & ADC_CR2_RSTCAL);

  //запускаем калибровку и ждем ее завершение
  ADC1->CR2 |= ADC_CR2_CAL; 
  while (ADC1->CR2 & ADC_CR2_CAL);

	ADC1->CR2 |= ADC_CR2_EXTTRIG;		//ADC_CR2_SWSTART;
	//ADC1->CR2 |= ADC_CR2_DMA;				// DMA mode
	ADC1->CR2 |= ADC_CR2_SWSTART;
}

 

2019-11-16_04-49-43.png

Share this post


Link to post
Share on other sites

Материалы вебинара Практическое использование TrustZone в STM32L5

Материалы вебинара, посвященного экосистеме безопасности и возможностях, которые дает новая технология TrustZone в МК STM32L5, содержат две подробные практические работы: создание простого приложения с изоляцией в TrustZone, и пример отладки и тестирования TFM-SBSFU. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

Столкнулся с такой же проблемой в своем проекте на F030F4P6, при передаче из ADC по DMA в массив из 3-х значений они записывались со смещением по кругу на единицу. В моём случае это было вызвано тем, что после инициализации  DMA, в момент установки бита EN в DMA, в нулевой элемент массива записывалось какое-то значение, а счетчик транзакций CNDTR1 уменьшался на 1. Для себя решил проблему так: DMA EN=0, установка корректного CNDTR1, DMA EN=1. После этого всё пишется правильно 

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Скажите пожалуйста,резисторы какого сопротивления оптимально поставить в исток irfp260 транзисторов для активной нагрузки?  Я так понимаю чем номинал больше тем меньше нагрев транзисторов ,больше ни на что они же не влияют? (плавность регулировки например)
    • как может показаться простым таракан с 36 ногами? А еще страшнее увидить даташит на него. Аще жесть  
    • Пожалуй, это единственное устройство, удовлетворяющее всем требованиям, - и бюджетное, и автономное, и точное. Учитывая медленность процесса заиливания, проверка раз в год вручную не сравнится по стоимости и точности ни с чем другим.
    • Нет, ну если купить динамики от утопий... то конечно , хоть 113 порядком... Им с погреба видней. Там ведь динамики подбираются заранее, все параметры известны, частота раздела тоже, и т.д.  Сопрягаются на раз-два.  Там 6й порядок скорее для подавления гармоник (не искажений а комбинационных частот), чем для стыковки динамиков.  А тут - сопряжение случайных динамиков с ХЗ какими параметрами, в домашних условиях.  Сравнение не равноправное.  Причём если мы переделываем уже готовые колонки, то порядки у всех фильтров должны быть одинаковые.  Гонял я на ГКЧ переходную характеристику 4й - 4й порядок  два дина с разной апертурой. у себя в лаборатории. О результатах промолчу, дабы не подливать масла в огонь. Да и кто поверит? Здесь все всё сами знают. Скажем, мне лично не понравилось. Скажу только что чем выше порядок, тем точнее должна быть настройка, иначе... Так что для дома рекомендовать не могу.  Да и  цель - не обидеть фирмы, а сделать всё как можно проще. Хобби такое. Да и некоторые фирмы наоборот делают с большим перекрытием полос. Те же колонки "2,5 полосные, 3,5 полосные " означает перекрытие в полполосы. Так что всё делается по-разному. В данном конкретном случае - ШП динамик, который резко обрезать нежелательно. В противном случае надо применять специализированный СЧ.
    • Все проверил, умер транзистор который подавал питание со стабилизатора на кулер, после замены все заработало. Всем огромное спасибо за помощь и наставления на верный путь!
×
×
  • Create New...