STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

VladislavS покажи мне как на C++ с помощью таймеров и DMA аппаратно управлять светодиодной лентой на WS2812B, устанавливать яркость, цвет.

Настройка порта там три строки, остальное алгоритмы.

Код: Выделить всё

	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
	GPIOB->MODER |= GPIO_MODER_MODER4_1;
	GPIOB->AFR[1] |= GPIO_AFRH_AFSEL4_1;
А потом когда закончишь на STM32 писать либу, портани ее на AVR, PIC, Raspberry, arduino и еще какие-нибудь, и залей на гитхаб. И чтобы везде работало. :tea:
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А кофе тебе с утра в постель не принести?

Конкретно для WS2812B у меня ничего нет, не приходилось делать, другая тематика работы. А что там такого, чего нельзя на плюсах красиво написать? Включить PWM режим на таймере и натравить на него DMA - вызов двух методов двух классов.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

О, WS2812, где там Reflector, когда родит код что бы мир перевернулся?

stm32f030f4p6 WS2812 таймер + DMA ШИМ, обошелся одним буфером DMA в 24 байта, начинает работать от частоты 16МГц.
К сожалению я не программист, и мой код видимо не правильный, хотелось бы увидеть как специалисты это сделают.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вот объясните мне, чего он всё в DMA да таймеры тычет? Те же таймеры - непаханное поле для С++. В разных контроллерах их разное количество, в разных таймерах разное количество каналов и возможности этих каналов разные.
Вот, например, класс знает что в этом контроллера на TIM1 6 каналов, а на TIM2 всего 4 и прямо в IDE мне это подскажет.
Изображение

Изображение

А внутри сделает все возможные проверки и не даст установить режимы/биты отсутствующие в конкретном таймере. Я не смогу даже попытаться включить прерывание, которого нет в конкретном таймере.
Изображение
СпойлерИзображение
tim1.png
(26.57 КБ) 361 скачивание
tim2.png
(26.46 КБ) 374 скачивания
Tim3.png
(62.85 КБ) 92 скачивания
tim4.png
(17.05 КБ) 358 скачиваний
И т.д. и т.п.

Добавлено after 54 minutes 29 seconds:
Вот ещё пример, учтена разрядность счётчика таймера. И это всё на этапе компиляции, а не когда что-то не так работать будет.
Изображение
tim5.png
(14.74 КБ) 460 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3906509#p3906509"]Настройка порта там три строки, остальное алгоритмы.[/uquote]
Давай я лучше покажу как у меня тактирование для H750 настраивается. Там три 3-х канальных PLL, на вход подается частота с HSE/CSI/HSI, для последнего еще делители могут быть. И умножитель там сдвоенный, один принимает частоты в диапазоне 1..2 MHz, а на выходе будут 150..420 MHz, у второго на входе 2..16 MHz, а на выходе от 192 до ~1400, если разгонять. Выбрать какой из них использовать с учетом того, что на трех каналах могут быть разные частоты не так и просто. А каналов нужно много, даже SPI1/2/3 нельзя затактировать от APB, только PLL или HSE/CSI/HSI, то там частоты обычно небольшие. LTDC - только PLL, SDMMC - только PLL и т.д.... Другими словами тут все значительно сложнее, чем было, например, на F4, где обычно хватало одного канала одного PLL. В итоге был написан ряд шаблонных классов:

Код: Выделить всё

using pll1 = Pll1<960, 2, 20>;      // P: 480, Q: 48
using pll2 = Pll2<200, 1, 4>;       // P: 200, Q: 50
using pll3 = Pll3<160, 0, 0, 4>;    // R: 40
Plls<PllSrc::Hse, pll1, pll2, pll3>::init();
Rcc::switchToPll<pll1, AhbPresc::_2>();
Эти 5 строк делают все, включают нужные генераторы, настраивают все PLL с проверкой входных параметров, задают латентность флеша и также настраивается Voltage Regulator, чтобы питания хватало для заданной частоты. За сколько занятий сможешь научить новичка настраивать это все правильно? :)

А WS2812B у меня давно работают, тому же Dimon456 было все разжевано, иначе у него до сих пор работало бы с SPI и без DMA. Причем идея использовать SPI ведь тоже не его, а позаимствована из кода ARV, зато просить у меня в личке помощи и потом называть мои советы тупыми, это он может :)
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Пожалуйста, можно подробнее, где почитать про реализацию управления ВС2812 через Таймер и ШИМ? Если это уже где-то было описано Вами.

