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

STM32L1 ADC + DMA

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

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

 

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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