spirit_1 5 18 января, 2023 Опубликовано 18 января, 2023 · Жалоба Портирую проект из СТМ32 на at32f435 все практически получилость без особых проблем, но небольшая загвоздка в режиме ADC_Dual mode +DMA Из примера производителя немного переделал и запустил. Два АДС 1.2 стартуют синхронно и пушут данные через дма в массив. Это работает только один раз. Но повторно запустить я их не могу. В примере нет такого.Только один раз после все инициализации. АЦП работают постоянно(проверял, пишут), Пытался выключать -включать канал ДМА, делать полную инициализацию как в начале, выключать в ДМА все что можно. Без толку. ДМА не пишет в массив .Может у кого есть опыт по этому режиму Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spirit_1 5 30 января, 2023 Опубликовано 30 января, 2023 (изменено) · Жалоба On 1/19/2023 at 3:53 AM, spirit_1 said: Путем некоторых тыков удалось запустить этот режим. Однако сам вариант не совсем хорош. Презапуск заработал только когда в прерывании ДМА сразу останавливаю АЦП, причем даже небольшая задержка переводит ДМА в замороженное состояние из которого можно вывести толлько резетом контроллера Спустя время обнаружилось переодически подвисания, вероятно проскакиевает иногда небольшая задержка в прерывании ДМА что приводит к заморозке Убрал в ДМА проверку на флаг, после этого стабильность возрасла, пока без глюков но сама идея работы в таком режиме хреновая, написал на поддержку, нужна корректная последовательность остановки и перезапуска /==================ADC============================= void DMA2_Channel3_IRQHandler(void) { //if(dma_flag_get(DMA2_FDT3_FLAG) != RESET) //{ // HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST //HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // -в прерывании по заполнению ДМА останавливаем АЦП.. Цикл передачи ДМА закончен adc_enable(ADC1, FALSE); adc_enable(ADC2, FALSE); dma_channel_enable(ADC12_DMA_CHANNEL, FALSE); dma_flag_clear(DMA2_FDT3_FLAG); //HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // } } Изменено 31 января, 2023 пользователем haker_fox Код оформляется с помощью кнопки <> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ksv198 0 30 января, 2023 Опубликовано 30 января, 2023 · Жалоба On 1/18/2023 at 10:53 PM, spirit_1 said: Портирую проект из СТМ32 на at32f435 все практически получилость без особых проблем, но небольшая загвоздка в режиме ADC_Dual mode +DMA Из примера производителя немного переделал и запустил. Два АДС 1.2 стартуют синхронно и пушут данные через дма в массив. Это работает только один раз. Добрый день! А вот это не смотрели? https://www.arterychip.com/en/support/index.jsp?index=2 (AN0011) Там правда контроллер другой, но возможно натолкнёт на мысли. Самого интересует такой режим для Artery, но пока времени нет поэкспериментировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spirit_1 5 30 января, 2023 Опубликовано 30 января, 2023 · Жалоба On 1/30/2023 at 12:31 PM, ksv198 said: Добрый день! А вот это не смотрели? https://www.arterychip.com/en/support/index.jsp?index=2 (AN0011) Там правда контроллер другой, но возможно натолкнёт на мысли. Самого интересует такой режим для Artery, но пока времени нет поэкспериментировать. Да. могу добавить что если перейдете в китайскеую версию сайта , станут доступны другие аппноты на китайской, их там поболее и можно кое что высосать Так же облазил китайский форум на который идет ссылка производителя, ничегно. На форуме в одной теме поднят подобный вопрос без ясного ответа. В аппнотах всех без исключения нет варианта остановки и рестарта сейчас понятно что у меня завелось только а этом режиме /* config common dma request repeat */ adc_common_struct.common_dma_request_repeat_state = TRUE;// Как я понимаю АЦП валит запросы не зависимо от окончания цикла ДМА, по завершении цикла надо успеть остановить в прерывании АЦП между последним и первым запросами ДМА в цикле, если проскочит то зависает Так по нормальному должно быть, тогда АЦП не шлет запросы по окончании цыкла ДМА, adc_common_struct.common_dma_request_repeat_state = FALSE У меня в таком варианте проходит один раз колько ДМА но я не могу перезапустить, надо корректно остановить и потом загрузить новые параметры в ДМА и запустить все АЦП и ДМА как это в СТМ происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 30 января, 2023 Опубликовано 30 января, 2023 · Жалоба Глянул в RefMan вашего at32f435 (у меня v2.02) adc_enable(ADC1, FALSE); это не про остановку АЦП, а про его включение\выключение как блок. Работа останавливается битом ADABRT в регистре ADC_CTRL2, но тут засада - в таблице его нет, полагаю - бит 4. А DMA (или если уж по-русски - ПДП) дёргать вообще не надо: он ведомый, есть результат преобразования - перносит в память, нет результата - будет стоять молча. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spirit_1 5 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба On 1/30/2023 at 10:38 PM, Obam said: Глянул в RefMan вашего at32f435 (у меня v2.02) adc_enable(ADC1, FALSE); это не про остановку АЦП, а про его включение\выключение как блок. Работа останавливается битом ADABRT в регистре ADC_CTRL2, но тут засада - в таблице его нет, полагаю - бит 4. А DMA (или если уж по-русски - ПДП) дёргать вообще не надо: он ведомый, есть результат преобразования - перносит в память, нет результата - будет стоять молча. Note: ADC conversion abort (ADABRT) cannot be used in master/slave mode. In this mode, each of the ADCEN bit of the ADCs must be cleared in order to stop ADC conversions. У меня как раз этот самый master/slave mode/ с битом ADCEN не работает, попробовал , надо именно выключить включить с ДМА вы правы в случае если туда писать ничего не надо, а еслы вы делаете старт с новыми значениями счетчика ДМА и указателем на память что бы изменения вступили в силу надо именно дернуть ДМА Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться