Например TDA7294

Форум РадиоКот • Просмотр темы - Помогите запустить ADC DMA
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 16:06:02

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Помогите запустить ADC DMA
СообщениеДобавлено: Пн дек 06, 2021 23:13:55 
Опытный кот

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 815
Рейтинг сообщения: 0
Недавно перешел на CubeIDE, запустил ADC, LCD. таймеры, UART, а DMA не получается.
Уже пробую самый простой случай. Один канал загружаю в массив по DMA, а там ничего нет.
В кубеMX все настроил, объявил массив,
uint16_t AD[20];
старт ADC DMA
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20);
Потом в цикле каждую секунду вывожу на LCD поочередно элементы массива, но там ничего нет.
В дебуге тоже вижу одни нули.
Что ещё нужно настроить? Проц stm32f103.


Вложения:
ADC_DMA103.txt [9.68 KiB]
Скачиваний: 102
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Пн дек 06, 2021 23:32:57 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -25
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2525
Рейтинг сообщения: 0
Могу дать ссылку на работающий код. Естественно, без калокуба.
P.S. Вряд ли кто рискнет лезть в то ублюдство, что "куб" нагенерировал. Оно не предназначено для чтения человеком.

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Пн дек 06, 2021 23:56:39 
Опытный кот

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 815
Рейтинг сообщения: 0
Eddy_Em, не откажусь посмотреть, что люди генерируют.:) и сравню, может чего у куба не хватает.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 00:26:35 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -25
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2525
Рейтинг сообщения: 0
Я в основном с F072 работаю (т.к. у них одновременно можно запустить CAN и USB), но на F103 тоже немного железяк делал. вот, например. Настройка ADC with DMA. Каждое значение заносится в массив из 9 величин, затем, когда нужно определенный канал опросить, делаю медианную фильтрацию.

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 04:13:13 
Родился

Зарегистрирован: Чт фев 04, 2021 08:45:28
Сообщений: 8
Рейтинг сообщения: 2
linkov1959, поменяйте местами MX_ADC1_Init() и MX_DMA_Init(). В последней версии CubeIDE это вроде исправили.
Код:
  MX_GPIO_Init();
  MX_DMA_Init(); // инициализируем dma перед adc
  MX_ADC1_Init();
  MX_USART1_UART_Init();

Достаточно часто встречается
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 11:31:06 
Опытный кот

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 815
Рейтинг сообщения: 0
rezistor2000, вечером попробую. У меня элементы массива читаются в бесконечном цикле и когда индекс превышает размер массива после нулей читаются какие-то большие числа. Откуда они берутся?


Последний раз редактировалось linkov1959 Вт дек 07, 2021 13:53:04, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 11:33:46 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
А чего вдруг должны читаться нули когда индекс превышает размер массива?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 13:55:54 
Опытный кот

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 815
Рейтинг сообщения: 0
Reflector, после 20 нулей должна быть ошибка или ничего, пустой LCD.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 14:08:09 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Допустим есть такой код:
Код:
uint16_t arr[] = { 0x1111, 0x2222 };
uint16_t arr2[] = { 0xABCD };

rtt.println(arr, arr2);

for (int i = 0; i < 3; i++)
   rtt.printxln(arr[i]);

Если его запустить, то получим:
Код:
0x20001520, 0x20001524
1111
2222
ABCD

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 16:01:13 
Опытный кот

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 815
Рейтинг сообщения: 0
Reflector, Понял, за массивом в памяти была другая переменная и ни к ADC, ни к DMA отношения не имеет.
DMA берет данные из регистра ADC и пишет в пределах указанного размера памяти при вызове
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20); Размер массива DMA не волнует, а только лишь адрес начала массива. В свою очередь при чтении массива компилятор не волнует его размер и будет читать, пока индекс растет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 16:21:36 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Не то чтобы размер массива компилятор не волновал, если он видит выход за пределы массива, то предупреждение выдаст, а чтобы была именно ошибка нужно использовать какие-то классы с соответствующими проверками. Например, если бы я написал так с включенными assert(), то получил бы рантаймовую ошибку потому что доступ к оператору [] проверяется:
Код:
Deque<uint16_t, 2> arr = { 0x1111, 0x2222 };

for (int i = 0; i < 3; i++)
   rtt.printxln(arr[i]);

// 1111
// 2222
// Error: re/deque.h, 60


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Вт дек 07, 2021 22:35:28 
Опытный кот

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 815
Рейтинг сообщения: 0
linkov1959, поменяйте местами MX_ADC1_Init() и MX_DMA_Init(). В последней версии CubeIDE это вроде исправили.
Код:
  MX_GPIO_Init();
  MX_DMA_Init(); // инициализируем dma перед adc
  MX_ADC1_Init();
  MX_USART1_UART_Init();

Достаточно часто встречается
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам

Поменял местами Init и все изменилось! LCD стал мельтишить и глючить, выводить всякую фигню, но я понял, что на правильном пути.
После старта DMA прописал стоп. DMA записал массив и остановился, а в цикле неспешно вывелись все элементы по очереди!
Спасибо за помощь!

Добавлено after 2 hours 16 minutes 27 seconds:
Вот и выходит, что не я дурак, а в кубе ошибка, на который все молились! Теперь и с Mikroe пришло письмо с извинениями, типа все исправим! А сколько времени и сил потрачено зря!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Ср дек 08, 2021 20:53:37 
Опытный кот

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 815
Рейтинг сообщения: 0
Лежит у меня TFT 240х320, хотел на микробейсике запустить, но не получилось. В кубе должно получиться!

Добавлено after 4 hours 21 minute 48 seconds:
Получилось!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите запустить ADC DMA
СообщениеДобавлено: Чт авг 03, 2023 23:10:31 
Потрогал лапой паяльник

Зарегистрирован: Пт янв 29, 2010 19:42:27
Сообщений: 311
Рейтинг сообщения: 0
linkov1959, поменяйте местами MX_ADC1_Init() и MX_DMA_Init(). В последней версии CubeIDE это вроде исправили.
Код:
  MX_GPIO_Init();
  MX_DMA_Init(); // инициализируем dma перед adc
  MX_ADC1_Init();
  MX_USART1_UART_Init();

Достаточно часто встречается
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам

Спасибо несколько часов тупил проверял а вот оно что

_________________
ух ты.... показывает


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y