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

at32f435 _> ADC_Dual mode +DMA

Портирую проект  из СТМ32 на at32f435 все практически получилость без особых проблем, но небольшая загвоздка  в режиме ADC_Dual mode +DMA

Из примера  производителя немного переделал и запустил. Два АДС 1.2 стартуют синхронно и пушут данные через дма в массив. Это работает только один раз.

Но повторно запустить я их не могу. В примере нет такого.Только один раз после все инициализации. АЦП работают постоянно(проверял, пишут), Пытался выключать -включать канал ДМА, делать полную инициализацию как в начале, выключать в ДМА все что можно. Без толку. ДМА не пишет в массив .Может у кого есть опыт по этому режиму

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


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

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
 // }
}

 

Изменено пользователем haker_fox
Код оформляется с помощью кнопки <>

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


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

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, но пока времени нет поэкспериментировать.

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


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

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

У меня в таком варианте проходит один раз колько ДМА но я не могу перезапустить, надо корректно остановить и потом загрузить новые параметры  в ДМА и запустить все АЦП и ДМА как это в СТМ происходит. 

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


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

Глянул в RefMan вашего at32f435 (у меня v2.02)
adc_enable(ADC1, FALSE); это не про остановку АЦП, а про его включение\выключение как блок.
Работа останавливается битом ADABRT в регистре ADC_CTRL2, но тут засада - в таблице его нет, полагаю - бит 4.
А DMA (или если уж по-русски - ПДП) дёргать вообще не надо: он ведомый, есть результат преобразования - перносит в память, нет результата - будет стоять молча.

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


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

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 не работает, попробовал , надо именно выключить включить

 

с ДМА вы правы в случае если туда писать ничего не надо, а еслы вы делаете старт с новыми значениями счетчика ДМА и указателем на память  что бы 

изменения вступили в силу надо именно дернуть ДМА

 

 

 

 

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


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

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

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

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

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

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

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

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

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

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