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

ADC Dual interleaved mode

Добрый день! Столкнулся с некорректным поведением ADC/DMA  в контроллере STM32F407, судя по перерытым мною форумам, проблема не только этого камня. Если использовать ADC с DMA  в режиме Dual или Triple interleaved mode то все корректно срабатывает только один раз после старта контроллера в дальнейшем можно сколько угодно раз перезапускать ADC данных с него не будет. Я уже попробовал все, что смог найти на просторах интерентов, результата никого. Кто-нибудь поделитесь опытом использования этого режима АЦП, как вы его правильно останавливаете и запускаете.

Упрощенный код для Dual:

Spoiler
If(нажата кнопка 1)

{

HAL_ADC_Start(&hadc2);                                
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)&adc_buf, BUFSIZE);
}

If(нажата кнопка 2)

{

HAL_ADCEx_MultiModeStop_DMA(&hadc1);

HAL_ADC_Stop(&hadc2);

// Обработка данных

}

Все это работает только один раз.

Пробовал перед стартом переинициализировать периферию:

HAL_DMA_Init(&hdma_adc1);

HAL_ADC_Init(&hadc1);

HAL_ADC_Init(&hadc2);

Такое решение встречал на англоязычных форумах:

CLEAR_BIT(hadc1.State, HAL_ADC_STATE_ERROR_DMA);

После остановки АЦП так  делал:

HAL_DMA_Abort(&hdma_adc1);

Конечно, встречал записи, что  это проблемы HAL, но повторюсь один раз все работает корректно. И размер буфера значения не имеет, при первом запуске ADC выдаст установленное количество данных и они будет корректные, никаких потерь, проверял и в Dual и в Triple mode.

Изменено пользователем haker_fox
Отформатировал текст! Впредь делайте это самостоятельно!

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


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

29 минут назад, lomy сказал:

все корректно срабатывает только один раз после старта контроллера в дальнейшем можно сколько угодно раз перезапускать ADC данных с него не будет

А отладчиком пробовали пользоваться, что бы посмотреть в каком он состоянии? Он циклится или зависает?

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


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

1 час назад, HardEgor сказал:

А отладчиком пробовали пользоваться, что бы посмотреть в каком он состоянии? Он циклится или зависает?

Из странностей в отладчике я вижу, что ADC2 выставляет флаг переполнения OVR, очевидно это происходит по окончании преобразования, т.к. данные идут без потерь, ADC/DMA не останавливаются пока не заполнят весь массив. Но т.к. перед повторным запуском используется

HAL_ADCEx_MultiModeStop_DMA(&hadc1);

HAL_ADC_Stop(&hadc2);

то все флаги ошибок обнуляются, в отладчике все биты при первом и повторном запуске ADC и DMA одинаковы.

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


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

Проблема решена. Эта ситуация описана в Reference manual -> ADC -> Interleaved mode -> Dual ADC mode -> Note:

Спойлер

If the conversion sequence is interrupted (for instance when DMA end of transfer occurs),
the multi-ADC sequencer must be reset by configuring it in independent mode first (bits
DUAL[4:0] = 00000) before reprogramming the interleaved mode.
Аналогично для Triple ADC mode.

Соответственно перед повторным запуском ADC нужно сделать так:

          ADC->CCR &= ~(ADC_CCR_MULTI);
          ADC->CCR |= ADC_DUALMODE_INTERL;
          ADC->CCR &= ~(ADC_CCR_DMA);
          ADC->CCR |= ADC_DMAACCESSMODE_2;

Решение нашел здесь: https://community.st.com/t5/stm32-mcus-products/adc-in-dual-interleaved-mode-with-normal-dma-buffer/td-p/279239

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


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

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

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

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

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

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

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

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

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

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