Мотивация


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



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

Комментарии (63)


  1. saw_tooth
    22.02.2018 20:33

    моментально превращается в головную боль

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

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


    1. haqreu Автор
      22.02.2018 20:40

      Обратите внимание, что видео не моё. Но оно очень показательное. У человека проблема, он её долго пытается решить. Он тупой? Или просто с документацией непорядок? У меня тоже этот простейший код занял три дня. Я тупой?

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

      Что такое rm0080 я не в курсе. Я по совету купил эту синюю таблетку, открыл stm.com. Какие мои дальнейшие действия? Покажите мне место, где от-и-до описано, как завести инкрементальный энкодер.


    1. Alex_ME
      22.02.2018 23:35
      +1

      Уже миллиарды разов было освещено что 10х серия — это первая линейка arm от st, и что она действительно была не особо удачна, в сравнении скажем с L-параллельными или более старшими.

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


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


      1. saw_tooth
        23.02.2018 00:01

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


        1. haqreu Автор
          23.02.2018 00:05

          Скрытый текст
          Мой коммент не будет конструктивным, поэтому спрятан. Интересно выглядит вытеснение по вашим ссылкам:
          103, In Stock: 6223
          303, In Stock: 506


          1. saw_tooth
            23.02.2018 00:12

            Такой же неконструктивный комментарий
            Говорят, если товара на складах много, то он никому не нужен… но это только говорят.


    1. VioletGiraffe
      23.02.2018 17:51
      +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 нужно быть первопроходцем и кодить поддержку почти любого периферийного устройства по даташиту. Под Ардуино, скорее всего, уже есть библиотека.


      1. Armleo
        24.02.2018 07:56

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


        1. DmitriyDev
          25.02.2018 09:26
          +1

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


        1. haqreu Автор
          25.02.2018 10:18

          Уточните, пожалуйста, где брать примеры? А то я их у себя в папке кубмх не вижу:

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


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


      1. Gryphon88
        24.02.2018 21:19

        Due — очень неудачная плата, лучше брать её клоны без serial-конвертера на борту, но с выведенным ethernet. Ну или Zero, если страна позволяет


        1. VioletGiraffe
          24.02.2018 21:36

          Чем неудачная? И можете пояснить ремарку про Zero, при чём тут страна?
          У настоящей Due и у нормальных клонов, как раз, нет конвертера, там второй USB порт для программирования с отдельным контроллером Atmega 16u2. Конвертер у дешёвых клонов.
          Zero тоже вариант, там есть аппаратный float, но очень мало GPIO. Периферии тоже меньше, наверное. Частота почти вдвое ниже. Вдвое меньше флэша и RAM. И ещё Zero — это Cortex M0, а Due — M3. ИМХО Due лучше по всем параметрам, и её цена оправдана.


          1. Gryphon88
            24.02.2018 21:48

            Да там с питанием что-то напутали, случается внезапная смерть. На оффоруме много тем типа «Видится, но не работает».
            Про атметоговский контроллер в качестве конвертера я и говорил. Лучше его выкинуть (правда, я думал, что там 32u4) и оставить 1 usb, родной, юзать USBAsp или шить через native port, и вывести ethernet.
            Zero вроде US-only. М0, мало GPIO… ардуино, имхо, она или для чего-то маленького и короткоживущего, или для знакомства. Перестало хватать М0 — покупаешь M4F и разводишь плату.


            1. VioletGiraffe
              24.02.2018 22:56

              Перестало хватать М0 — покупаешь M4F и разводишь плату

              Между чёрным и белым есть много оттенков)
              У китайских клонов, я думаю, проблема смерти решена. Покупать оригинал не вижу смысла, цена космос (но, нужно признать, на эти деньги они разработали много опен-сорс софта и библиотек, всю экосистему Ардуино. Просто я жадный, и зарплата у меня не западная).


              1. Gryphon88
                25.02.2018 01:42

                Это скорее так, но к мудрости я приблизился, имея на руках 2 оригинальных Due, один с дохлым M3, другой с дохлыми M3+32u4

                Между чёрным и белым есть много оттенков)
                16 Мгц хватит всем :) А если USB не нужен, то и 1-8 хватит, десятки и сотни МГц какому-нибудь термометру излишни, окружающий мир довольно медленный.


                1. VioletGiraffe
                  25.02.2018 02:25

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


  1. saw_tooth
    22.02.2018 20:44
    -1

    Он тупой.Но оно очень показательное

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

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

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


    1. haqreu Автор
      22.02.2018 20:48

      Дяденька, прекращайте выпендриваться. Если есть совет, то дайте его, и мне, и читателям будет полезно.
      А так вы выглядите пустозвоном.

      Скрытый текст
      ~$ 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


      1. saw_tooth
        22.02.2018 20:57

        Я вас обидел? Простите.
        Совет читать документацию: RM0008


        1. haqreu Автор
          22.02.2018 21:02

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

          HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);

          Поэтому от документации ожидается не только описание регистров процессора, но ещё и база данных примеров.


          1. saw_tooth
            22.02.2018 21:18

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

            Так что теперь вы сами себе злой буратина, и моя карма из профиля в этом не виновата.


            1. haqreu Автор
              22.02.2018 22:17

              Я говорил, что другого софта не нужно. От использования документации я не отказываюсь. В приведённом вами аппноте нет примера работы с энкодером.


  1. j_wayne
    22.02.2018 21:41

    А вот это все, что пришлось накликать — можно в виде текста/кода наконфигурировать?


    1. haqreu Автор
      22.02.2018 22:18
      +1

      Можно, но вряд ли нужно. Это очень наглядно и быстро, особенно когда нужно всякие связки делать, например, два шестнадцатиразрядных таймера в один тридцатидвухразрядный превратить. Текстом будет явно дольше.


      1. j_wayne
        22.02.2018 22:33

        Почему же, для контроля версий ручной вариант наверняка сильно чище.


        1. haqreu Автор
          22.02.2018 22:35

          Вот так выглядит конфиг, сгенерированный для этого проекта. Для контроля версий отлично пригоден.


          1. j_wayne
            22.02.2018 22:37

            Да, сойдет.


    1. Alex_ME
      22.02.2018 23:00

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


  1. Vindicar
    22.02.2018 21:58

    Я примерно догадываюсь что вы использовали таймер с внешним тактированием в качестве аппаратного счетчика тиков энкодера, но ведь такой подход не позволяет учитывать направление вращения… или я что-то не понял?


    1. haqreu Автор
      22.02.2018 22:15

      Там два входа, поэтому считает в обе стороны.


  1. Sergey_datex
    22.02.2018 22:09

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


    1. haqreu Автор
      22.02.2018 22:22

      Для камней атмел ардуино-среда лично для меня не нужна, она меня больше ограничивает, чем позволяет экономить время. Но не в этом дело, мне нравится наличие огромной базы проектов и соответствующего кода, практически всё, что мне нужно, кто-то уже сделал и описал. И мне нравится, когда всё работает без танцев с бубном. Даже тот же бутлоадер далеко не всегда очевидно залить на синюю таблетку.

      STM32 хорошая вещь, я ей буду пользоваться, причём именно в связке cubemx/eclipse. Но я предупреждаю тех людей, у которых мало времени, что может потребоваться неопределённое время на решение проблем. Никакой религии в моих словах нет.


      1. j_wayne
        22.02.2018 22:36

        Я так понял, большинство проблем с внутрисхемной отладкой? Так ведь редкий ардуинщик ее использует (и использует ли вообще?).


        1. haqreu Автор
          22.02.2018 22:43

          Не только. Я предчувствую кучу проблем с реализацей всяких кольцевых буферов для DMA при работе с портами и прочим. Атмеловские камни имеют готовые буферы, если не ошибаюсь. В общем, ничего плохого нет, просто стм очевидно сложнее.

          Меня просто раздражают свидетели Иеговы, которые говорят, что молоток плохо, нужна пила. И я предупреждаю на своём личном опыте, что самый первый проект может занять несколько дней, а не три минуты, как в случае с ардуиновской платой (кстати, почему-то про них все забывают, когда говорят про ардуину, упирая только на проц) и с ардуиновской средой программирования. Но когда вам нужны DAC/CAN и прочие свистелки, то очевидно атмела уже не хватает. Нужна «пила».


          1. Sergey_datex
            22.02.2018 22:47

            Использовал недавно DMA при работе с SPI, на максимальных скоростях, полет нормальный. CubeMX+F103, проблемы были только из-за моего неумения использовать библиотеку. Да, STM32 очевидно сложнее чем 8-битная атмега, вы сравниваете несравнимые вещи. Я думаю, 32битный ARM Atmel будет не сильно проще в программировании, чем STM. Сложность — плата за универсальность, столько периферии-то впихнуть в кристалл!


            1. haqreu Автор
              22.02.2018 22:58

              А я разве что-то другое говорю? Полностью согласен. Я просто говорю, что для первого погружения в мир stm32 нужна не одна сотня часов, и к этому надо быть готовым. Хотя огромное спасибо разработчикам stm, с трудом представляю каково было без cubemx когда-то…


            1. haqreu Автор
              22.02.2018 23:01

              Можете посоветовать приличный ресурс, описывающий работу с DMA? Архитектура для чайников и т.п. Сухой даташит пережёвывать сложно.


              1. Sergey_datex
                23.02.2018 00:19
                +1

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


              1. a1ien_n3t
                23.02.2018 00:25

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

                Может вам понравится.


                1. haqreu Автор
                  23.02.2018 00:26

                  О, а вот тут интересно. Чем отличается nuttx от freertos?


                  1. a1ien_n3t
                    23.02.2018 00:36
                    +1

                    Nuttx это не только rtos но и готовый код для работы с периферией. Для всех контроллеров в едином виде. То есть вы с uart работаете как на компе с /dev/tty.
                    С Spi и i2c как некии обобщенным интерфейсом единым почти для всех контроллеров от разных вендоров)
                    Единственное таймеры свои для всех контроллеров. Но в пределах серии api похоже.
                    Вот код отвечающий за периферию для stm32


                    1. FGV
                      23.02.2018 19:36

                      arduino posix style?


                      1. a1ien_n3t
                        23.02.2018 22:10

                        Не понял ваш комментарий. Но могу сказать, что качество кода там относительно неплохое. И проект много где используется.
                        Из известных это тотже osmocombb
                        Автопилот px4


    1. imwode
      23.02.2018 04:19

      Есть подозрение, что функций тонкой конфигурации периферии СТМ32 в Ардуино-языке нет. Значит нужно писать свое. И тут мгновенно натыкаемся на необходимость использования либо стандартной библиотеки либо HAL. Т.е. те же уши, вид сбоку.
      Там еще проблема со всеми этими СТМ-вскими библиотеками, что функции типа управления энкодерами очень плохо описаны и приходится угадывать как их использовать. А тут хоть в кубе атогенерация кода — большое послабление.


  1. imwode
    22.02.2018 22:48

    capture = TIM4->CNT;
    encoder += capture - capture_prev;

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


    1. haqreu Автор
      22.02.2018 23:00

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


      1. Alex_ME
        22.02.2018 23:06
        +1

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


        1. haqreu Автор
          22.02.2018 23:08

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


      1. Armleo
        24.02.2018 08:02

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


  1. Alex_ME
    22.02.2018 23:13

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

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


    1. включить в прошивальщике Connect Under Reset
    2. подать низкий уровень на резет и шить
      a) У вас оригинальный ST-Link — расслабьтесь
      б) Переделка ST-Link
      в) Нажать на кнопку Reset и отпустить сразу в момент начала прошивки. Может получится не с первого раза


    1. haqreu Автор
      22.02.2018 23:23

      Cпасибо за совет!


    1. haqreu Автор
      22.02.2018 23:31

      Читаю пост про переделку st-link:

      Например, на заре моего знакомства с STM32, мне пришла отладочная плата с Китая с залитой демо программой моргания светодиодом и отключенным SWD, я не сразу понял, как к ней подключиться.


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


    1. ineganov
      23.02.2018 15:46

      > У вас оригинальный ST-Link — расслабьтесь

      О, а вот эта шляпа с «оригинальным» программатором — это до сих пор актуально?
      openocd до сих пор может не всё?


  1. KivApple
    23.02.2018 00:17

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

    Это является нарушением спецификации USB (такое устройство не прошло бы сертификацию, чтобы гордо носить значок про поддержку USB), однако вполне работоспособно и в отличии от всех остальных вариантов требует только изменений в коде.


    1. haqreu Автор
      23.02.2018 00:18

      Жесть. Спасибо!


  1. meda1ex
    23.02.2018 09:05
    +1

    Есть еще один апнот AN4013 STM32 cross-series timer overview, в котором в разделе «Advanced features for motor control» рассматриваются разные режимы обработки последовательностей инкрементального энкодера (x2, x4) с временными диаграммами и последовательностью инициализации таймера общего назначения. Кроме того, здесь же приводятся основы работы с advanced-таймером для формирования ШИМ с «мертвым» временем.


  1. sami777
    23.02.2018 11:27

    Ради интереса тоже поглядел про резистор с D+ на +3.3 у меня тоже стоит 10 ком. А переделал много всяких девайсов на этой плате, как просто HID так и custom и никогда проблем с конектом по USB с ПК не было.


  1. Saddamko
    23.02.2018 14:40
    -1

    Я сделал очень много устройств на Ардуино (начиная от управления реле по блютус, TFT экраны, осциллографы и т.д. — десятки устройств), я делал пробные проекты на STM32, аналогично автору, повторил на этой платформе GRBL контроллер. Опыт есть. И вот сейчас очень плотно перешел на Omega2, Orange PI.
    Мои пять копеек:
    Очень большая и подробная статья, как мигать светодиодом. Много треда про то, на какой плате лучше мигать светодиодами…
    Я хочу предупредить тех, у кого стоит выбор — если есть желание делать что-то юзабельное, а не мигать диодом, лучше сразу смотреть в Raspberry Pi, Orange Pi, e.t.c.
    Работая с Ардуино, я постоянно упирался в нехватку памяти. Делаешь какой-то проект, например робот-танк, дисплей с выводом на очки изображения, как в Google Glass, и постоянно — нет памяти добавить какую-нибудь маленькую процедурку.
    Можно потратить много сил, и быть в плену или рамках Ардуино/STM32.
    Сейчас разница в стоимости между всеми платформами минимальная — Omega2 я покупал за $5 и не платил за доставку, Orange Pi — до $10.
    На этих платформах я делаю реально юзабельные вещи — это и RetroGamePi, это и три вебсервера в коробочке размером с пару спичечных коробков (OrangePiZero), это стриминговый радилприемник на кухне на OrangePi.


    1. haqreu Автор
      23.02.2018 14:42
      +1

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

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


    1. Armleo
      24.02.2018 07:49

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


  1. Fox_exe
    23.02.2018 15:57

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


    1. Armleo
      24.02.2018 07:37

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


  1. Armleo
    24.02.2018 08:16

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