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

STM32L1 ADC + DMA

Я может раньше не в том разделе спросил, может тут кто подскажет.

  ---------------------------------------------

Рассматриваю тут исходники одного девайса, и есть вопросы.

Чип - STM32L151, используется два входа АЦП, преобразование складыват результаты в две переменные в прерывании СисТика.

В начале, в main, запускается преобразование:

vu16 ADCRes[2];         // ADC Results from DMA
	 
	.........
    
  MX_DMA_Init();    
  MX_ADC_Init();
  HAL_ADC_Start_DMA(&hadc, (uint32_t *)ADCRes, 2);   
	

Затем в систике значения с АЦП накапливаются в двух переменных и когда-то потом используются:

u32    ADC1Res=0, ADC2Res=0; // ADC integrators
...
void HAL_SYSTICK_Callback(void){
         ADC1Res +=ADCRes[0];
         ADC2Res +=ADCRes[1];
         HAL_ADC_Start(&hadc); // next convertion  <<<<<<<<<<<<< (1)
 

 

Иициализация DMA НЕ циклическая!

  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE;
  hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE;
  hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
  hadc.Init.ContinuousConvMode = DISABLE; // <<<<<<<<<<<<<<<<<<<<<<< (2)
  hadc.Init.NbrOfConversion = 2;
  hadc.Init.DiscontinuousConvMode = ENABLE;
  hadc.Init.NbrOfDiscConversion = 2;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = ENABLE;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
	

 

Собственно вопрос - "а что, так можно было?!"(с)

То есть, почему в (1) стоит HAL_ADC_Start а не HAL_ADC_Start_DMA  и как оно при этом работает ?!

Почему HAL_ADC_Start запускает DMA? А если оно DMA не запускает, то как результат двух преобразований попадает в ADCRes[] ?

---------------------------------------------

P.S. Если я комментирую (1) и в (2) меняю дизейбл на энейбл - все работает в циклическом режиме, но это тривиально.

Читали бы в прерывании по концу DMA, перезапуская его там-же, это тоже было бы понятно.  Но вот такое как там я что-то не понял.

 

 

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


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

8 часов назад, Allregia сказал:

P.S. Если я комментирую (1) и в (2) меняю дизейбл на энейбл - все работает в циклическом режиме, но это тривиально.

Вот тут не очень понятно, (2) не влияет на режим работы DMA. Может у вас все таки DMA а циклическом режиме настроен? Покажите настройку самого DMA.

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


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

28 minutes ago, Sverchok said:

Может у вас все таки DMA а циклическом режиме настроен?

Это не у меня, чужой код.

DMA да, он там в цикулическом, но ведь его кто-то дергать должен? 

А АЦП не в циклическом. Т.е. по идее сделал два преобразования (дергая каждый раз DMA и дальше должен ждать следующего запуска?

 

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


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

DMA да, он там в цикулическом, но ведь его кто-то дергать должен?

Вот АЦП и будет его "пинать", если ПДП (DMA) настроен на работу с АЦП. ПДП забирает готовые данные: пока их нет он будет "неподвижен".

А АЦП не в циклическом. Т.е. по идее сделал два преобразования (дергая каждый раз DMA и дальше должен ждать следующего запуска?
Ну да. У АЦП только выходной регистр с полученным результатом, куда оно потом - это АЦП не знает... Отсутствие overrun обеспечивает ПДП.

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


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

13 hours ago, Obam said:

Вот АЦП и будет его "пинать",

А его самого  кто "пинает"?

 

Тут-же не ПДП говорит АЦП: "дай мне данных", а наоборот, это  АЦП говорит ПДП: "у меня данные готовы, забери".

 

13 hours ago, Obam said:

Ну да. У АЦП только выходной регистр с полученным результатом, куда оно потом - это АЦП не знает...

Ззато он "значет", что надо взвести про бит запуска ПДП после преобращзования.

И если АЦП не в циклическом, то после окончания преобразования заданной ему цепочки каналов, он должен остановится.

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


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

On 4/19/2024 at 9:24 AM, Allregia said:

А его самого  кто "пинает"?

Вон же у вас в обработчике прерывания SysTick каждый раз запускается АЦП.

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


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

11 часов назад, Allregia сказал:

DMA да, он там в цикулическом, но ведь его кто-то дергать должен? 

HAL_ADC_Start(&hadc) в функции HAL_SYSTICK_Callback(void) запускает АЦП, а DMA уже и так настроен. В результате после завершения преобразования он скопирует данные из регистров АЦП в память.

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


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

3 hours ago, dimka76 said:

Вон же у вас в обработчике прерывания SysTick каждый раз запускается АЦП.

Да, но он запускается как HAL_ADC_Start а не как HAL_ADC_Start_DMA.

Вот это меня с толку и сбивает.

2 hours ago, Sverchok said:

запускает АЦП, а DMA уже и так настроен.

 

Наверное Вы правы - первый раз HAL_ADC_Start_DMA все настроил и запустил, а потом уже достаточно и простого HAL_ADC_Start.

Я эти калокубовуские функции не очнь копал, у меня чаще всего один раз при старте все запускается циклически ("выстрелил-забыл"), а я уже  когда мне надо, беру резуьлтаты из памяти.

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


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

Вот АЦП и будет его "пинать",
А его самого кто "пинает"?


О! Уже ответили...


Ззато он "значет", что надо взвести про бит запуска ПДП после преобращзования.
Так выставленный EOC и "пинает" ПДП...

И если АЦП не в циклическом, то после окончания преобразования заданной ему цепочки каналов, он должен остановится.
Он и остановится, разве есть сомнения?

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


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

17 minutes ago, Obam said:

Он и остановится, разве есть сомнения?

Нет, в этом сомнений небыло 🙂

Сомнения были что HAL_ADC_Start запускает АЦП  ВМЕСТЕ с ПДП, но во 1-х товаришь который это писал - совсем не дурак, а во 2-х. и главное - что оно работет. Просто я обычно делал по другому.

Ну в общем, вопрос исчерпан.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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