реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F446 ADC:как правильно останавливать циклическое преобразование с DMA
Timmy
сообщение Jul 27 2017, 19:43
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Обнаружилась любопытная особенность:
Если снять флаги ADC_CR2_DMA|ADC_CR2_DDS(наверное, достаточно только DMA) при работающем АЦП, то возможно "подвисание" соответствующего канала DMA, при котором флаг DMA_SxCR_EN нельзя будет сбросить путём записи в CR(можно только через общий сброс). Вероятно, подвисание происходит при наложении записи в ADC_CR2 нового значения со сброшенными флагами DMA|DDS и выдачи очередного запроса DMA по завершению преобразования, так как подвисание носит случайный характер, и возникает редко.

Например, чтобы правильно остановить циклическое преобразование из одного канала АЦП с кольцевым DMA буфером нужно:
-снять флаг ADC_CR2_CONT
-подождать по таймеру не менее времени одного преобразования АЦП(что очень мило, так как сам АЦП не умеет корректно сообщать, когда он закончил работу).
-снять флаги ADC_CR2_DMA и ADC_CR2_DDS
-снять в DMA флаг DMA_SxCR_EN.

А если снимать ADC_CR2_DMA и ADC_CR2_DDS одновременно с ADC_CR2_CONT, то будет глюк.

Кстати, насколько я понимаю, в любимом многими HAL предусмотрен останов циклического преобразования только путём выключения и включения АЦП, что гораздо дольше, так как при этом реально аналоговое питание АЦП дёргается.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01345 секунд с 7
ELECTRONIX ©2004-2016