Недавно перешел на CubeIDE, запустил ADC, LCD. таймеры, UART, а DMA не получается. Уже пробую самый простой случай. Один канал загружаю в массив по DMA, а там ничего нет. В кубеMX все настроил, объявил массив, uint16_t AD[20]; старт ADC DMA HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20); Потом в цикле каждую секунду вывожу на LCD поочередно элементы массива, но там ничего нет. В дебуге тоже вижу одни нули. Что ещё нужно настроить? Проц stm32f103.
Могу дать ссылку на работающий код. Естественно, без калокуба. P.S. Вряд ли кто рискнет лезть в то ублюдство, что "куб" нагенерировал. Оно не предназначено для чтения человеком.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Я в основном с F072 работаю (т.к. у них одновременно можно запустить CAN и USB), но на F103 тоже немного железяк делал. вот, например. Настройка ADC with DMA. Каждое значение заносится в массив из 9 величин, затем, когда нужно определенный канал опросить, делаю медианную фильтрацию.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
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, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
rezistor2000, вечером попробую. У меня элементы массива читаются в бесконечном цикле и когда индекс превышает размер массива после нулей читаются какие-то большие числа. Откуда они берутся?
Последний раз редактировалось linkov1959 Вт дек 07, 2021 13:53:04, всего редактировалось 1 раз.
Как видно компилятор разместил второй массив сразу за первым и при выходе за границы первого прочитал содержимое второго, т.е. прочитано может быть что угодно.
Reflector, Понял, за массивом в памяти была другая переменная и ни к ADC, ни к DMA отношения не имеет. DMA берет данные из регистра ADC и пишет в пределах указанного размера памяти при вызове HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20); Размер массива DMA не волнует, а только лишь адрес начала массива. В свою очередь при чтении массива компилятор не волнует его размер и будет читать, пока индекс растет.
Не то чтобы размер массива компилятор не волновал, если он видит выход за пределы массива, то предупреждение выдаст, а чтобы была именно ошибка нужно использовать какие-то классы с соответствующими проверками. Например, если бы я написал так с включенными assert(), то получил бы рантаймовую ошибку потому что доступ к оператору [] проверяется:
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 пришло письмо с извинениями, типа все исправим! А сколько времени и сил потрачено зря!
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 скрипт и документацию принудительно перенести массивы по другим адресам
Спасибо несколько часов тупил проверял а вот оно что
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения