Jump to content
    

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, перезапуская его там-же, это тоже было бы понятно.  Но вот такое как там я что-то не понял.

 

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

28 minutes ago, Sverchok said:

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

13 hours ago, Obam said:

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

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

 

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

 

13 hours ago, Obam said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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.

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

Share this post


Link to post
Share on other sites

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


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


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

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

Share this post


Link to post
Share on other sites

17 minutes ago, Obam said:

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.

×
×
  • Create New...