Здравствуйте. Столкнулся с интересной проблемой (может другие уже это проходили). Все делал как в данном уроке, но прерывание по ДМА возникает только один раз при старте. Соответственно проект не работал. КУБ версии 5.4.0 Оказалось дело в последовательности инициализации периферии. Для данного микроконтроллера (STM32F407) после генерации проекта КУБом она следующая (из файла main.c): /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_USART2_UART_Init(); MX_DMA_Init(); Для нормальной работы проекта необходимо инициализацию ADC1 переместить ниже, примерно так: /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); MX_DMA_Init(); MX_ADC1_Init(); Но при повторной сборке проекта КУБ возвращает все обратно. Поэтому надо не забывать менять последовательность. Уже дважды столкнулся с такой проблемой работы КУБа, было потеряно много времени...
У меня была проблема с функцией sprintf в cubeide - она никак не хотела работать. Надо было в дереве проекта (в корневой папке) зайти в properties -> MCU settings и поставить галочку возле функции "Use float with printf from newlib-nano (-u _printf_float)" и возле второй. Так на форуме STM написано.
Пишу из 2021 года. Использовал Stm32L1xxx Сел я посмотреть эти уроки, как обычно ничего не заработало(4 канала с использованием DMA). У меня была ошибка в HAL т.к случался overrun в самом начале и отключался DMA и ADC из-за этого. Выводилось однозначение начальное(при 1 чтении ADC) . -Одна из причин была неправильная постановка функций MX_DMA_Init() и MX_ADC_Init(); Сначала должно идти DMA, потом ADC. - Другая это в CubeMX где "IN3 Channel Speed" выбрать что-нибудь кроме disable(я выбрал slow). Я использовал IN1-IN4 входы ADC. -Ну конечно же тактирование. У меня SYSCLK 32 MHz, HCLK 32 MHz, APB1 и APB2 presclaler на 1. В настройках ADC prescaler делится на 4. При таких условиях все заработало.
Здравствуйте. См. ваши видео по ним и учусь. Подскажите как лучше? У меня stm32f407 2 датчика температуры (резисторы 100к) каждый на своем выводе МК. Цель по каждому (по 6 замеров). скидываем в кучу потом делим /6 (усредняем). 2 раза в секунду надо усредненные показания без таймера и прерываний. Понимаю что надо DMA, но как лучше инжекторный или регулярный. инжекторный - может накапливать в буфере. Можно ли останавливать после 6 замеров и сброса в DMА ? пока МК не заберет и не запустит заново. что бы МК забирал когда сделано 6 замеров. СПАСИБО.
Помогите настроить это на stm32f103c8t6. cubemx не предлагает DMAContinuousRequests. И в коде его не пропишешь. Может я что не включил. Пока хоть по прерываниям настроил.
Здравствуйте! А как быть с калибровкой АЦП, если в нём используются каналы для дифференциального входа, для обычного входа и для обработки сигналов от встроенных датчиков, например, от встроенного датчика температуры? Для дифф. входа: HAL_ADCEx_Calibration_Start(&hadc1, ADC_DIFFERENTIAL_ENDED); Для обычного входа: HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); Не делать же калибровку перед каждым замером конкретного канала? Спасибо.
не могу понять что у меня не так, с АЦП приходят данные по каждому каналу, но они не соответствуют действительности, а именно пины пустые, ни с чем не замкнутые, а значения колеблются от 1500 до 3000, причем чем выше канал по счету тем больше значение, если ставлю перемычку на 3V то приходит значение 4000 (никогда 4096 не было)
У меня во время старта 1 раз отработал dma и все. пока HAL_ADC_Start_DMA(&hadc,(uint32_t*)adc,3); не закинул в while. цеклически отробатывать он отказываеться((( Cube mx настроил..
Здравствуйте. В данном случае вы использовали физически один ацп. Вот хотим мы к примеру отцифровать n сигналов и чтобы это было быстрее, надо чтобы половину отцифровал один ацп, а половину другой. Как нам для dma настроить переключение периферии? Объясните пожалуйста. Если бы появилось соответствующее видео, было бы идеально. Заранее спасибо
Здравствуйте! Подскажите пожалуйста , что у меня может быть не правильно в программе. Работаю с АЦП STM32L1 сгенерировал периферию в кубе. Настроил DMA , 2 регулярных канала и 2 инжектированных. У регулярных каналов SamplingTime = ADC_SAMPLETIME_96CYCLES У инжктированных 16 и 24 . Бывает, что в DMA каналы местами меняются и в старших байтах вместо одного канала, совсем другой. Помогает только перезапуск
Дело было в FIFO.. Я эту галку не поставил, а она была нужна. Вы в ролике, к сожалению, никак не прокомментировали необходимость включения FIFO и других параметров, связанных с ним, а вопрос интересный и важный..:) Будет здорово, если напишите об этом. Спасибо за ваш курс!
Здравствуйте! Я совсем новичок в stm32 программировании и у меня появился вопрос: Как использовать значения полученные из ацп при помощи DMA сразу, как только мы их получили, то есть по окончании преобразований?... Есть какое-то прерывание и как его вызвать...
Странно, делаю всё тоже самое на ILI9341 и частота обновления данных очень и очень медленная, порядка 1-2 секунды ждать надо для обновления данных на дисплее.
надо смотреть весь проект, только очень жаль, что у меня нет такого дисплея, но может переделаю под свой с 8-разрядным подключением, а может так увижу. Киньте заархивированный проект на GoogleDisk и я гляну, как посвободнее буду. Только перед архивацией удалите из проекта следующие папки (только если проект, конечно, генерировался в Cube MX): Drivers\CMSIS; Drivers\STM32F4xx_HAL_Driver MDK-ARM\Папка_с_именем_Вашего_проекта Больше ничего не удаляйте
Здравствуйте, не планируете ли вы еще урок по ДМА в инжектированном канале? Так то в ДШ написано, что можно использовать их не смотря на то, что есть свои регистры у каждого канала. Быть может урок по DMA в SPI..., что существенно ускоряет те же дисплеи.
Видео как обычно на высоте, смотрю, стали объяснять больше по документации по всем пунктам в кубе и по строкам кода, что не может не радовать:) Урок по вотчдог будет? АЦП как по-мне одна из самых сложных и нужных тем. Вопрос чутка не по теме, почему цена на этот дисплей (270,52 руб) столь высока по сравнению с тем же ili9341 (365,44 руб) на котором и рисовать можно, и видео запускать, и картинки, да и сенсорный модуль есть? Просто в будущем хочу в машину его воткнуть, а этот как-то не очень внешне, ну и функций маловато. За уроки большое спасибо, ждём следующих видео:) Я думаю было бы неплохо в будущем совместно с подписчиками делать различные практические штуковины или типа отчёта чтобы что-то было, а вы потом в видео своих сможете выложить. Пример (первое что в голову пришло): в каком-то из видео даёте задание сделать вольтметр до 10 вольт и прислать видео-фото отчёт с какими-то условиями кода. Ну а через какой-то срок сами можете записать видео как это сделать. Таким образом может собраться довольно много людей и будет постоянная связь со своими подписчиками. Хотя, ютуб для этого дела не очень подходит. Ну это просто идея, вам виднее, конечно:)
Спасибо! Сторожевой пёс ещё не освоен. АЦП - это очень нужная вещь. Так же как и цап. Пока существует динамик и микрофон, будет АЦП и ЦАП. Чтобы записать с микрофона в цифру - нужен АЦП, чтобы послушать потом цифру через динамик - ЦАП. Пока от них никуда. Там ещё SPI не за горами.
Прошу прощения, дело было не в FIFO. Я заодно поменял параметры Peripheral data width и Memory data width - сделал так, как и в видео - DMA_PDATAALIGN_HALFWORD (был WORD). Так что FIFO не причем. Однако услышать про него все равно было бы интересно..
подскажите пожалуйста что это может быть, написал прогу для ацп и вывел бит на ножу (напряжение на ножку) с пищалкой, ацп работает, а пищалка не хочет пищать? Пищалка рабочая, нога настроена правильно, в кокосе когда просто заливаю чтобы пищалка раотала, все работает нормально.
Столкнулся с ошибками Cubemx. Возможно кому-то будет полезен мой опыт. Была проблема с неправильными результатами измерений. В отладчике обнаружил что DMA неправильно раскладывает их в память. Причина оказалось в том что cube генерировал проект с ошибкой. В cube параметр Data Width для Periph и Memory был Half Word А в файле с инициализацией DMA (stm32f4xx_hal_msp.c) было: PeriphDataAlignment = DMA_PDATAALIGN_BYTE; MemDataAlignment = DMA_MDATAALIGN_BYTE; Проблема решается заменой DMA_PDATAALIGN_BYTE на DMA_PDATAALIGN_HALFWORD.
Не стоит, не тратьте время. Тем более, что ошибка, как оказалась, трудно воспроизводимая. Я сам хотел им написать, сейчас попробовал новый проект создать - ошибки нет. Зато вылезла вот такая ошибка графического интерфейса: pp.vk.me/c837626/v837626799/4260/TnKrgGt73Nc.jpg В общем понятно, что надо с настороженностью относиться к тому что генерирует куб. P.S.Возможно просто мне попалась версия куба сильно глючная. Буду разбираться. Спасибо за уроки и за быстрый ответ!
Имя массива уже является указателем и нет необходимости писать &ADC_Data
Огромное Вам спасибо.
Все очень интересно!!!
Здравствуйте. Столкнулся с интересной проблемой (может другие уже это проходили).
Все делал как в данном уроке, но прерывание по ДМА возникает только один раз при старте. Соответственно проект не работал.
КУБ версии 5.4.0
Оказалось дело в последовательности инициализации периферии. Для данного микроконтроллера (STM32F407) после генерации проекта КУБом она следующая (из файла main.c):
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART2_UART_Init();
MX_DMA_Init();
Для нормальной работы проекта необходимо инициализацию ADC1 переместить ниже, примерно так:
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_DMA_Init();
MX_ADC1_Init();
Но при повторной сборке проекта КУБ возвращает все обратно. Поэтому надо не забывать менять последовательность. Уже дважды столкнулся с такой проблемой работы КУБа, было потеряно много времени...
Спасибо.
Спасибо! для f103c8t6 ваш совет также помог!
У меня была проблема с функцией sprintf в cubeide - она никак не хотела работать. Надо было в дереве проекта (в корневой папке) зайти в properties -> MCU settings и поставить галочку возле функции "Use float with printf from newlib-nano (-u _printf_float)" и возле второй. Так на форуме STM написано.
Пишу из 2021 года. Использовал Stm32L1xxx
Сел я посмотреть эти уроки, как обычно ничего не заработало(4 канала с использованием DMA). У меня была ошибка в HAL т.к случался overrun в самом начале и отключался DMA и ADC из-за этого. Выводилось однозначение начальное(при 1 чтении ADC) .
-Одна из причин была неправильная постановка функций MX_DMA_Init() и MX_ADC_Init(); Сначала должно идти DMA, потом ADC.
- Другая это в CubeMX где "IN3 Channel Speed" выбрать что-нибудь кроме disable(я выбрал slow). Я использовал IN1-IN4 входы ADC.
-Ну конечно же тактирование. У меня SYSCLK 32 MHz, HCLK 32 MHz, APB1 и APB2 presclaler на 1. В настройках ADC prescaler делится на 4.
При таких условиях все заработало.
-Одна из причин была неправильная постановка функций MX_DMA_Init() и MX_ADC_Init(); Тоже есть такое!
Спасибо
Здравствуйте. См. ваши видео по ним и учусь. Подскажите как лучше? У меня stm32f407 2 датчика температуры (резисторы 100к) каждый на своем выводе МК. Цель по каждому (по 6 замеров). скидываем в кучу потом делим /6 (усредняем). 2 раза в секунду надо усредненные показания без таймера и прерываний. Понимаю что надо DMA, но как лучше инжекторный или регулярный. инжекторный - может накапливать в буфере. Можно ли останавливать после 6 замеров и сброса в DMА ? пока МК не заберет и не запустит заново. что бы МК забирал когда сделано 6 замеров. СПАСИБО.
Помогите настроить это на stm32f103c8t6. cubemx не предлагает DMAContinuousRequests. И в коде его не пропишешь. Может я что не включил. Пока хоть по прерываниям настроил.
Здравствуйте!
А как быть с калибровкой АЦП, если в нём используются каналы для дифференциального входа, для обычного входа и для обработки сигналов от встроенных датчиков, например, от встроенного датчика температуры?
Для дифф. входа:
HAL_ADCEx_Calibration_Start(&hadc1, ADC_DIFFERENTIAL_ENDED);
Для обычного входа:
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
Не делать же калибровку перед каждым замером конкретного канала?
Спасибо.
Здравствуйте! Подскажите, как сделать, чтобы три разных АЦП преобразовывали три разных канала, но в ОДИН И ТОТ ЖЕ момент времени? Заранее спасибо.
instablaster
не могу понять что у меня не так, с АЦП приходят данные по каждому каналу, но они не соответствуют действительности, а именно пины пустые, ни с чем не замкнутые, а значения колеблются от 1500 до 3000, причем чем выше канал по счету тем больше значение, если ставлю перемычку на 3V то приходит значение 4000 (никогда 4096 не было)
Код бы посмотреть.. Делал также, только среда IAR и МК другой (405-й) - только один канал из двух работает..
У меня во время старта 1 раз отработал dma и все. пока HAL_ADC_Start_DMA(&hadc,(uint32_t*)adc,3); не закинул в while. цеклически отробатывать он отказываеться((( Cube mx настроил..
та же проблема, вы ее решили?
@@ГеоргийОлиниченко Честно я не помню, знаю что автор этого видео очень часто облажается! но и на этом спасибо!
Здравствуйте. В данном случае вы использовали физически один ацп. Вот хотим мы к примеру отцифровать n сигналов и чтобы это было быстрее, надо чтобы половину отцифровал один ацп, а половину другой. Как нам для dma настроить переключение периферии? Объясните пожалуйста. Если бы появилось соответствующее видео, было бы идеально. Заранее спасибо
Здравствуйте! Подскажите пожалуйста , что у меня может быть не правильно в программе. Работаю с АЦП STM32L1 сгенерировал периферию в кубе.
Настроил DMA , 2 регулярных канала и 2 инжектированных.
У регулярных каналов SamplingTime = ADC_SAMPLETIME_96CYCLES
У инжктированных 16 и 24 .
Бывает, что в DMA каналы местами меняются и в старших байтах вместо одного канала, совсем другой. Помогает только перезапуск
Дело было в FIFO.. Я эту галку не поставил, а она была нужна.
Вы в ролике, к сожалению, никак не прокомментировали необходимость включения FIFO и других параметров, связанных с ним, а вопрос интересный и важный..:) Будет здорово, если напишите об этом.
Спасибо за ваш курс!
Здравствуйте! Я совсем новичок в stm32 программировании и у меня появился вопрос: Как использовать значения полученные из ацп при помощи DMA сразу, как только мы их получили, то есть по окончании преобразований?... Есть какое-то прерывание и как его вызвать...
Странно, делаю всё тоже самое на ILI9341 и частота обновления данных очень и очень медленная, порядка 1-2 секунды ждать надо для обновления данных на дисплее.
В смысле то же самое на ili9341? А при чем тут регулярный канал АЦП?
+narod stream такой же код, только вывод на ili9341, а не на 2004 и т.п. У вас быстро всё меняется, а у меня на регулярном как-то долго.
надо смотреть весь проект, только очень жаль, что у меня нет такого дисплея, но может переделаю под свой с 8-разрядным подключением, а может так увижу. Киньте заархивированный проект на GoogleDisk и я гляну, как посвободнее буду. Только перед архивацией удалите из проекта следующие папки (только если проект, конечно, генерировался в Cube MX):
Drivers\CMSIS;
Drivers\STM32F4xx_HAL_Driver
MDK-ARM\Папка_с_именем_Вашего_проекта
Больше ничего не удаляйте
Отправил в ЛС, как скачаете или чего найдёте - отпишитесь
Сергей Аксенов Хорошо.
Здравствуйте, не планируете ли вы еще урок по ДМА в инжектированном канале? Так то в ДШ написано, что можно использовать их не смотря на то, что есть свои регистры у каждого канала. Быть может урок по DMA в SPI..., что существенно ускоряет те же дисплеи.
Здравствуйте! Пока об этом не думал. Мне почему-то даже не удалось опросить несколько каналов в регулярном режиме.
Видео как обычно на высоте, смотрю, стали объяснять больше по документации по всем пунктам в кубе и по строкам кода, что не может не радовать:)
Урок по вотчдог будет? АЦП как по-мне одна из самых сложных и нужных тем.
Вопрос чутка не по теме, почему цена на этот дисплей (270,52 руб) столь высока по сравнению с тем же ili9341 (365,44 руб) на котором и рисовать можно, и видео запускать, и картинки, да и сенсорный модуль есть?
Просто в будущем хочу в машину его воткнуть, а этот как-то не очень внешне, ну и функций маловато.
За уроки большое спасибо, ждём следующих видео:) Я думаю было бы неплохо в будущем совместно с подписчиками делать различные практические штуковины или типа отчёта чтобы что-то было, а вы потом в видео своих сможете выложить.
Пример (первое что в голову пришло): в каком-то из видео даёте задание сделать вольтметр до 10 вольт и прислать видео-фото отчёт с какими-то условиями кода. Ну а через какой-то срок сами можете записать видео как это сделать.
Таким образом может собраться довольно много людей и будет постоянная связь со своими подписчиками. Хотя, ютуб для этого дела не очень подходит. Ну это просто идея, вам виднее, конечно:)
Спасибо! Сторожевой пёс ещё не освоен. АЦП - это очень нужная вещь. Так же как и цап. Пока существует динамик и микрофон, будет АЦП и ЦАП. Чтобы записать с микрофона в цифру - нужен АЦП, чтобы послушать потом цифру через динамик - ЦАП. Пока от них никуда. Там ещё SPI не за горами.
Прошу прощения, дело было не в FIFO. Я заодно поменял параметры Peripheral data width и Memory data width - сделал так, как и в видео - DMA_PDATAALIGN_HALFWORD (был WORD).
Так что FIFO не причем. Однако услышать про него все равно было бы интересно..
подскажите пожалуйста что это может быть, написал прогу для ацп и вывел бит на ножу (напряжение на ножку) с пищалкой, ацп работает, а пищалка не хочет пищать?
Пищалка рабочая, нога настроена правильно, в кокосе когда просто заливаю чтобы пищалка раотала, все работает нормально.
Может тока не хватает? Через транзистор подключали?
через транзистор
так самое главное что в косе все работает, в кэиле нет
Не совсем понятно. Если Вы прошиваете файл, сгенерированный в coo cox, то пищит?
да. я уже и оптимизацию пробовал снимать, одно время все работало, сейчас опять перестало работать в кэиле
Здравствуйте!
Почему не работает один канал АЦП с ДМА, точнее делает только одно измерение? Если используется два и более каналов, то все хорошо.
та же проблема, вы ее решили?
@@ГеоргийОлиниченко Нет
Türkiye'den selamlar.
Столкнулся с ошибками Cubemx. Возможно кому-то будет полезен мой опыт. Была проблема с неправильными результатами измерений. В отладчике обнаружил что DMA неправильно раскладывает их в память. Причина оказалось в том что cube генерировал проект с ошибкой.
В cube параметр Data Width для Periph и Memory был Half Word
А в файле с инициализацией DMA (stm32f4xx_hal_msp.c) было:
PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
MemDataAlignment = DMA_MDATAALIGN_BYTE;
Проблема решается заменой DMA_PDATAALIGN_BYTE на DMA_PDATAALIGN_HALFWORD.
Спасибо!
Странная ситуация.
Обязательно проверю и передам в техподдержку.
Не стоит, не тратьте время. Тем более, что ошибка, как оказалась, трудно воспроизводимая. Я сам хотел им написать, сейчас попробовал новый проект создать - ошибки нет. Зато вылезла вот такая ошибка графического интерфейса:
pp.vk.me/c837626/v837626799/4260/TnKrgGt73Nc.jpg
В общем понятно, что надо с настороженностью относиться к тому что генерирует куб.
P.S.Возможно просто мне попалась версия куба сильно глючная. Буду разбираться. Спасибо за уроки и за быстрый ответ!
Вообще лучше использовать последнюю версию. На данный момент вроде 4.16.1