STM32 blink++ или читаем данные инкрементального энкодера

  • Tutorial

Мотивация


Пару месяцев назад я рассказывал, как работает инкрементальный энкодер и как читать угол при помощи простейшей ардуины. Разумеется, немедленно получил вот такие комментарии:



У меня ардуино головного мозга. Пусть лично я самой средой ардуино и не пользуюсь, но всё же считаю, что это весьма полезная штука. Я слышал много ужасов про то, как начинать с 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. Но теперь мне совершенно ясно, отчего у подобных синих таблеток существенно меньше коммьюнити. Если вам не нужна головная боль, а нужно просто работающее железо, то не ведитесь на рекламу, мол, оно всё копеечное. Покупайте настоящие программаторы и настоящие платы разработчика. А то и вообще оставайтесь в среде ардуино, в ней много чего вкусного.
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 67
  • +4
    моментально превращается в головную боль

    епрст… да какая головная боль? Ну возьмите голый PIC/AVR/MSP430 там не такая головная боль? О чем сравнение то?
    ST вам дает за 3уе:
    — борду
    — отладчик/флешер
    — халявную среду для конфигурации( не вкурсе о ПО для других камней), ее хотя бы можно юзать для подбора МК по пиреферии и понимании что есть в МК и даже можно нагенерить write-only кода, если что то понадобилось «на вчера».
    И в замен на это, просит всего лишь открыть и почитать RM0080, что бы не выглядеть невежей но нет же.
    У меня ардуино головного мозга.

    натулим в while побольше кода, и задержек не забудем сказать что все сложно не очевидно/неправильно/глупо.
    Насчет ераты:
    Уже миллиарды разов было освещено что 10х серия — это первая линейка arm от st, и что она действительно была не особо удачна, в сравнении скажем с L-параллельными или более старшими.
    ЗЫ. Доставило 13-ти (sic!!) минутное видео о том, что надо включать serial debug.
    • +5
      Обратите внимание, что видео не моё. Но оно очень показательное. У человека проблема, он её долго пытается решить. Он тупой? Или просто с документацией непорядок? У меня тоже этот простейший код занял три дня. Я тупой?

      Весь мой пост о том, что за 3 уе мы получаем кучу неочевидных (иногда преодолимых) косяков. Кроме того, у вас взаимоисключающие параграфы. Сначала вы говорите, что за 3 уе куча всего вкусного, а потом что не надо брать 10x.

      Что такое rm0080 я не в курсе. Я по совету купил эту синюю таблетку, открыл stm.com. Какие мои дальнейшие действия? Покажите мне место, где от-и-до описано, как завести инкрементальный энкодер.
      • +1
        Уже миллиарды разов было освещено что 10х серия — это первая линейка arm от st, и что она действительно была не особо удачна, в сравнении скажем с L-параллельными или более старшими.

        Можете скинуть какой-нибудь один из миллиардов материалов по этой теме ради общего развития?


        Да и если смотреть, F1 вполне занимает свою нишу и неясно, чем ее заменить. Либо менее производительные с меньшей периферией, либо более производительные (и более дорогие).
        Ближе всего F0. F1 и F0 все равно очень популярны, потому что предлагают серьезный "фарш" за феноменально низкую стоимость. F0 вообще самые дешевые доступные 32-х битные МК, если я не ошибаюсь.

        • 0
          STM32F103RBT6 — $10.37
          STM32F303RBT6 — $8.45
          F3 серия, понемногу вытесняет F1, в ценовом плане, имея примерно ту же производительность, и периферию.
          F1 популярны, за счет того, что в свое время на них было написано тонна инфы и туториалов от сообщества, а человек по своей сути ленив, и не желает изучать/пробовать что то новое более лучшее.
          Те кто плотно занимается этим вопросом, давно забыли об этой линейке, или используют F0 или F2/4.
          Для «wireless» разработчиков, так же есть STM32WB, судя по документации, весьма годный продукт для IoT и т.п.
          • 0
            Скрытый текст
            Мой коммент не будет конструктивным, поэтому спрятан. Интересно выглядит вытеснение по вашим ссылкам:
            103, In Stock: 6223
            303, In Stock: 506

            • +1
              Такой же неконструктивный комментарий
              Говорят, если товара на складах много, то он никому не нужен… но это только говорят.
        • +1
          Люто плюсую автора. Начинал разработку собственных embedded устройств два года назад именно с STM32. Теперь мне больно вспоминать свои мучения с экосистемой STM32. Читаю статью, и вижу, что ничего не изменилось.

          В вашем комментарии вижу только не очень обоснованную критику Ардуино, которой, похоже, вы не особо и пользовались. Но всё-таки отвечу, как человек, который собирал грабли и с STM32, и с Ардуино. Хочу заметить, что я не хочу обливать грязью STM32, и почти ничего плохого о STM32 сказать не хочу, это хорошее железо, но всё познаётся в сравнении. И одного железа мало (иначе бы AVR уже давно вымер).
          ST вам дает за 3уе

          Как раз вчера хотел купить комплект. Минимум, что подобрал на 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 на Гитхабе прямо от компании-разработчика чипа.

          Ну возьмите голый PIC/AVR/MSP430 там не такая головная боль?

          С голым, наверное, ± одинаково. Но мы не обсуждаем голый, мы обсуждаем, как минимум, распаянный на микро дев-борде. Определённой модели и со своим названием, по которому уже можно искать инструменты конкретно под эту борду.
          халявную среду для конфигурации( не вкурсе о ПО для других камней)

          Для других камней есть open source инструменты, и они намного лучше работают из коробки, чем STM32. C более простой и понятной конфигурацией, и часто вообще без необходимости лазить куда-то в настройки.
          И в замен на это, просит всего лишь открыть и почитать RM0080

          Понятия не имею, что такое RM0080. Почему-то Ардуино втыкаешь в USB, запускаешь IDE, выбираешь через GUI «Открыть пример», прошиваешь пример в один клик, и всё работает. Это первый раз на свежем компе. Установка IDE в один клик, компиляция и прошивка в один клик, переключение на другую из поддерживаемых плат — один клик. Даже переключение между ARM и AVR.

          Про библиотеки вообще молчу, под STM32 нужно быть первопроходцем и кодить поддержку почти любого периферийного устройства по даташиту. Под Ардуино, скорее всего, уже есть библиотека.
          • 0

            Почему-то заходиш в папку cubemx береш и используеш любой пример из папки demonstration и прошиваеш одним make, make upload. ESP32 еще и умеет в вафлю и свой компилятор со своей средой, без ардуино. Классная штука только, отладки нет, can/usb/нормальные таймеры/ethernet/spi slave/ i2c slave отсутвуют напрочь, не говоря уже о простейшем доступе к ногам контроллера в 1 или 4 такта.

            • +2
              Позвольте вам возразить.
              Люди склонны недооценивать уровень небходимых усилий для решения какой-то задачи, когда они уже знают как её решить.
              Сейчас мне нравиться работать с STM32 больше чем с Arduino, но! На первый запуск “мигания светодиодом” и установку необходимого софта, я потратил:
              Ардуино — 1 час.
              STM32 — 3 дня.
              С STM32 проблема в поиске информации, если ты не знаешь с чего даже начинать.
              Сейчас же всё логично и просто, но! Это потому что я уже знаю как решить эту задачу!
              • 0
                Уточните, пожалуйста, где брать примеры? А то я их у себя в папке кубмх не вижу:

                ~/soft/STM32CubeMX$ find . -name demo*
                ~/soft/STM32CubeMX$


                P.S. А ведь я так и не дождался обещанной вами статьи!
                • 0

                  ~/STM32Cube/Repository/STM32Cube_FW_F1_V1.6.0 у меня
                  и C:\Users\Armleo\STM32Cube\Repository\STM32Cube_FW_F1_V1.6.0 в винде.
                  Да, завалило работой. Врядли найду время ближайший год :(.

                  • 0
                    Ну вот ещё один пример плохой документации. У меня в папке с stm32cubemx ничего подобного не лежит:

                    ~$ ls -1 soft/STM32CubeMX/
                    auto-install.xml
                    db
                    help
                    olddb
                    plugins
                    STM32CubeMX
                    Uninstaller
              • 0
                Due — очень неудачная плата, лучше брать её клоны без serial-конвертера на борту, но с выведенным ethernet. Ну или Zero, если страна позволяет
                • 0
                  Чем неудачная? И можете пояснить ремарку про Zero, при чём тут страна?
                  У настоящей Due и у нормальных клонов, как раз, нет конвертера, там второй USB порт для программирования с отдельным контроллером Atmega 16u2. Конвертер у дешёвых клонов.
                  Zero тоже вариант, там есть аппаратный float, но очень мало GPIO. Периферии тоже меньше, наверное. Частота почти вдвое ниже. Вдвое меньше флэша и RAM. И ещё Zero — это Cortex M0, а Due — M3. ИМХО Due лучше по всем параметрам, и её цена оправдана.
                  • 0
                    Да там с питанием что-то напутали, случается внезапная смерть. На оффоруме много тем типа «Видится, но не работает».
                    Про атметоговский контроллер в качестве конвертера я и говорил. Лучше его выкинуть (правда, я думал, что там 32u4) и оставить 1 usb, родной, юзать USBAsp или шить через native port, и вывести ethernet.
                    Zero вроде US-only. М0, мало GPIO… ардуино, имхо, она или для чего-то маленького и короткоживущего, или для знакомства. Перестало хватать М0 — покупаешь M4F и разводишь плату.
                    • 0
                      Перестало хватать М0 — покупаешь M4F и разводишь плату

                      Между чёрным и белым есть много оттенков)
                      У китайских клонов, я думаю, проблема смерти решена. Покупать оригинал не вижу смысла, цена космос (но, нужно признать, на эти деньги они разработали много опен-сорс софта и библиотек, всю экосистему Ардуино. Просто я жадный, и зарплата у меня не западная).
                      • 0
                        Это скорее так, но к мудрости я приблизился, имея на руках 2 оригинальных Due, один с дохлым M3, другой с дохлыми M3+32u4
                        Между чёрным и белым есть много оттенков)
                        16 Мгц хватит всем :) А если USB не нужен, то и 1-8 хватит, десятки и сотни МГц какому-нибудь термометру излишни, окружающий мир довольно медленный.
                        • 0
                          16 Мгц хватит всем
                          А я в первый же месяц вялотекущих экспериментов с Uno прочувствовал на своей шкуре все ограничения: и 16 МГц, и 8 бит (эти два параметра взаимно усугубляют друг друга), и 2 кБ памяти. У меня был простой скетч, который делал простую вещь, занимал 1800 байт ОЗУ, и ему еле-еле хватало производительности, чтоб не выглядеть откровенно тормозным. Это после серьёзной оптимизации.
                          Например, для работы с экраном никогда не будет лишней ни скорость, ни память. Разница между Uno и Due — земля и небо. А для обработки аудио очень в тему 32-битность и быстрый float.
                    • 0

                      Купите STM32F4Discovery, или китайские аналоги. Стоят они чуть больше Due.
                      У Дуе, Нет Ethernet MII (Не выведена), Ноги контроллера памяти не разведены(ЕДИНСТВЕННАЯ НОГА), из-за чего контроллер памяти нельзя использовать, не выведена нога контроллера экранов (снова только одна).
                      Отсутвуют большинство крутой переферийных фич, которые банально не выведены.
                      А STMF4Discovery, таких поблем нет.

                      • 0
                        У меня была F3 Discovery и F4 Discovery. О, сколько я часов убил, портируя свой примитивнейший проект на F103.
                        А что за контроллер экранов? Впервые слышу о такой периферии, о каких экранах речь?
              • +1
                Он тупой.Но оно очень показательное

                Да. Видео из разряда:
                — Я сел в машину, нажал на педаль газа и она не едет
                — Но вы же не включили зажигание, и передачу не выбрали
                — Я нажал на педаль газа и она не едет.
                Показательное, но мораль только одна — RTFM
                Что такое rm0080 я не в курсе.

                Проблема определенно в этом, а не в том, что длинная ерата в МК.
                Мои слова, адресованы не конкретно вам, а всем тем, которые думают, что все МК одинаковы, и подход к ним такой же. Но это не так. Более того, никогда и нигде не будет «так как в ардуино» потому что ардуино — это подход к программированию МК, а не сам МК, и их сравнивать просто глупо.

                А насчет ераты, я вот уже достаточно много всяких безделушек кодил под 103-ю линейку, и еще ни разу не стыкался с вопросом, который бы вел меня в ерата. Чаще всего дело именно во мне.
                • 0
                  Дяденька, прекращайте выпендриваться. Если есть совет, то дайте его, и мне, и читателям будет полезно.
                  А так вы выглядите пустозвоном.

                  Скрытый текст
                  ~$ lynx -dump https://www.google.fr/search?q=rm0080
                  Recherche [1]Images [2]Maps [3]Play [4]YouTube [5]Actualités [6]Gmail
                  [7]Drive [8]Plus »

                  [9]Historique Web | [10]Paramètres | [11]Connexion

                  [12][googlelogo_desk_heirloom_color_150x55dp.gif]
                  rm0080___________________________________ Rechercher
                  [13]Recherche avancée
                  [14]Préférences

                  Web Environ 2 010 résultats (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

                  • 0
                    Я вас обидел? Простите.
                    Совет читать документацию: RM0008
                    • +2
                      Спасибо за ссылку. Конечно, я этот документ внимательно изучал (в интересующих меня местах). Кстати, мне это не везде помогло, например, тот факт, что таймер нужно не только инициализировать, но ещё и запустить, неочевидно найти в одной тысяче ста тридцати трёх страницах.

                      HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);

                      Поэтому от документации ожидается не только описание регистров процессора, но ещё и база данных примеров.
                      • +1
                        но ещё и база данных примеров.
                        AN4776
                        Я вам еще в первом сообщении описал, в чем ваша проблема, более того, свой подход к «изучению и использованию stm32» вы сами описали в статье:
                        В идеальном случае больше ничего не нужно. Достаточно зарегистироваться на этих двух сайтах, скачать софт, покликать на кнопочки «ок».

                        Так что теперь вы сами себе злой буратина, и моя карма из профиля в этом не виновата.
                        • 0
                          Я говорил, что другого софта не нужно. От использования документации я не отказываюсь. В приведённом вами аппноте нет примера работы с энкодером.
                • 0
                  А вот это все, что пришлось накликать — можно в виде текста/кода наконфигурировать?
                  • +1
                    Можно, но вряд ли нужно. Это очень наглядно и быстро, особенно когда нужно всякие связки делать, например, два шестнадцатиразрядных таймера в один тридцатидвухразрядный превратить. Текстом будет явно дольше.
                    • 0
                      Почему же, для контроля версий ручной вариант наверняка сильно чище.
                      • +2
                        Вот так выглядит конфиг, сгенерированный для этого проекта. Для контроля версий отлично пригоден.
                  • 0

                    Спокойно можно. Лично я предпочитаю SPL вместо HAL и пишу конфигурацию руками. С HAL тоже можно. Да, я знаю, что ST объявила SPL устаревавшим, но он нравится мне больше.>

                  • 0
                    Я примерно догадываюсь что вы использовали таймер с внешним тактированием в качестве аппаратного счетчика тиков энкодера, но ведь такой подход не позволяет учитывать направление вращения… или я что-то не понял?
                    • 0
                      Там два входа, поэтому считает в обе стороны.
                    • +2
                      Автор, я вас не пойму. Arduino- это не мк, среда Arduino и на стм есть. Вы любите платы Arduino? или камни Atmega? Из поста не ясно, ведь вы почему-то начали писать пример в среде CubeMX, но не в среде Arduino. Камень то причем? STM дает отличные камни, которые можно зашить (счастье то после атмег!) без программаторов, если вдруг что пошло не так. Залейте ардуино-бутлоадер — и будет у вас вполне обычная Arduino. Даже названия пинов на плате будут совпадать с тем, что в коде писать будете. Если сравнивать камни — Atmega тоже не так просты, если их программировать напрямую, без дополнительных библиотек.
                      PS: CubeMX сложная штука, и в ней много индусского/плохо протестированного кода, поэтому там ЕСТЬ ошибки и неработающие штуки. Однако она здорово экономит время при разработке довольно сложных вещей
                      • +2
                        Для камней атмел ардуино-среда лично для меня не нужна, она меня больше ограничивает, чем позволяет экономить время. Но не в этом дело, мне нравится наличие огромной базы проектов и соответствующего кода, практически всё, что мне нужно, кто-то уже сделал и описал. И мне нравится, когда всё работает без танцев с бубном. Даже тот же бутлоадер далеко не всегда очевидно залить на синюю таблетку.

                        STM32 хорошая вещь, я ей буду пользоваться, причём именно в связке cubemx/eclipse. Но я предупреждаю тех людей, у которых мало времени, что может потребоваться неопределённое время на решение проблем. Никакой религии в моих словах нет.
                        • 0
                          Я так понял, большинство проблем с внутрисхемной отладкой? Так ведь редкий ардуинщик ее использует (и использует ли вообще?).
                          • 0
                            Не только. Я предчувствую кучу проблем с реализацей всяких кольцевых буферов для DMA при работе с портами и прочим. Атмеловские камни имеют готовые буферы, если не ошибаюсь. В общем, ничего плохого нет, просто стм очевидно сложнее.

                            Меня просто раздражают свидетели Иеговы, которые говорят, что молоток плохо, нужна пила. И я предупреждаю на своём личном опыте, что самый первый проект может занять несколько дней, а не три минуты, как в случае с ардуиновской платой (кстати, почему-то про них все забывают, когда говорят про ардуину, упирая только на проц) и с ардуиновской средой программирования. Но когда вам нужны DAC/CAN и прочие свистелки, то очевидно атмела уже не хватает. Нужна «пила».
                            • 0
                              Использовал недавно DMA при работе с SPI, на максимальных скоростях, полет нормальный. CubeMX+F103, проблемы были только из-за моего неумения использовать библиотеку. Да, STM32 очевидно сложнее чем 8-битная атмега, вы сравниваете несравнимые вещи. Я думаю, 32битный ARM Atmel будет не сильно проще в программировании, чем STM. Сложность — плата за универсальность, столько периферии-то впихнуть в кристалл!
                              • 0
                                А я разве что-то другое говорю? Полностью согласен. Я просто говорю, что для первого погружения в мир stm32 нужна не одна сотня часов, и к этому надо быть готовым. Хотя огромное спасибо разработчикам stm, с трудом представляю каково было без cubemx когда-то…
                                • 0
                                  Можете посоветовать приличный ресурс, описывающий работу с DMA? Архитектура для чайников и т.п. Сухой даташит пережёвывать сложно.
                                  • +1
                                    Мне хватило беглого гуглинга. Как один из примеров, или вот. Но естественно нужно строить работу на прерываниях, только так можно достичь хороших скоростей.
                                    • 0
                                      Позвольте мне немного пойти дальше и посоветовать вам nuttx. Даже есть описание кто запускает и как .
                                      Там правда более старая версия nuttx.
                                      Но вы получаете полноценный posix и забывает про порты прерывание и т.д.

                                      Может вам понравится.
                                      • 0
                                        О, а вот тут интересно. Чем отличается nuttx от freertos?
                                        • +1
                                          Nuttx это не только rtos но и готовый код для работы с периферией. Для всех контроллеров в едином виде. То есть вы с uart работаете как на компе с /dev/tty.
                                          С Spi и i2c как некии обобщенным интерфейсом единым почти для всех контроллеров от разных вендоров)
                                          Единственное таймеры свои для всех контроллеров. Но в пределах серии api похоже.
                                          Вот код отвечающий за периферию для stm32
                                          • 0

                                            arduino posix style?

                                            • 0
                                              Не понял ваш комментарий. Но могу сказать, что качество кода там относительно неплохое. И проект много где используется.
                                              Из известных это тотже osmocombb
                                              Автопилот px4
                            • 0
                              Есть подозрение, что функций тонкой конфигурации периферии СТМ32 в Ардуино-языке нет. Значит нужно писать свое. И тут мгновенно натыкаемся на необходимость использования либо стандартной библиотеки либо HAL. Т.е. те же уши, вид сбоку.
                              Там еще проблема со всеми этими СТМ-вскими библиотеками, что функции типа управления энкодерами очень плохо описаны и приходится угадывать как их использовать. А тут хоть в кубе атогенерация кода — большое послабление.
                            • 0
                              capture = TIM4->CNT;
                              encoder += capture - capture_prev;

                              Нафига это? Каунтер хранит всегда состояние энкодера. Вправо крутишь — меняет в одну сторону. Влево — в другую.
                              (А, прочитал зачем — переполнения считать. Ну так можно настроить например срабатывание по каждому четвертому фронту. А можно и не настраивать :-))
                              Следующий шаг настроить DMA и иметь вообще пустой основной цикл.

                              • +1
                                Где почитать про DMA для чайников?
                                • +1

                                  Ну, к примеру: DMA+USART. Правда, там SPL. А потом уже под конкретную задачу адаптировать — по-сути, достаточно настроить нужный режим и адреса.

                                  • +1
                                    Спасибо! SPL под HAL переписать я сумею, мне главные принципы понять.
                                  • 0

                                    Смотреть в папке cubemx firmware. Там примеров овердофига. И еще почитать даташит и "stm32f1 hal and ll pdf", дма в hal простетское, просто не забудьте включить соотв. Пункт дма в кубани

                                • +4
                                  Но мы-то включили, а плата могла прийти с отключенным SWD, откуда свистопляска.

                                  Пока ни разу не столкнулся с платой, которая пришла с отключенным SWD, Вам видимо очень крупно не повезло. В таком случае потребуется ловкость рук — Connect Under Reset. Прошить STM32 с отключенным SWD:


                                  1. включить в прошивальщике Connect Under Reset
                                  2. подать низкий уровень на резет и шить
                                    a) У вас оригинальный ST-Link — расслабьтесь
                                    б) Переделка ST-Link
                                    в) Нажать на кнопку Reset и отпустить сразу в момент начала прошивки. Может получится не с первого раза
                                  • 0
                                    Cпасибо за совет!
                                    • 0
                                      Читаю пост про переделку st-link:
                                      Например, на заре моего знакомства с STM32, мне пришла отладочная плата с Китая с залитой демо программой моргания светодиодом и отключенным SWD, я не сразу понял, как к ней подключиться.


                                      Именно мой случай. И поскольку это была первая в моей жизни плата, настроенного окружения не было, и я очень долго думал, где косяк.
                                      • 0
                                        > У вас оригинальный ST-Link — расслабьтесь

                                        О, а вот эта шляпа с «оригинальным» программатором — это до сих пор актуально?
                                        openocd до сих пор может не всё?
                                      • +4
                                        Касательно «передёргивания» USB при ресете МК есть ещё один грязный хак, позаимствованный из V-USB (программная реализация USB для AVR). Можно тупо перевести ногу D+ из режима USB в режим OUTPUT и выдать ноль на 250 мс. Замыкание линии D+ (это легально — спецификация USB требует от хостов переживать замыкание между собой любых проводников кабеля USB в течении не менее 24 часов, иначе они не прошли бы сертификацию) приведёт к пропаданию напряжения на D+ как и в случае отключения подтягивающего резистора. После выполнения сброса, вернуть ногу D+ в нормальный режим.

                                        Это является нарушением спецификации USB (такое устройство не прошло бы сертификацию, чтобы гордо носить значок про поддержку USB), однако вполне работоспособно и в отличии от всех остальных вариантов требует только изменений в коде.
                                      • +1
                                        Есть еще один апнот AN4013 STM32 cross-series timer overview, в котором в разделе «Advanced features for motor control» рассматриваются разные режимы обработки последовательностей инкрементального энкодера (x2, x4) с временными диаграммами и последовательностью инициализации таймера общего назначения. Кроме того, здесь же приводятся основы работы с advanced-таймером для формирования ШИМ с «мертвым» временем.
                                        • 0
                                          Ради интереса тоже поглядел про резистор с D+ на +3.3 у меня тоже стоит 10 ком. А переделал много всяких девайсов на этой плате, как просто HID так и custom и никогда проблем с конектом по USB с ПК не было.
                                          • 0
                                            Я сделал очень много устройств на Ардуино (начиная от управления реле по блютус, TFT экраны, осциллографы и т.д. — десятки устройств), я делал пробные проекты на STM32, аналогично автору, повторил на этой платформе GRBL контроллер. Опыт есть. И вот сейчас очень плотно перешел на Omega2, Orange PI.
                                            Мои пять копеек:
                                            Очень большая и подробная статья, как мигать светодиодом. Много треда про то, на какой плате лучше мигать светодиодами…
                                            Я хочу предупредить тех, у кого стоит выбор — если есть желание делать что-то юзабельное, а не мигать диодом, лучше сразу смотреть в Raspberry Pi, Orange Pi, e.t.c.
                                            Работая с Ардуино, я постоянно упирался в нехватку памяти. Делаешь какой-то проект, например робот-танк, дисплей с выводом на очки изображения, как в Google Glass, и постоянно — нет памяти добавить какую-нибудь маленькую процедурку.
                                            Можно потратить много сил, и быть в плену или рамках Ардуино/STM32.
                                            Сейчас разница в стоимости между всеми платформами минимальная — Omega2 я покупал за $5 и не платил за доставку, Orange Pi — до $10.
                                            На этих платформах я делаю реально юзабельные вещи — это и RetroGamePi, это и три вебсервера в коробочке размером с пару спичечных коробков (OrangePiZero), это стриминговый радилприемник на кухне на OrangePi.
                                            • +3
                                              Выбор инструмента очень сильно зависит от того, что нужно делать. Если вам нужен вебсервер, то пай хорош. Если же вам нужен жёсткий реалтайм для управления железом, то инструменты будут другими.

                                              И да, статья именно о том, как мигать светодиодом, что напрямую написано в заголовке :)
                                              • 0

                                                В целом есть 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

                                              • 0
                                                Про косяк с USB — в Stm32Duino (Arduino на Stm32 / BluePill) с ним ниразу не сталкивался. Имеет смысл подсмотреть, как они обошли его?
                                                • +1

                                                  Никак. Загрузчик ресетит себя сам, если поступает такая команда из usbcdc. А автор про эту особенность не знает и ждет, что все это сделает видимо cubemx.

                                                • +1

                                                  цитата: Мы хотим, чтобы работал процесс отладки, поэтому ставим 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 и будет вам Щастье.

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                  Самое читаемое