Помогите запустить ADC DMA
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Помогите запустить ADC DMA
Недавно перешел на CubeIDE, запустил ADC, LCD. таймеры, UART, а DMA не получается.
Уже пробую самый простой случай. Один канал загружаю в массив по DMA, а там ничего нет.
В кубеMX все настроил, объявил массив,
uint16_t AD[20];
старт ADC DMA
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20);
Потом в цикле каждую секунду вывожу на LCD поочередно элементы массива, но там ничего нет.
В дебуге тоже вижу одни нули.
Что ещё нужно настроить? Проц stm32f103.
Уже пробую самый простой случай. Один канал загружаю в массив по DMA, а там ничего нет.
В кубеMX все настроил, объявил массив,
uint16_t AD[20];
старт ADC DMA
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20);
Потом в цикле каждую секунду вывожу на LCD поочередно элементы массива, но там ничего нет.
В дебуге тоже вижу одни нули.
Что ещё нужно настроить? Проц stm32f103.
- Вложения
-
- ADC_DMA103.txt
- (9.68 КБ) 189 скачиваний
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Помогите запустить ADC DMA
Могу дать ссылку на работающий код. Естественно, без калокуба.
P.S. Вряд ли кто рискнет лезть в то ублюдство, что "куб" нагенерировал. Оно не предназначено для чтения человеком.
P.S. Вряд ли кто рискнет лезть в то ублюдство, что "куб" нагенерировал. Оно не предназначено для чтения человеком.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Помогите запустить ADC DMA
Eddy_Em, не откажусь посмотреть, что люди генерируют.
и сравню, может чего у куба не хватает.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Помогите запустить ADC DMA
Я в основном с F072 работаю (т.к. у них одновременно можно запустить CAN и USB), но на F103 тоже немного железяк делал. вот, например. Настройка ADC with DMA. Каждое значение заносится в массив из 9 величин, затем, когда нужно определенный канал опросить, делаю медианную фильтрацию.
-
rezistor2000
- Родился
- Сообщения: 8
- Зарегистрирован: Чт фев 04, 2021 08:45:28
Re: Помогите запустить ADC DMA
linkov1959, поменяйте местами MX_ADC1_Init() и MX_DMA_Init(). В последней версии CubeIDE это вроде исправили.
Достаточно часто встречается
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам
Код: Выделить всё
MX_GPIO_Init();
MX_DMA_Init(); // инициализируем dma перед adc
MX_ADC1_Init();
MX_USART1_UART_Init();
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам
- Реклама
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Помогите запустить ADC DMA
rezistor2000, вечером попробую. У меня элементы массива читаются в бесконечном цикле и когда индекс превышает размер массива после нулей читаются какие-то большие числа. Откуда они берутся?
Последний раз редактировалось linkov1959 Вт дек 07, 2021 13:53:04, всего редактировалось 1 раз.
Re: Помогите запустить ADC DMA
А чего вдруг должны читаться нули когда индекс превышает размер массива?
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Помогите запустить ADC DMA
Reflector, после 20 нулей должна быть ошибка или ничего, пустой LCD.
Re: Помогите запустить ADC DMA
Допустим есть такой код:
Если его запустить, то получим:
Как видно компилятор разместил второй массив сразу за первым и при выходе за границы первого прочитал содержимое второго, т.е. прочитано может быть что угодно.
Код: Выделить всё
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
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Помогите запустить ADC DMA
Reflector, Понял, за массивом в памяти была другая переменная и ни к ADC, ни к DMA отношения не имеет.
DMA берет данные из регистра ADC и пишет в пределах указанного размера памяти при вызове
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20); Размер массива DMA не волнует, а только лишь адрес начала массива. В свою очередь при чтении массива компилятор не волнует его размер и будет читать, пока индекс растет.
DMA берет данные из регистра ADC и пишет в пределах указанного размера памяти при вызове
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD, 20); Размер массива DMA не волнует, а только лишь адрес начала массива. В свою очередь при чтении массива компилятор не волнует его размер и будет читать, пока индекс растет.
Re: Помогите запустить ADC DMA
Не то чтобы размер массива компилятор не волновал, если он видит выход за пределы массива, то предупреждение выдаст, а чтобы была именно ошибка нужно использовать какие-то классы с соответствующими проверками. Например, если бы я написал так с включенными 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-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Помогите запустить ADC DMA
[uquote="rezistor2000",url="/forum/viewtopic.php?p=4136771#p4136771"]linkov1959, поменяйте местами MX_ADC1_Init() и MX_DMA_Init(). В последней версии CubeIDE это вроде исправили.
Достаточно часто встречается
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам[/uquote]
Поменял местами Init и все изменилось! LCD стал мельтишить и глючить, выводить всякую фигню, но я понял, что на правильном пути.
После старта DMA прописал стоп. DMA записал массив и остановился, а в цикле неспешно вывелись все элементы по очереди!
Спасибо за помощь!
Добавлено after 2 hours 16 minutes 27 seconds:
Вот и выходит, что не я дурак, а в кубе ошибка, на который все молились! Теперь и с Mikroe пришло письмо с извинениями, типа все исправим! А сколько времени и сил потрачено зря!
Код: Выделить всё
MX_GPIO_Init();
MX_DMA_Init(); // инициализируем dma перед adc
MX_ADC1_Init();
MX_USART1_UART_Init();
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам[/uquote]
Поменял местами Init и все изменилось! LCD стал мельтишить и глючить, выводить всякую фигню, но я понял, что на правильном пути.
После старта DMA прописал стоп. DMA записал массив и остановился, а в цикле неспешно вывелись все элементы по очереди!
Спасибо за помощь!
Добавлено after 2 hours 16 minutes 27 seconds:
Вот и выходит, что не я дурак, а в кубе ошибка, на который все молились! Теперь и с Mikroe пришло письмо с извинениями, типа все исправим! А сколько времени и сил потрачено зря!
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Помогите запустить ADC DMA
Лежит у меня TFT 240х320, хотел на микробейсике запустить, но не получилось. В кубе должно получиться!
Добавлено after 4 hours 21 minute 48 seconds:
Получилось!
Добавлено after 4 hours 21 minute 48 seconds:
Получилось!
Re: Помогите запустить ADC DMA
[uquote="rezistor2000",url="/forum/viewtopic.php?p=4136771#p4136771"]linkov1959, поменяйте местами MX_ADC1_Init() и MX_DMA_Init(). В последней версии CubeIDE это вроде исправили.
Достаточно часто встречается
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам[/uquote]
Спасибо несколько часов тупил проверял а вот оно что
Код: Выделить всё
MX_GPIO_Init();
MX_DMA_Init(); // инициализируем dma перед adc
MX_ADC1_Init();
MX_USART1_UART_Init();
1) неправильный порядок инициализации, нужно поменять местами (можно в редакторе периферии на вкладке Generated Function Calls стрелочками поменять этот порядок, тогда при генерации кода не придётся каждый раз вручную редактировать)
2) не включены прерывания, на которых основана логика работы HAL, нужно включить через редактор параметров периферии
3) DMA не имеет доступа к адресному пространству выделенной памяти, нужно через ld скрипт и документацию принудительно перенести массивы по другим адресам[/uquote]
Спасибо несколько часов тупил проверял а вот оно что
ух ты.... показывает


