Проблема ADC DMA нарушен порядок значений в буфере
20.03.2019, 14:13
|
|
|
Частый гость
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Проблема 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-ной позиции. Порядок следования при этом не нарушается. Причем стабильно от запуска к запуску.
Стоит внести изменения в код(не всегда) - позиция может поплыть.
Кто то с подобной бедой сталкивался?
|
|
|
|
20.03.2019, 14:39
|
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
К гадалке не ходи - нет синхронизации старта DMA с селектором каналов.
В результате начало блока плывет по массиву. Примерно тоже самое возникает при приеме пакетов следующих периодически через ДМА УАРТ.
ДМА стартует в момент середины текущего пакета и останавливается в середине следующего...
Еще возможна ошибочная установленная величина счетчика ДМА.
Последний раз редактировалось my504; 20.03.2019 в 14:43.
|
|
|
|
20.03.2019, 18:04
|
|
|
Частый гость
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
Сообщение от my504
|
|
К гадалке не ходи - нет синхронизации старта DMA с селектором каналов.
|
Оно то так...
В обработчике HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
значение счетчика толком посмотреть не получается hadc-›DMA_Handle-›Instance-›CNDTR.
При каждом следующем останове значение разное(смотрел через промежуточную переменную).
По идее - там всегда должна быть 9ка(использую 9 каналов).
С инициализацией тоже вроде ок - регистр инициализируется значением 9 (в HAL_ADC_Start_DMA).
|
|
|
|
20.03.2019, 18:27
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,860
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
Y.Logvin, тут только анализ кода после компиляции может помочь разобраться.
Листинг кода после препроцессора на входе компилятора и листинг ассемблера.
Попробуйте сделать простой пример на чистом C - все будет нормально работать.
С HAL придётся разбираться со всеми используемыми библиотеками
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
20.03.2019, 20:09
|
|
|
Частый гость
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
В общем отчитываюсь - сам дурак.
Моя ошибка была в том, что сначала вызывал
HAL_ADC_Start(&hadc1),
а потом
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1ConvertedValues, 9)
Нужно наоборот. Т.к. получалось, что АЦП начал перебирать каналы, и DMA цепляется к нему на лету. И там уже как попадет. Странно, что попадало почти всегда в одно место.
P.S. Явно базировался на каком то примере. Кто то мне свинью подложил. Проект начинался давно - хрен найду концы...
|
|
|
|
21.03.2019, 02:27
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,860
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
Y.Logvin, таки анализ кода был верным вектором движения  .
А эта ошибка с порядком инициализации DMA и источника/получателя наверное всех посещала
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
21.03.2019, 05:37
|
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
Сообщение от Y.Logvin
|
|
Явно базировался на каком то примере.
|
Это прямое следствие использования HAL.
|
|
|
|
21.03.2019, 06:36
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
|
Цитата:
|
- Хто всравсь?!
- Невiстка!
- Так вона ж теля пасе?!
- Так вiдтiля и несе!
|
Можно подумать, что без ХАЛа телегу впереди лошади запрячь невозможно!
А возможны перлы и еще смешнее... И не раз это наблюдается.
Не там причины ищете.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
21.03.2019, 11:10
|
|
|
Частый гость
Регистрация: 04.11.2009
Сообщений: 26
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
Сообщение от my504
|
|
Это прямое следствие использования HAL.
|
У меня есть знакомый, который надрачивает на ассемблер. Но пишет почему то на С++.
HAL это полезная штука - позволяет зачастую не ковырятся в кишках. А это ускоряет разработку.
Да и код с HAL-ом понятней.
Я у себя усугубляю - всю работу с периферией прячу в класс Hal.
Ну а накосячить можно было и без него.
Про USART - из своей практики пример?
|
|
|
|
21.03.2019, 13:03
|
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Проблема ADC DMA нарушен порядок значений в буфере
Сообщение от Y.Logvin
|
|
Про USART - из своей практики пример?
|
Это не пример из практики. Это пример ПРОМЕЖУТОЧНОГО результата из моей практики. Когда запускаешь ДМА с УАРТом, то на выходе ЛОГИЧНО имеешь плывущее начало массива. Когда добавляешь механизм стартового поиска - все становится нормально.
Что касается HAL, то дело не в удобстве-неудобстве. Дело в скрытом в чужом коде функционале, который далеко не всегда понятен тому, кто пользуется HAL-ом. Более того, при ошибках алгоритма, результат рассматривается не непосредственно, а через призму HAL. То есть возникает ложное ощущение отсутствия ошибок в вызываемых функциях.
Точно как в случае с ТС.
Если бы он запускал диаграмму работы через CMSIS, то у него не возникло бы желания сначала стартануть АЦП, а лишь потом DMA.
Кстати, вообще то процесс должен быть В ПРИНЦИПЕ ДРУГОЙ.
Цепочка: семплирующий таймер-АЦП-ДМА. Запуск в обратном порядке. Точнее, АЦП-ДМА как угодно, а таймер запускает весь процесс.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:02.
|
|