Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Проблема ADC DMA нарушен порядок значений в буфере

Непрочитано 20.03.2019, 14:13  
Y.Logvin
Частый гость
 
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
Y.Logvin на пути к лучшему
Вопрос Проблема ADC DMA нарушен порядок значений в буфере

На stm32f105 столкнулся с косяком.
В MX_ADC1_Init инициализируюся каналы в определенном порядке
Цитата:
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;

sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_2;
...
Потом запускается АЦП.
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1ConvertedValues, ADC_DMA_BUFF_SIZE);

И в ADC1ConvertedValues значение из канала 0 может оказаться на N-ной позиции. Порядок следования при этом не нарушается. Причем стабильно от запуска к запуску.
Стоит внести изменения в код(не всегда) - позиция может поплыть.

Кто то с подобной бедой сталкивался?
Реклама:
Y.Logvin вне форума  
Непрочитано 20.03.2019, 14:39  
my504
Прописка
 
Аватар для my504
 
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
my504 на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

К гадалке не ходи - нет синхронизации старта DMA с селектором каналов.
В результате начало блока плывет по массиву. Примерно тоже самое возникает при приеме пакетов следующих периодически через ДМА УАРТ.
ДМА стартует в момент середины текущего пакета и останавливается в середине следующего...
Еще возможна ошибочная установленная величина счетчика ДМА.

Последний раз редактировалось my504; 20.03.2019 в 14:43.
my504 вне форума  
Непрочитано 20.03.2019, 18:04  
Y.Logvin
Частый гость
 
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
Y.Logvin на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

Сообщение от my504 Посмотреть сообщение
К гадалке не ходи - нет синхронизации старта DMA с селектором каналов.
Оно то так...

В обработчике HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
значение счетчика толком посмотреть не получается hadc-›DMA_Handle-›Instance-›CNDTR.
При каждом следующем останове значение разное(смотрел через промежуточную переменную).

По идее - там всегда должна быть 9ка(использую 9 каналов).

С инициализацией тоже вроде ок - регистр инициализируется значением 9 (в HAL_ADC_Start_DMA).
Y.Logvin вне форума  
Непрочитано 20.03.2019, 18:27  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,860
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

Y.Logvin, тут только анализ кода после компиляции может помочь разобраться.
Листинг кода после препроцессора на входе компилятора и листинг ассемблера.
Попробуйте сделать простой пример на чистом C - все будет нормально работать.
С HAL придётся разбираться со всеми используемыми библиотеками
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 20.03.2019, 20:09  
Y.Logvin
Частый гость
 
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
Y.Logvin на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

В общем отчитываюсь - сам дурак.

Моя ошибка была в том, что сначала вызывал
HAL_ADC_Start(&hadc1),
а потом
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1ConvertedValues, 9)

Нужно наоборот. Т.к. получалось, что АЦП начал перебирать каналы, и DMA цепляется к нему на лету. И там уже как попадет. Странно, что попадало почти всегда в одно место.


P.S. Явно базировался на каком то примере. Кто то мне свинью подложил. Проект начинался давно - хрен найду концы...
Y.Logvin вне форума  
Непрочитано 21.03.2019, 02:27  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,860
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

Y.Logvin, таки анализ кода был верным вектором движения .
А эта ошибка с порядком инициализации DMA и источника/получателя наверное всех посещала
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 21.03.2019, 05:37  
my504
Прописка
 
Аватар для my504
 
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
my504 на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

Сообщение от Y.Logvin Посмотреть сообщение
Явно базировался на каком то примере.
Это прямое следствие использования HAL.
my504 вне форума  
Непрочитано 21.03.2019, 06:36  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

Цитата:
- Хто всравсь?!
- Невiстка!
- Так вона ж теля пасе?!
- Так вiдтiля и несе!
Можно подумать, что без ХАЛа телегу впереди лошади запрячь невозможно!
А возможны перлы и еще смешнее... И не раз это наблюдается.
Не там причины ищете.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 21.03.2019, 11:10  
Y.Logvin
Частый гость
 
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
Y.Logvin на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

Сообщение от my504 Посмотреть сообщение
Это прямое следствие использования HAL.
У меня есть знакомый, который надрачивает на ассемблер. Но пишет почему то на С++.
HAL это полезная штука - позволяет зачастую не ковырятся в кишках. А это ускоряет разработку.
Да и код с HAL-ом понятней.
Я у себя усугубляю - всю работу с периферией прячу в класс Hal.

Ну а накосячить можно было и без него.
Про USART - из своей практики пример?
Y.Logvin вне форума  
Непрочитано 21.03.2019, 13:03  
my504
Прописка
 
Аватар для my504
 
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
my504 на пути к лучшему
По умолчанию Re: Проблема ADC DMA нарушен порядок значений в буфере

Сообщение от Y.Logvin Посмотреть сообщение
Про USART - из своей практики пример?
Это не пример из практики. Это пример ПРОМЕЖУТОЧНОГО результата из моей практики. Когда запускаешь ДМА с УАРТом, то на выходе ЛОГИЧНО имеешь плывущее начало массива. Когда добавляешь механизм стартового поиска - все становится нормально.
Что касается HAL, то дело не в удобстве-неудобстве. Дело в скрытом в чужом коде функционале, который далеко не всегда понятен тому, кто пользуется HAL-ом. Более того, при ошибках алгоритма, результат рассматривается не непосредственно, а через призму HAL. То есть возникает ложное ощущение отсутствия ошибок в вызываемых функциях.
Точно как в случае с ТС.
Если бы он запускал диаграмму работы через CMSIS, то у него не возникло бы желания сначала стартануть АЦП, а лишь потом DMA.
Кстати, вообще то процесс должен быть В ПРИНЦИПЕ ДРУГОЙ.
Цепочка: семплирующий таймер-АЦП-ДМА. Запуск в обратном порядке. Точнее, АЦП-ДМА как угодно, а таймер запускает весь процесс.
my504 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 - Tips 'N Tricks nahimovv ARM 28 14.10.2024 06:42
ADC -> DMA -> UART прерывния pavell ARM 15 23.02.2019 11:11
Проблема ADC на PIC16F887 с TouchPanel AlexGad Микроконтроллеры, АЦП, память и т.д 5 23.05.2012 23:08
STM32 ADC + DMA в циклическом режиме Nik_UFO Микроконтроллеры, АЦП, память и т.д 4 24.02.2012 18:49
проблема с Vista и XP. как изменить порядок загрузки систем? pranikov Ремонт оргтехники 10 30.03.2008 14:22


Часовой пояс GMT +4, время: 18:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.