Добавлено after 1 minute 14 seconds:
Ну, то, что Dimon456у объясняли.
Станислав
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3906657#p3906657"]Пожалуйста, можно подробнее, где почитать про реализацию управления ВС2812 через Таймер и ШИМ? Если это уже где-то было описано Вами.[/uquote]
Это тема ARV про плейер световых эффектов, смотри последние страницы.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Благодарю. )
Станислав
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Reflector писал(а):Эти 5 строк делают все
Да, только за этими 5 строчками скрывается ище кое что,
ну а так отличная помощь, особенно начинающим.
Reflector писал(а):тому же Dimon456 было все разжевано, иначе у него до сих пор работало бы с SPI и без DMA.
и конечно же ваш код был использован для теста.
И самый главный ваш совет, разрешите процитирую
Reflector писал(а):
Dimon456 писал(а):Ну и как этот ШИМ реализовать, есть пример реализации?
Если проблемы с реализацией ШИМа, то может не стоить себя мучить и лучше оставить SPI :) Примеров в сети полно, задача из разряда для начинающих, нужно просто захотеть разобраться.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3906741#p3906741"]Да, только за этими 5 строчками скрывается ище кое что,
ну а так отличная помощь, особенно начинающим.[/uquote]
Этот код и не должен напрямую помогать начинающим, он скорее показывает, что мк становятся сложнее и ценность всевозможных библиотек возрастает.
Reflector писал(а):и конечно же ваш код был использован для теста.
И самый главный ваш совет, разрешите процитирую
Я еще в теме про плеер принцип на словах объяснил, рабочий пример программы, пусть и на своих классах, привел, и в сети действительно подобных примеров полно, один из них ты сам нашел. А когда после этого в личке опять просят рабочий пример, значит самому разбираться лень и хочется получить все в готовом виде, для чего мне еще, видимо, нужно переписать свой код на регистрах и под мк который у тебя есть в наличии... Естественно был дан совет или захотеть разобраться самому или дальше юзать SPI.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Ну вот и истина
Reflector писал(а):был дан совет
а то
Reflector писал(а):было все разжевано
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3906814#p3906814"]Ну вот и истина[/uquote]
Пример на С++ был приведен, могу даже повторить:
Спойлер

Код: Выделить всё

   uint8_t buf[9] = { 51, 109, 109, 51, 109, 109, 51, 51, 0 };
	
	PinA<6, AF1>::mode<PinMode::AF_PushPull>();
	
	Dma1Ch1 ch1;
	ch1.setPeriphRequest(DmaReq::Tim3_CH1);
	ch1.initMemToPeriph(buf, DmaSrc::_8b_Inc, &TIM3->CCR1, DmaDst::_16b, 9);
	
	Timer3 tim3;
	tim3.init(0, 128 * 1.25 - 1, TimMode::Upcounter, true);
	tim3.capCom1.initOutput(1, TimOutputMode::PwmMode1, CcrPreload::On);
	tim3.enableDmaRequests<TimDmaReq::CapCom1>();
	ch1.enable();
	tim3.enable();
Изображение
Не нужно знать C++, чтобы большая часть была понятна нужно знать периферию STM32, в крайнем случае можно спросить что не ясно. Спрашивал? Нет, просто дайте ему код который будет работать у него :)
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Калокуб в перемешку с cmsis. Такую бредятину стряпаете. Не надо никаких левых библиотек и уводить людей в заблуждение.
Достаточно си и cmsis. А кому очень хочется есть стандартный cubemx.
А таймера и дма я не зря привел. Код не портируемый и много связей. C++ здесь ничего не ускоряет, все остальное легко на си прогается.

Именно поэтому у vladislav нет автоматизации что нужно всю архитектуру изучить и завернуть в кресты. Это не требуется и это очень долго все к тому же не портируемая либа будет на разные серии и разные архитектуры, можно конечно изучить и все серии, но это колоссальная работа должна быть проведена.

В программировании микроконтролеров не кресты важны, а иметь базовые понятия си, умения програмировать регистры и читать референс мануал.

Кресты в мк дохлая тема и трата времени.

Следующий пример аппаратный декодер на таймерах протокола Nec. Жду на крестах
Последний раз редактировалось Oxford Ср окт 14, 2020 21:17:19, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3906884#p3906884"]Именно поэтому у vladislav нет автоматизации[/uquote]Вы сообщения выборочно читаете? Я на прошлой странице всё утро показывал таймер, завёрнутый в класс.

С++ в МК уже тем хорош, что думать приучает.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Владик не нужны там классы чтобы включить таймер записью в регистр. Тебе про другую автоматизацию речь ведут.
Ты лишнюю работу делаешь и занимаешься не тем. Не ну если это твоя работа говнолибы прогать то ладно.

А на си типо думать не надо че за ахинея?
Думать надо не на си или крестах, думать надо в мануале и изучать английский и язык си. А на си уже просто программируешь нужную идею.

К тому же отладка сводиться как раз к пониманию работы регистров и чем ты к ним ближе тем эффективнее работа твоя. и отладка на си гораздо легче.

У мк большая часть работы это аппаратная. Ее нужно настроить и связать между собой правильно, правильно обработать прерывания, правильно составить алгоритмы.

Если ты возьмешь нордик, avr, pic, msp и другие то твои либы там не будут работать. На этом я заканчиваю если кто не понимает я не буду распинаться по сто раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="Oxford",url="/forum/viewtopic.php?p=3906910#p3906910"]На этом я заканчиваю если кто не понимает я не буду распинаться по сто раз.[/uquote]
Не уж-то это произойдет? Или все же станет очередным обещанием, которое в последствии затрется?

В последнее время с++ все активнее продвигается в embedded и мне, например, интересно посмотреть реализации на его основе, особенно без токсичных комментариев, полных околофекальных эпитетов.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

pavell реализации чего? Как сконфигурировать порты чтоли или настроить таймер? Берешь мануал, си и программируешь.
А реализации на си тебе не интересны? Или ты уже все стандарты крестов изучил, англ, архитектуру мк и готов говнолибы пейсать никому не нужные?

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

Нечего там на крестах смотреть.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

разрешите поинтересоваться - какие проекты реализовали гуру? описания в пару слов достаточно. а то с моей колокольни без CUBEMX, HAL, FREERTOS, LWIP и C++ сверху ну никак.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Мой последний проект это проприетарный полнодуплексный USB-uart радиомост работающий на расстоянии 15-20 метров на скорости 19200 без тормозов в условиях помех. Прошивки для девайса и хоста были написаны за 7 дней. Написаны только на си и cmsis, даже ос не применялась, все практически аппаратно плюс немного алгоритмов программных. использовался чип nrf52832
Изображение


Недавно мне надоело выключать ТВ и приставку с двух пультов, я сделал плату на STM32F030 чтобы ТВ понимал кнопку питания от приставки. Кода там кот наплакал тоже на си и регистрах. Сделано за 2 дня. 1 день я анализировал пульты снимал команды и писал код для декодера и генерации. на второй день сделал плату и установил в ящик. Плата вешается на ИК приемник.
Изображение



Следующий проект это я изучал дисплей от велокомпьютера, подключил его к STM32.
Изображение


Сейчас я работаю над интересным дизайнерским бумбоксом под заказ. Проект будет на изи опубликован в ветке про мои бумбоксы.

Ярослав555 а зачем тебе LWIP, есть же W5500
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="Oxford",url="/forum/viewtopic.php?p=3907018#p3907018"]Ярослав555 а зачем тебе LWIP, есть же W5500[/uquote]
А TLS шифрование трафика, сертификаты? MQTT, TCP сервер... Я просто не в курсе, что W5500 умеет. Но могу сказать, что наши с Вами задачи на разных уровнях по объёму использования библиотек.

Вот сейчас сапорчу один немецкий проект - плата должна читать резистивную матрицу. А дальше отправлять данные. Но интерфейсов 4 - юсб, кан, эзернет и вайфай. С одной стороны заказчик хочет стартовать по любому интерфейсу, а данные получать по всех. Но они разные по скорости, и для оптимизации процесса заказчик решил что если стартуем по юсб, то отдаем по юсб, эзернету. по кан не надо - он тормозит процесс. А вот если стартуем по кан - то отдаем по всех интерфейсах. И таких вариаций по разным вопросам набирается вагон и маленькая тележка - все угадать не получается. А вот плюсы дают гибкость - основной процесс я строю на основании списка виртуальных интерфейсов. Все реализации я наследую от этого интерфейса. У меня получается что две части изолированы - я могу менять одно, не ломая другое. А если вспомнить, что это все работает асинхронно и все должно успевать! Это один из примеров.

Еще один пример, это когда я делал мастер Profibus сети. Опять сложность была в большой вариации возможных конечных наборов параметров. Чтобы иметь возможность гибко набирать стек устройств на шине, опять же применялись виртуальные классы и прочие прелести плюсов. Так что, дело в разных задачах. Банальность, но - каждый инструмент под свои задачи. Кому то стройного Си достаточно, кому то нужна гибкость плюсов.
Ответить

Вернуться в «ARM»