lomy 0 16 ноября, 2023 Опубликовано 16 ноября, 2023 (изменено) · Жалоба Добрый день! Столкнулся с некорректным поведением 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. Изменено 16 ноября, 2023 пользователем haker_fox Отформатировал текст! Впредь делайте это самостоятельно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 16 ноября, 2023 Опубликовано 16 ноября, 2023 · Жалоба 29 минут назад, lomy сказал: все корректно срабатывает только один раз после старта контроллера в дальнейшем можно сколько угодно раз перезапускать ADC данных с него не будет А отладчиком пробовали пользоваться, что бы посмотреть в каком он состоянии? Он циклится или зависает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lomy 0 16 ноября, 2023 Опубликовано 16 ноября, 2023 · Жалоба 1 час назад, HardEgor сказал: А отладчиком пробовали пользоваться, что бы посмотреть в каком он состоянии? Он циклится или зависает? Из странностей в отладчике я вижу, что ADC2 выставляет флаг переполнения OVR, очевидно это происходит по окончании преобразования, т.к. данные идут без потерь, ADC/DMA не останавливаются пока не заполнят весь массив. Но т.к. перед повторным запуском используется HAL_ADCEx_MultiModeStop_DMA(&hadc1); HAL_ADC_Stop(&hadc2); то все флаги ошибок обнуляются, в отладчике все биты при первом и повторном запуске ADC и DMA одинаковы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lomy 0 17 ноября, 2023 Опубликовано 17 ноября, 2023 · Жалоба Проблема решена. Эта ситуация описана в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться