Мотивация
Пару месяцев назад я рассказывал, как работает инкрементальный энкодер и как читать угол при помощи простейшей ардуины. Разумеется, немедленно получил вот такие комментарии:
У меня ардуино головного мозга. Пусть лично я самой средой ардуино и не пользуюсь, но всё же считаю, что это весьма полезная штука. Я слышал много ужасов про то, как начинать с stm32, и не хотел в это влезать. С другой стороны, в последнее время всё чаще стали слышны комментарии о том, что инструментарий допилили и вообще всё в шоколаде. Решил попробовать, сколько времени у меня займёт сделать простейший проект типа помигать светодидом. Купил синюю таблетку, купил китайский аналог отладчика st-link v2, и сел с этим всем разбираться.
Забегая вперёд, вот так выглядит железка, о которой идёт речь:
Поехали: настройка проекта
В качестве среды разработки я выбрал System Workbench for STM32, это эклипс с предустановленными плагинами для работы с stm32. Вторая софтина, которой очень удобно пользоваться, это STM32CubeMX. В идеальном случае больше ничего не нужно. Достаточно зарегистироваться на этих двух сайтах, скачать софт, покликать на кнопочки «ок».
А дальше начинается самое интересное. Интернет очень беден на туториалы, которые работают. Посему покажу целиком весь кликодром, который позволил запустить мой код. Я чувствую, что сам буду возвращаться в этот пост.
Запускаем STM32CubeMX, вбиваем наш процессор и жмём на кнопку start project:
STM32CubeMX — это софтина, в которой мы конфигурируем ноги процессора, а потом получаем готовый шаблон кода, в котором уже всё сконфигурировано, нужно лишь использовать.
У большинства синих таблеток на пине PC13 висит светодиод, как же мы без него, конфигурируем его в GPIO_OUTPUT:
Мы хотим, чтобы работал процесс отладки, поэтому ставим serial wire в SYS:
Я решил повесить энкодер на таймер TIM4, ставлю его в этот режим. Обратите внимание, что НЕКОТОРЫЕ входы процессора терпимы к 5 вольтам (five volt tolerant, FT), и конкретно PB6/PB7 позволяют подключить пятивольтовый энкодер.
Я люблю выводить данные в старый добрый виртуальный последовательный порт, прямо как в ардуине, поэтому кликаем ещё пару раз:
Процессор будет получать клок от внешнего резонатора:
Теперь ноги более-менее расставлены, самое время расставить клоки. Идём в закладку clock configuration, и отказываемся от автоматического помощника:
После чего выставляем всякие делители следующим образом:
Дальше configuration->GPIO настраиваем ногу GPIO:
и в configuration->TIM4 настраиваем таймер так, чтобы он считал в режиме 4x (см. мою предыдующую статью, там объясняется, что это такое)
После чего в настройках проекта выставляем директории и то, что код должен сгенерироваться под System Workbench for STM32:
После чего генерируем код, и открываем эклипс. Первым делом кликаем сюда:
И дальше мы готовы писать код.
Непосредственно код и отладка
Вот так выглядит единственный код, который я написал руками, в нём всё довольно прозрачно:
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM4_Init();
MX_USB_DEVICE_Init();
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
char buf[25];
int32_t capture=0, capture_prev=0, encoder=0;
while (1) {
capture = TIM4->CNT;
encoder += capture - capture_prev;
if (abs(capture-capture_prev)>32767) {
encoder += (capture<capture_prev ? 65535 : -65535);
HAL_GPIO_TogglePin(MY_PIN_13_GPIO_Port, MY_PIN_13_Pin);
}
capture_prev = capture;
sprintf(buf,"count: [%ld]\n", encoder);
CDC_Transmit_FS((uint8_t *)buf, strlen(buf));
HAL_Delay(100);
}
}
Единственная тонкость в том, что у синей таблетки все счётчики 16-битные, а у меня энкодер генерирует 10000 событий на оборот. Поэтому я руками отслеживаю переполнение значения счётчика, мой код предполагает, что между двумя чтениями счётчика энкодер не сгенерирует 32к импульсов, писать прерывания-обработчики события overflow/underflow мне было откровенно лень. Светодиод у меня изменяет своё состояние при каждом переполнении, у нас блинк или нет?
Всё вроде готово, поэтому компилируем проект и запускаем отладчик:
Сама синяя таблетка воткнута в usb, от неё идут 3 провода к китайскому stlink, который тоже в свою очередь воткнут в usb. Энкодер получает питание 5В от USB. Если всё прошло хорошо, то запустится отладчик и у нас в системе появится виртуальный порт /dev/ttyACM0.
Вращаю вал энкодера пальцами, делаю cat /dev/ttyACM0 и наслаждаюсь правильным чтением энкодера:
Если хочется сделать просто блинк/подобное, то минимальное подключение синей таблетки выглядит вот так:
А если не всё хорошо?
USB
Чтобы дойти до этого момента, мне понадобилось полных три дня. Что же заняло столько времени? Например, если я повторно залью код в синюю таблетку, то она будет хорошо работать, отладка тоже, последовательный порт будет присутствовать в системе, но ничего из него не будет поступать. Если переткнуть usb шнурок, то всё будет прекрасно.
Длительное гугление приводит к тому, что в разводке платы есть проблемы, и более того, чаще всего в ней стоит неправильный резистор:
Замена этого резистора у мне помогла на половине компьютеров. Более внимательное гугление показывает вот это. Вот так выглядит предложенный фикс:
Я же удовольствовался программным резетом усб устройства. Вот код, ему достаточно сделать cc usbreset.c:
Скрытый текст
/* usbreset -- send a USB port reset to a USB device */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;
if (argc != 2) {
fprintf(stderr, "Usage: usbreset device-filename\n");
return 1;
}
filename = argv[1];
fd = open(filename, O_WRONLY);
if (fd < 0) {
perror("Error opening output file");
return 1;
}
printf("Resetting USB device %s\n", filename);
rc = ioctl(fd, USBDEVFS_RESET, 0);
if (rc < 0) {
perror("Error in ioctl");
return 1;
}
printf("Reset successful\n");
close(fd);
return 0;
}
А вот так его работа:
Обратите внимание, что сначала из порта ничего не поступало, после софтерного резета всё починилось.
SWD
Какие ещё могут быть проблемы? Например, неработающий отладчик:
Я очень долго не мог залить код, а когда смог, то сначала мне приходилось ставить джамперы в boot0=1, boot1=0, заливать код, а потом переставлять джамперы обратно. При том, что нормальное положение джамперов — это boot0=boot1=0. Это из-за того, что в процессоре был отключен SWD, обратите внимание, что мы его специально включали в STM32CubeMX. Но мы-то включили, а плата могла прийти с отключенным SWD, откуда свистопляска.
Бутлоадер
Если вдруг кто-то решит, что ардуино-среду уже допилили под стм, то имейте в виду, что бутлоадер скорее всего предпрошит не будет.
Защита от записи
В одной из купленных мною плат был просто защищён от записи флеш. Единственно известный мне способ это починить — это под виндой установить STM32 ST-LINK Utility и полностью затереть память. Линуксовые приблуды не помогают.
Просто дохлые платы
А бывает и так. Причём оно как-то шевелится, но частично дохлое. Как это отличать от своих кривых рук — не очень ясно.
SWO: Serial wire output
У вас есть официальная демо-плата и вы привыкли делать вывод информации через SWO? С китайским клоном напрямую такой фикус не пройдёт, не теряйте время, вот фикс:
Вывод
И много-много других проблем, каждая из которых в принципе может быть решена. Например, то, что у stm32 errata (если существует) зачастую длиннее самого даташита…
Нигде нет системизированной информации для новичков, простейшая мигалка светодиодом моментально превращается в головную боль. Да, теперь я чуточку разобрался, и очень надеюсь, что смогу продолжить разработку с меньшими проблемами, у меня хотя бы точно работает отладчик.
В целом я не жалею потраченного времени, и следующий проект буду пилить на stm32. Но теперь мне совершенно ясно, отчего у подобных синих таблеток существенно меньше коммьюнити. Если вам не нужна головная боль, а нужно просто работающее железо, то не ведитесь на рекламу, мол, оно всё копеечное. Покупайте настоящие программаторы и настоящие платы разработчика. А то и вообще оставайтесь в среде ардуино, в ней много чего вкусного.
saw_tooth
епрст… да какая головная боль? Ну возьмите голый PIC/AVR/MSP430 там не такая головная боль? О чем сравнение то?
ST вам дает за 3уе:
— борду
— отладчик/флешер
— халявную среду для конфигурации( не вкурсе о ПО для других камней), ее хотя бы можно юзать для подбора МК по пиреферии и понимании что есть в МК и даже можно нагенерить write-only кода, если что то понадобилось «на вчера».
И в замен на это, просит всего лишь открыть и почитать RM0080, что бы не выглядеть невежей но нет же.
натулим в while побольше кода, и задержек не забудем сказать что все сложно не очевидно/неправильно/глупо.
Насчет ераты:
Уже миллиарды разов было освещено что 10х серия — это первая линейка arm от st, и что она действительно была не особо удачна, в сравнении скажем с L-параллельными или более старшими.
ЗЫ. Доставило 13-ти (sic!!) минутное видео о том, что надо включать serial debug.
haqreu Автор
Обратите внимание, что видео не моё. Но оно очень показательное. У человека проблема, он её долго пытается решить. Он тупой? Или просто с документацией непорядок? У меня тоже этот простейший код занял три дня. Я тупой?
Весь мой пост о том, что за 3 уе мы получаем кучу неочевидных (иногда преодолимых) косяков. Кроме того, у вас взаимоисключающие параграфы. Сначала вы говорите, что за 3 уе куча всего вкусного, а потом что не надо брать 10x.
Что такое rm0080 я не в курсе. Я по совету купил эту синюю таблетку, открыл stm.com. Какие мои дальнейшие действия? Покажите мне место, где от-и-до описано, как завести инкрементальный энкодер.
Alex_ME
Можете скинуть какой-нибудь один из миллиардов материалов по этой теме ради общего развития?
Да и если смотреть, F1 вполне занимает свою нишу и неясно, чем ее заменить. Либо менее производительные с меньшей периферией, либо более производительные (и более дорогие).
Ближе всего F0. F1 и F0 все равно очень популярны, потому что предлагают серьезный "фарш" за феноменально низкую стоимость. F0 вообще самые дешевые доступные 32-х битные МК, если я не ошибаюсь.
saw_tooth
STM32F103RBT6 — $10.37
STM32F303RBT6 — $8.45
F3 серия, понемногу вытесняет F1, в ценовом плане, имея примерно ту же производительность, и периферию.
F1 популярны, за счет того, что в свое время на них было написано тонна инфы и туториалов от сообщества, а человек по своей сути ленив, и не желает изучать/пробовать что то новое более лучшее.
Те кто плотно занимается этим вопросом, давно забыли об этой линейке, или используют F0 или F2/4.
Для «wireless» разработчиков, так же есть STM32WB, судя по документации, весьма годный продукт для IoT и т.п.
haqreu Автор
saw_tooth
VioletGiraffe
Люто плюсую автора. Начинал разработку собственных embedded устройств два года назад именно с STM32. Теперь мне больно вспоминать свои мучения с экосистемой STM32. Читаю статью, и вижу, что ничего не изменилось.
В вашем комментарии вижу только не очень обоснованную критику Ардуино, которой, похоже, вы не особо и пользовались. Но всё-таки отвечу, как человек, который собирал грабли и с STM32, и с Ардуино. Хочу заметить, что я не хочу обливать грязью STM32, и почти ничего плохого о STM32 сказать не хочу, это хорошее железо, но всё познаётся в сравнении. И одного железа мало (иначе бы AVR уже давно вымер).
Как раз вчера хотел купить комплект. Минимум, что подобрал на Aliexpress — $4.5 за плату STMF103 + клон ST-Link v2. Arduino Due (тоже ARM) стоит от $12. Мой совет: лучше доплатить, если только у вас нет чёткого представления, что вы будете с этим железом делать.
А ещё есть ESP32, 2-ядерный контроллер на 160 МГц со встроенным Wi-Fi и Bluetooth. И с аппаратным floating point unit. И с 4 МБ флэш / 256 КБ ОЗУ. И с родной поддержкой экосистемы Ардуино, то есть любой инструмент, поддерживающий Ардуино, заработает и с этой платой (сила абстракции и декомпозиции). И всё это за 7 долларов за отладочную платку, инструменты бесплатные, софт open-source на Гитхабе прямо от компании-разработчика чипа.
С голым, наверное, ± одинаково. Но мы не обсуждаем голый, мы обсуждаем, как минимум, распаянный на микро дев-борде. Определённой модели и со своим названием, по которому уже можно искать инструменты конкретно под эту борду.
Для других камней есть open source инструменты, и они намного лучше работают из коробки, чем STM32. C более простой и понятной конфигурацией, и часто вообще без необходимости лазить куда-то в настройки.
Понятия не имею, что такое RM0080. Почему-то Ардуино втыкаешь в USB, запускаешь IDE, выбираешь через GUI «Открыть пример», прошиваешь пример в один клик, и всё работает. Это первый раз на свежем компе. Установка IDE в один клик, компиляция и прошивка в один клик, переключение на другую из поддерживаемых плат — один клик. Даже переключение между ARM и AVR.
Про библиотеки вообще молчу, под STM32 нужно быть первопроходцем и кодить поддержку почти любого периферийного устройства по даташиту. Под Ардуино, скорее всего, уже есть библиотека.
Armleo
Почему-то заходиш в папку cubemx береш и используеш любой пример из папки demonstration и прошиваеш одним make, make upload. ESP32 еще и умеет в вафлю и свой компилятор со своей средой, без ардуино. Классная штука только, отладки нет, can/usb/нормальные таймеры/ethernet/spi slave/ i2c slave отсутвуют напрочь, не говоря уже о простейшем доступе к ногам контроллера в 1 или 4 такта.
DmitriyDev
Позвольте вам возразить.
Люди склонны недооценивать уровень небходимых усилий для решения какой-то задачи, когда они уже знают как её решить.
Сейчас мне нравиться работать с STM32 больше чем с Arduino, но! На первый запуск “мигания светодиодом” и установку необходимого софта, я потратил:
Ардуино — 1 час.
STM32 — 3 дня.
С STM32 проблема в поиске информации, если ты не знаешь с чего даже начинать.
Сейчас же всё логично и просто, но! Это потому что я уже знаю как решить эту задачу!
haqreu Автор
Уточните, пожалуйста, где брать примеры? А то я их у себя в папке кубмх не вижу:
~/soft/STM32CubeMX$ find . -name demo*
~/soft/STM32CubeMX$
P.S. А ведь я так и не дождался обещанной вами статьи!
Gryphon88
Due — очень неудачная плата, лучше брать её клоны без serial-конвертера на борту, но с выведенным ethernet. Ну или Zero, если страна позволяет
VioletGiraffe
Чем неудачная? И можете пояснить ремарку про Zero, при чём тут страна?
У настоящей Due и у нормальных клонов, как раз, нет конвертера, там второй USB порт для программирования с отдельным контроллером Atmega 16u2. Конвертер у дешёвых клонов.
Zero тоже вариант, там есть аппаратный float, но очень мало GPIO. Периферии тоже меньше, наверное. Частота почти вдвое ниже. Вдвое меньше флэша и RAM. И ещё Zero — это Cortex M0, а Due — M3. ИМХО Due лучше по всем параметрам, и её цена оправдана.
Gryphon88
Да там с питанием что-то напутали, случается внезапная смерть. На оффоруме много тем типа «Видится, но не работает».
Про атметоговский контроллер в качестве конвертера я и говорил. Лучше его выкинуть (правда, я думал, что там 32u4) и оставить 1 usb, родной, юзать USBAsp или шить через native port, и вывести ethernet.
Zero вроде US-only. М0, мало GPIO… ардуино, имхо, она или для чего-то маленького и короткоживущего, или для знакомства. Перестало хватать М0 — покупаешь M4F и разводишь плату.
VioletGiraffe
Между чёрным и белым есть много оттенков)
У китайских клонов, я думаю, проблема смерти решена. Покупать оригинал не вижу смысла, цена космос (но, нужно признать, на эти деньги они разработали много опен-сорс софта и библиотек, всю экосистему Ардуино. Просто я жадный, и зарплата у меня не западная).
Gryphon88
Это скорее так, но к мудрости я приблизился, имея на руках 2 оригинальных Due, один с дохлым M3, другой с дохлыми M3+32u4
16 Мгц хватит всем :) А если USB не нужен, то и 1-8 хватит, десятки и сотни МГц какому-нибудь термометру излишни, окружающий мир довольно медленный.VioletGiraffe
Например, для работы с экраном никогда не будет лишней ни скорость, ни память. Разница между Uno и Due — земля и небо. А для обработки аудио очень в тему 32-битность и быстрый float.
saw_tooth
Да. Видео из разряда:
— Я сел в машину, нажал на педаль газа и она не едет
— Но вы же не включили зажигание, и передачу не выбрали
— Я нажал на педаль газа и она не едет.
Показательное, но мораль только одна — RTFM
Проблема определенно в этом, а не в том, что длинная ерата в МК.
Мои слова, адресованы не конкретно вам, а всем тем, которые думают, что все МК одинаковы, и подход к ним такой же. Но это не так. Более того, никогда и нигде не будет «так как в ардуино» потому что ардуино — это подход к программированию МК, а не сам МК, и их сравнивать просто глупо.
А насчет ераты, я вот уже достаточно много всяких безделушек кодил под 103-ю линейку, и еще ни разу не стыкался с вопросом, который бы вел меня в ерата. Чаще всего дело именно во мне.
haqreu Автор
Дяденька, прекращайте выпендриваться. Если есть совет, то дайте его, и мне, и читателям будет полезно.
А так вы выглядите пустозвоном.
~$ lynx -dump https://www.google.fr/search?q=rm0080
Recherche [1]Images [2]Maps [3]Play [4]YouTube [5]Actualites [6]Gmail
[7]Drive [8]Plus »
[9]Historique Web | [10]Parametres | [11]Connexion
[12][googlelogo_desk_heirloom_color_150x55dp.gif]
rm0080___________________________________ Rechercher
[13]Recherche avancee
[14]Preferences
Web Environ 2 010 resultats (0.15 secondes)
[15]Anti-FSTL3 antibody [RM0080-7D11] (ab86055) | Abcam
Rat monoclonal FSTL3 antibody [RM0080-7D11] validated for WB and tested
in
Mouse. Immunogen corresponding to recombinant full length protein.
www.abcam.com/fstl3-antibody-rm0080-7d11-ab86055.html - 162k - [16]En
cache - [17]Pages similaires
[18]Anti-FSTL3 antibody [RM0080-7D11] (ab86055) Protocols - Abcam
Abcam provides specific protocols for Anti-FSTL3 antibody [RM0080-7D11]
(
ab86055) : Western blot protocols.
www.abcam.com/fstl3-antibody-rm0080-7d11-ab86055-protocols.html -
[19]Pages similaires
saw_tooth
Я вас обидел? Простите.
Совет читать документацию: RM0008
haqreu Автор
Спасибо за ссылку. Конечно, я этот документ внимательно изучал (в интересующих меня местах). Кстати, мне это не везде помогло, например, тот факт, что таймер нужно не только инициализировать, но ещё и запустить, неочевидно найти в одной тысяче ста тридцати трёх страницах.
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
Поэтому от документации ожидается не только описание регистров процессора, но ещё и база данных примеров.
saw_tooth
Я вам еще в первом сообщении описал, в чем ваша проблема, более того, свой подход к «изучению и использованию stm32» вы сами описали в статье:
Так что теперь вы сами себе злой буратина, и моя карма из профиля в этом не виновата.
haqreu Автор
Я говорил, что другого софта не нужно. От использования документации я не отказываюсь. В приведённом вами аппноте нет примера работы с энкодером.
j_wayne
А вот это все, что пришлось накликать — можно в виде текста/кода наконфигурировать?
haqreu Автор
Можно, но вряд ли нужно. Это очень наглядно и быстро, особенно когда нужно всякие связки делать, например, два шестнадцатиразрядных таймера в один тридцатидвухразрядный превратить. Текстом будет явно дольше.
j_wayne
Почему же, для контроля версий ручной вариант наверняка сильно чище.
haqreu Автор
Вот так выглядит конфиг, сгенерированный для этого проекта. Для контроля версий отлично пригоден.
j_wayne
Да, сойдет.
Alex_ME
Спокойно можно. Лично я предпочитаю SPL вместо HAL и пишу конфигурацию руками. С HAL тоже можно. Да, я знаю, что ST объявила SPL устаревавшим, но он нравится мне больше.>
Vindicar
Я примерно догадываюсь что вы использовали таймер с внешним тактированием в качестве аппаратного счетчика тиков энкодера, но ведь такой подход не позволяет учитывать направление вращения… или я что-то не понял?
haqreu Автор
Там два входа, поэтому считает в обе стороны.
Sergey_datex
Автор, я вас не пойму. Arduino- это не мк, среда Arduino и на стм есть. Вы любите платы Arduino? или камни Atmega? Из поста не ясно, ведь вы почему-то начали писать пример в среде CubeMX, но не в среде Arduino. Камень то причем? STM дает отличные камни, которые можно зашить (счастье то после атмег!) без программаторов, если вдруг что пошло не так. Залейте ардуино-бутлоадер — и будет у вас вполне обычная Arduino. Даже названия пинов на плате будут совпадать с тем, что в коде писать будете. Если сравнивать камни — Atmega тоже не так просты, если их программировать напрямую, без дополнительных библиотек.
PS: CubeMX сложная штука, и в ней много индусского/плохо протестированного кода, поэтому там ЕСТЬ ошибки и неработающие штуки. Однако она здорово экономит время при разработке довольно сложных вещей
haqreu Автор
Для камней атмел ардуино-среда лично для меня не нужна, она меня больше ограничивает, чем позволяет экономить время. Но не в этом дело, мне нравится наличие огромной базы проектов и соответствующего кода, практически всё, что мне нужно, кто-то уже сделал и описал. И мне нравится, когда всё работает без танцев с бубном. Даже тот же бутлоадер далеко не всегда очевидно залить на синюю таблетку.
STM32 хорошая вещь, я ей буду пользоваться, причём именно в связке cubemx/eclipse. Но я предупреждаю тех людей, у которых мало времени, что может потребоваться неопределённое время на решение проблем. Никакой религии в моих словах нет.
j_wayne
Я так понял, большинство проблем с внутрисхемной отладкой? Так ведь редкий ардуинщик ее использует (и использует ли вообще?).
haqreu Автор
Не только. Я предчувствую кучу проблем с реализацей всяких кольцевых буферов для DMA при работе с портами и прочим. Атмеловские камни имеют готовые буферы, если не ошибаюсь. В общем, ничего плохого нет, просто стм очевидно сложнее.
Меня просто раздражают свидетели Иеговы, которые говорят, что молоток плохо, нужна пила. И я предупреждаю на своём личном опыте, что самый первый проект может занять несколько дней, а не три минуты, как в случае с ардуиновской платой (кстати, почему-то про них все забывают, когда говорят про ардуину, упирая только на проц) и с ардуиновской средой программирования. Но когда вам нужны DAC/CAN и прочие свистелки, то очевидно атмела уже не хватает. Нужна «пила».
Sergey_datex
Использовал недавно DMA при работе с SPI, на максимальных скоростях, полет нормальный. CubeMX+F103, проблемы были только из-за моего неумения использовать библиотеку. Да, STM32 очевидно сложнее чем 8-битная атмега, вы сравниваете несравнимые вещи. Я думаю, 32битный ARM Atmel будет не сильно проще в программировании, чем STM. Сложность — плата за универсальность, столько периферии-то впихнуть в кристалл!
haqreu Автор
А я разве что-то другое говорю? Полностью согласен. Я просто говорю, что для первого погружения в мир stm32 нужна не одна сотня часов, и к этому надо быть готовым. Хотя огромное спасибо разработчикам stm, с трудом представляю каково было без cubemx когда-то…
haqreu Автор
Можете посоветовать приличный ресурс, описывающий работу с DMA? Архитектура для чайников и т.п. Сухой даташит пережёвывать сложно.
Sergey_datex
Мне хватило беглого гуглинга. Как один из примеров, или вот. Но естественно нужно строить работу на прерываниях, только так можно достичь хороших скоростей.
a1ien_n3t
Позвольте мне немного пойти дальше и посоветовать вам nuttx. Даже есть описание кто запускает и как .
Там правда более старая версия nuttx.
Но вы получаете полноценный posix и забывает про порты прерывание и т.д.
Может вам понравится.
haqreu Автор
О, а вот тут интересно. Чем отличается nuttx от freertos?
a1ien_n3t
Nuttx это не только rtos но и готовый код для работы с периферией. Для всех контроллеров в едином виде. То есть вы с uart работаете как на компе с /dev/tty.
С Spi и i2c как некии обобщенным интерфейсом единым почти для всех контроллеров от разных вендоров)
Единственное таймеры свои для всех контроллеров. Но в пределах серии api похоже.
Вот код отвечающий за периферию для stm32
FGV
arduino posix style?
a1ien_n3t
Не понял ваш комментарий. Но могу сказать, что качество кода там относительно неплохое. И проект много где используется.
Из известных это тотже osmocombb
Автопилот px4
imwode
Есть подозрение, что функций тонкой конфигурации периферии СТМ32 в Ардуино-языке нет. Значит нужно писать свое. И тут мгновенно натыкаемся на необходимость использования либо стандартной библиотеки либо HAL. Т.е. те же уши, вид сбоку.
Там еще проблема со всеми этими СТМ-вскими библиотеками, что функции типа управления энкодерами очень плохо описаны и приходится угадывать как их использовать. А тут хоть в кубе атогенерация кода — большое послабление.
imwode
Нафига это? Каунтер хранит всегда состояние энкодера. Вправо крутишь — меняет в одну сторону. Влево — в другую.
(А, прочитал зачем — переполнения считать. Ну так можно настроить например срабатывание по каждому четвертому фронту. А можно и не настраивать :-))
Следующий шаг настроить DMA и иметь вообще пустой основной цикл.
haqreu Автор
Где почитать про DMA для чайников?
Alex_ME
Ну, к примеру: DMA+USART. Правда, там SPL. А потом уже под конкретную задачу адаптировать — по-сути, достаточно настроить нужный режим и адреса.
haqreu Автор
Спасибо! SPL под HAL переписать я сумею, мне главные принципы понять.
Armleo
Смотреть в папке cubemx firmware. Там примеров овердофига. И еще почитать даташит и "stm32f1 hal and ll pdf", дма в hal простетское, просто не забудьте включить соотв. Пункт дма в кубани
Alex_ME
Пока ни разу не столкнулся с платой, которая пришла с отключенным SWD, Вам видимо очень крупно не повезло. В таком случае потребуется ловкость рук — Connect Under Reset. Прошить STM32 с отключенным SWD:
a) У вас оригинальный ST-Link — расслабьтесь
б) Переделка ST-Link
в) Нажать на кнопку Reset и отпустить сразу в момент начала прошивки. Может получится не с первого раза
haqreu Автор
Cпасибо за совет!
haqreu Автор
Читаю пост про переделку st-link:
Именно мой случай. И поскольку это была первая в моей жизни плата, настроенного окружения не было, и я очень долго думал, где косяк.
ineganov
> У вас оригинальный ST-Link — расслабьтесь
О, а вот эта шляпа с «оригинальным» программатором — это до сих пор актуально?
openocd до сих пор может не всё?
KivApple
Касательно «передёргивания» USB при ресете МК есть ещё один грязный хак, позаимствованный из V-USB (программная реализация USB для AVR). Можно тупо перевести ногу D+ из режима USB в режим OUTPUT и выдать ноль на 250 мс. Замыкание линии D+ (это легально — спецификация USB требует от хостов переживать замыкание между собой любых проводников кабеля USB в течении не менее 24 часов, иначе они не прошли бы сертификацию) приведёт к пропаданию напряжения на D+ как и в случае отключения подтягивающего резистора. После выполнения сброса, вернуть ногу D+ в нормальный режим.
Это является нарушением спецификации USB (такое устройство не прошло бы сертификацию, чтобы гордо носить значок про поддержку USB), однако вполне работоспособно и в отличии от всех остальных вариантов требует только изменений в коде.
haqreu Автор
Жесть. Спасибо!
meda1ex
Есть еще один апнот AN4013 STM32 cross-series timer overview, в котором в разделе «Advanced features for motor control» рассматриваются разные режимы обработки последовательностей инкрементального энкодера (x2, x4) с временными диаграммами и последовательностью инициализации таймера общего назначения. Кроме того, здесь же приводятся основы работы с advanced-таймером для формирования ШИМ с «мертвым» временем.
sami777
Ради интереса тоже поглядел про резистор с D+ на +3.3 у меня тоже стоит 10 ком. А переделал много всяких девайсов на этой плате, как просто HID так и custom и никогда проблем с конектом по USB с ПК не было.
Saddamko
Я сделал очень много устройств на Ардуино (начиная от управления реле по блютус, TFT экраны, осциллографы и т.д. — десятки устройств), я делал пробные проекты на STM32, аналогично автору, повторил на этой платформе GRBL контроллер. Опыт есть. И вот сейчас очень плотно перешел на Omega2, Orange PI.
Мои пять копеек:
Очень большая и подробная статья, как мигать светодиодом. Много треда про то, на какой плате лучше мигать светодиодами…
Я хочу предупредить тех, у кого стоит выбор — если есть желание делать что-то юзабельное, а не мигать диодом, лучше сразу смотреть в Raspberry Pi, Orange Pi, e.t.c.
Работая с Ардуино, я постоянно упирался в нехватку памяти. Делаешь какой-то проект, например робот-танк, дисплей с выводом на очки изображения, как в Google Glass, и постоянно — нет памяти добавить какую-нибудь маленькую процедурку.
Можно потратить много сил, и быть в плену или рамках Ардуино/STM32.
Сейчас разница в стоимости между всеми платформами минимальная — Omega2 я покупал за $5 и не платил за доставку, Orange Pi — до $10.
На этих платформах я делаю реально юзабельные вещи — это и RetroGamePi, это и три вебсервера в коробочке размером с пару спичечных коробков (OrangePiZero), это стриминговый радилприемник на кухне на OrangePi.
haqreu Автор
Выбор инструмента очень сильно зависит от того, что нужно делать. Если вам нужен вебсервер, то пай хорош. Если же вам нужен жёсткий реалтайм для управления железом, то инструменты будут другими.
И да, статья именно о том, как мигать светодиодом, что напрямую написано в заголовке :)
Armleo
В целом есть 4 возможных инструмента: полноценный ПК, Single Board Computer (raspberry pi, orange pi, nano pi, banana pi, beaglebone black, up board, zynq, altera soc), FPGA, Микроконтроллеры. Ну и гибриды, конечно. Для каждый задачи свой монстр: E1/PCIe/Radio/HDMI input/10G Ethernet/PCI — fpga, I2C — SBC/MCU, много памяти/обработка изображения — fpga/sbc/pc
Fox_exe
Про косяк с USB — в Stm32Duino (Arduino на Stm32 / BluePill) с ним ниразу не сталкивался. Имеет смысл подсмотреть, как они обошли его?
Armleo
Никак. Загрузчик ресетит себя сам, если поступает такая команда из usbcdc. А автор про эту особенность не знает и ждет, что все это сделает видимо cubemx.
Armleo
цитата: Мы хотим, чтобы работал процесс отладки, поэтому ставим serial wire в SYS.
Или подключаемся с connect under reset.
Цитата: Я люблю выводить данные в старый добрый виртуальный последовательный порт, прямо как в ардуине, поэтому кликаем ещё пару раз.
Не забудте проводить ресет устройства, когда придет команда по usb ep0.
Цитата: Процессор будет получать клок от внешнего резонатора
… иначе usb не будет работать.
Цитата: После чего генерируем код, и открываем эклипс
И ставим частоту swd в 2MHz, ибо не все камни нормально работают в 4.
И ставим hardware reset, и подключаем ногу ресет стлинка к ресет контроллера.
Цитата: Что же заняло столько времени? Например, если я повторно залью код в синюю таблетку, то она будет хорошо работать, отладка тоже, последовательный порт будет присутствовать в системе, но ничего из него не будет поступать. Если переткнуть usb шнурок, то всё будет прекрасно.
Вы бы почитали апноут про усб, и спецификацию усб. Спорим вы забыли получать команду ресета со стороны пк и поэтому не перезагружайте контроллер из-за чего у вас и не работал усб после перепрошивки.
Это из-за того, что в процессоре был отключен SWD
Connect under reset наше все.
Если вдруг кто-то решит, что ардуино-среду уже допилили под стм, то имейте в виду, что бутлоадер скорее всего предпрошит не будет.
Все клоны приходят с 8кб загрузчиком мапле, которые обязательно блокирует запись в флеш из отладки.
Цитата: В одной из купленных мною плат был просто защищён от записи флеш.
Но загрузчик работал исправно. А снять блокировку флеша можно в ручную с помощю openocd и swd.
Вывод: читайте чертов stm32 hal and ll, rm0080, смотрите примеры из папки демонстрейшн, или посмотрите чисто в заголовки hal и будет вам Щастье.