EmBlocks — IDE для STM32

Что нужно для разработки на основе микроконтроллера?

Как минимум сам микроконтроллер. А лучше какую-нибудь плату с минимальной обвязкой к этому микроконтроллеру.
Но МК без программы — это просто кусочек кремния с вкраплениями металла. А для программирования микроконтроллера нужна среда разработки. Можно, конечно, обойтись набором утилит в стиле Unix-way, когда в командной строке запускаются компилятор, линковщик, вручную пишется скрипт make, а редактирование исходных текстов выполняется в каком-нибудь текстовом редакторе. Но лично я предпочитаю работать с комфортом. Поэтому я стал искать интегрированную среду разработки. Она должна:

  • Иметь удобный редактор с подсветкой синтаксиса С/С++
  • Уметь находить объявления функций, переменных и констант в других файлах.
  • Автоматически генерировать шаблон проекта.
  • Иметь возможность настраивать горячие клавиши для различных действий.
  • Иметь интерфейс к отладчику.
  • Быть быстрой, чтобы комфортно работать на ноутбуке.
  • Очень желательно быть бесплатной или недорогой.

Я выбрал Em::Blocks — это IDE, построенная на основе Code::Blocks, но адаптированная для embedded разработки. То есть изначально предназначенная для разработки встраиваемых систем.

EmBlocks
Она бесплатная, удовлетворяет всем перечисленным требованиям и очень гибко настраивается.

Ко всему прочему она:

  • расширяемая и хорошо автоматизируется с помощью скриптов
  • шаблоны проектов можно настроить на свой вкус
  • можно самому изменить диалог мастера создания проекта
  • не требует установки — можно носить с собой на флешке и легко перенести с настройками на другой комп

Я настроил ее под себя:

  • Отредактировал шаблоны проектов под STM32F10x medium density, high density, medium density value line
  • В шаблонах заменил структуру проекта разложив по папкам stm_lib, cmsis, cmsis_boot и Src.
  • Обновил версию cmsis в шаблоне проекта до версии 3.0
  • Добавил поддержку ColinkEx debugger (она не очень гибкая, но работает)
  • Добавил выбор процессора в мастере создания проекта для прошивки с помощью ColinkEx
  • Добавил в меню Tools пункты «Flash w ColinkEx», «Flash w ST-Link/V2»
  • Изменил настройку по-умолчанию для ST-Link отладчика с JTAG на SWD
  • Добавил создание HEX файла для Debug target (стандартно только для Release)
  • Добавил в build options USE_STDPERIPH_DRIVER
  • Добавил в search directories stm_lib\src, stm_lib\inc, .\STM32_USB-FS-Device_Driver\src, .\STM32_USB-FS-Device_Driver\inc, cmsis, cmsis\boot
  • Исправил в gcc_arm.ld размер флеша и памяти для STM32F10x_MD серии на значения для STM32F103C8

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

Для того, чтобы начать работать с EmBlocks достаточно распаковать архив и запустить emblocks.exe.

Если кому не нравятся внесенные мной изменения — оригинал лежит на сайте разработчиков.

Что дают изменения:

  • Проект готов к прошивке сразу после создания визардом
  • Есть все, что нужно, для того, чтобы поморгать светодиодом
  • Проект рассчитан на использование STM32 StdPeriph Library (по мере необходимости добавляем модули к проекту в папку stm_lib, архив в конце статьи)
  • Для работы с USB-FS библиотекой нужно всего лишь кинуть ее в каталог проекта и добавить в проект. (архив с библиотекой в конце статьи)
  • Свежий компилер не ругается на оптимизацию благодаря новой версии CMSIS
  • Легко перенести проект из CooCox IDE
  • Можно использовать CoolinkEx, который довольно популярен у нас и можно купить в России

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

Внимение! На данный момент версия 1.x уже неактуальна, предлагаю ставить версию EmBlocks не старее 2.00 скачав с офсайта и применять мой tweaker


Описанное в статье:

UPD: К сожалению, EmBlocks хранит настройки меню Tools в профиле пользователя, поэтому вместе с архивом они не переносятся.
Откройте файл в своем профиле по адресу %userprofile%\AppData\Roaming\EmBlocks\1.1\default.conf
Строку <tools /> замените на содержимое файла.
После этого появятся пункты меню в Tools. Я чуть позже напишу подробнее о том, как настроить горячие клавиши или самому создать пункты меню.

EmBlocks — IDE для STM32: 68 комментариев

    • Попробуйте, если они одной серии, то подойдет, но если у вас low density, то скорее всего нет. т.к. Файл инициализации отличается.

      • да, действительно low density. Жаль, структура проекта понравилась. По сравнению с тем что выдает Atollic. Значит придется самому подсовывать нужные файлы инициализации.
        И еще можно вопрос: Как вы реализуете в МК функцию задержки? Видел реализацию через считывание частоты МК и последующем пустом цикле, но судя по логическому анализатору ничего общего с заданным временем не получается. Вот код:
        void Delay_us(uint32_t us)
        {
        volatile uint32_t nCount;
        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq (&RCC_Clocks);

        nCount=(RCC_Clocks.HCLK_Frequency/1000000)*us;
        for (; nCount!=0; nCount—);
        }

        Но я так понимаю, что количество nCount в цикле так же зависит и от реализации цикла в компиляторе?

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

  1. Расскажите пожалуйста подробнее как сделать такие шаблоны проектов по умолчанию, если я хочу использовать stm32l-discovery, там stm32l152rbt6

  2. Тут проблема, попробовал прошить на stm32vldiscovery, а в tools пусто, и F6 не дает эффекта. Дистрибутив с этого сайта.

    • Да, к сожалению настройки меню Tools хранятся в профиле пользователя, а не в папке программы.
      Откройте файл в своем профиле по адресу %userprofile%\AppData\Roaming\EmBlocks\1.1\default.conf
      Строку <tools /> замените на содержимое файла.
      После этого появятся пункты меню в Tools. Я чуть позже напишу подробнее о том, как настроить.

  3. Написал прогу, которая сама находит файл default.conf и модифицирует раздел tools содержимым файла default.conf находящегося рядом с запускаемой утилиткой. http://zalil.ru/34709923

    • У меня некорректно работает — файл увеличивается аж в 2 раза. Она вставляет почти весь файл на место этого тега.

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

  5. Строку tools /> замените на содержимое файла.
    Там еще желательно правильный путь указать к файлу ST-LINK_CLI.exe

  6. В визарде создаю проект:

    Вижу такое окно: https://dl.dropboxusercontent.com/u/6439155/emblock-shit.png

    Не очень понятно зачем тут выбор типа процессора, если параметры Flash, Ram итп всё равно приходится писать ручками. (предварительно загуглив)

    Какой-то убогий визард. Реально прикрутить свой?

    p.s. Jlink никак не получается заюзать для прошивки. :(
    В CooCox всё работало отлично.

    • Затем, что это значение пойдет в define проекта. Кстати, значения памяти и флеша можно и не менять, если проект мелкий.
      Визард разумеется реально прикрутить свой. Я же в патче прилагаю отредактированный вариант. Там ничего особо сложного нет, просто новичкам будет проще.
      Jlink — говно. Медленное, глючное, требует свой сервер ставить, денег хочет за свой софт, лицензии на каждый чих, клоны обновлять нельзя — иначе забанят по серийнику. Я же говорю — ST-Link оптимален. У меня есть и тот и другой и CoLinkEx. Пользуюсь в основном ST-Link. Существенно удобнее.

  7. Я верю что ST-Link оптимален. Но как насчет тысяч людей которые уже используют клон Jlink?
    Вы ведь тут популяризируете EMBlock. Но получается что глючный Jlink нормально работает в Keil, CooCox и глючит только в EM. :)
    Получается доверие к EM подрывается с первого запуска…

    Кстати, почему у вас когда я переключаю фокус с капчи на текст, число в капче становится не видимым?

    • Я не популяризую EmBlocks. Я нашел для себя IDE, на основе которой удалось собрать более-менее удобоваримую среду разработки. У нее полно недостатков, но она — лучшее, что я смог найти. Я потратил на поиски немало времени. Найденным я делюсь со всеми, кому это интересно. Разбираться с глюками JLink у меня желания нет. Я повозился с ним пару дней, мне не понравилось — даже с CooCox он работал криво и прошивать приходилось из его софтины, а не из CooCox. Поэтому я бросил его на полку и купил ST-Link v2. Jlink остался на всякий случай.
      Насчет капчи — не знаю, скорее всего глюк плагина. Я логинюсь на форме http://ravenium.ru/login, поэтому не видел глюка после обновления.

  8. что у тебя возвращает такая функция:

    char* get_battery_message(void){
    char s[200];
    sprintf(s, «=%g=», (double) 1.5);
    return s;
    }

    у меня возвращает «==» — подсказывают, что версия си-библиотеки может быть урезана…
    Тогда вопрос, как ты преобразуешь дробные числа в строку?

    • Понятия не имею. Я стараюсь не использовать текст в МК. Текст — неестественная форма данных для машин, как и консоль для человека.
      Если по существу — в комплекте с компилером есть несколько версий библиотек, по умолчанию подключается Newlib nano-branch. Она оптимизирована по размеру. Т.к. все строковые функции жрут много оперативной памяти и имеют большой размер кода, то они вполне могут быть урезаны.
      Вопрос — зачем заниматься преобразованием данных в МК? Если ты выводишь данные на ПК, то лучше гнать их в бинарнике и там преобразовывать — это экономнее и быстрее.

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

  9. Добрый день. А не могли бы вы подсказать как настроить emblocks для работы с stm32 на с++

    • До безбразия просто — создаете проект мастером как обычно, а затем переименовыете main.c в main.cpp.
      Если не делали настроек компилера, то идем в Settings->Tools и на вкладке Toolchain Executables проверяете:
      CPP compiler: arm-none-eabi-g++.exe
      Все.

  10. RaJa,
    Ты не пробовал объединить файлы инициализации, создаваемые STM32CubeMX с EmBlocks? Дело в том, что в принципе Cube создаёт начальный проект и включает для него соответствующие файлы и библиотеки для трёх разных систем: IAR, Keil и что-то ещё. EmBlocks вроде как должен уметь импортировать проекты от Keil. Но… не импортирует. Вроде как они изменили структуру проекта в новых версиях, которую Emblocks не понимает.
    Вообще говоря, один из участников обсуждения в http://forum.ixbt.com/topic.cgi?id=48:11266 писал, что он он просто тупо переносит файлы из созданой Cube директории в свой проект. А хотелось бы это делать более элегантно. Тем более, что в процессе работы конфигурация чипа может меняться.

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

  11. Здравствуйте! Вы написали: «Добавил в меню Tools пункты «Flash w ColinkEx», «Flash w ST-Link/V2″. Подскажите как это можно сделать?

  12. Такая проблема — есть отладочная плата на базе stm32f103rbt6 и плата с контроллером stm32f103c8t6. Создаю проект через мастер проектов для stm32f103c8t6, пишу код — не работает(в дебагере даже в мэйн не попадает), но если эту же прошивку залить в stm32f103rbt6(одно семейство же) — то все ОК.

    • Проверяйте startup код — скорее всего инициализация неверно выполняется. Возможно, что не тот startup файл, хотя и должен подходить. Возможно размер флеша в проекте или оперативки указан неверно.

      • Вы же кажется все свои проекты под STM32F103C8 делали, может скините ваш стартап или проект простенький (светодиод и т.п.) сравнить содержимое.
        Треть сутки — а результат =0. Просто весь проект отлаживал на плате с STm32f103RBt, теперь необходимо перенести его на STM32F103c8t6 — а тут такое)).

        • И вообще большинство производителей софта пригодного для программирования микроконтролиров почемуто избегают всю ветку RE плат.

          • Там разница только в количестве флеша, вполне можно выбрать STM32L152RD и отредактировать в stm32l152rd_flash.ld
            MEMORY
            {
            ROM (rx) : ORIGIN = 0x08000000, LENGTH = 384K
            RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 48K
            }
            поставьте значение LENGTH = 512K и всего делов то. В остальном они идентичны

  13. Не подскажете: Что меняется в Release версии (кроме удаления Debug информации)? При выборе Release — программа не совсем корректно работает (перестает работать один софтварный таймер:) ).

    • Я тоже упарился с Release. Выключил оптимизацию, но толку нет. В debug всё ОК. Пытался найти где затык в моём коде в Release, но похоже не судьба. Силы заканчиваются.

      • Уточню. У меня тоже используются в проблемном куске кода простые циклические задержки.

        • Циклические задержки — это зло, они плавают, в зависимости от загрузки проца. Естественно, они могут поплыть при любых изменениях кода. Используйте хотя бы Systick таймер для отсчета временных интервалов — это просто и не будет зависеть даже от частоты проца.

        • Сам не знаю, что сделал, но получил рабочий релиз. Размер дебага всегда был 84кБ, а рабочий релиз без оптимизации 64кБ. А раньше релиз без оптимизации получался в разных вариантах 34, 40, 49кБ (в зависимости от разных галочек).
          Уже легче.

          • RaJa.
            Да, возможно существенный момент.
            Взял сегодня ноутбук на работу и установил (скачав) последнюю версию EmBlocks 2.30. Насколько я в курсе, все ваши усовершенствования описанные здесь в статье, там уже учтены (ну кроме патча для tools, который мне пока не нужен). Сходу получил в нём рабочий релиз. Воодушевлённый этим фактом, примчался после работы домой и установил на рабочий комп новую версию EmBlocks 2.30. Но даже не запустив её, решил напоследок сбегать в старую переносимую вашу версию из этой статьи. Проверив на всякий случай галочки, сходу получил рабочий релиз.
            В общем я заподозрил, что старая переносимая ваша версия заработала как надо вследствие инсталляции новой версии.
            Прав я или не прав — мне уже кажется не важно, т.к. я рекомендую теперь всем установить новую версию. Желающие могут установить патч для менюшки tools, если конечно он сделан вами (или работоспособен старый) для новой версии.

  14. Решил этот вопрос по другому — в коде не хватало __IO перед некоторыми переменными.

  15. Скажите пожалуйста, а проекты из keil в CodeBlock можно открывать?
    Вернее открывать то открываются но не компилируются :(

    • Не компилируются :) Чтобы компилировались, нужно подключить компилер от KEIL — они отличаются

    • Меню Settings-Tools
      Выбираем ARM RlView Compiler
      Вкладка Toolchain Executables — указываем где лежит компилер
      Дальше — как повезет. Сложные проекты все равно потребуют ручной настройки, компилер будет ругаться.

  16. Подскажите пожалуйста, как в EmBitz подключить мат.библ.( #include не помогает).
    В Кокосе добавлял ‘m’ к линкеру, здесь не работает или я неправильно добавляю?

  17. Я хочу слегка освоить EmBitz и для примера попробовал синус, а вообще все началось с вашего примера USB HID. Несколько лет назад я сделал аналогичное устройство на AVR для записи сигналов с термопары в графическом виде. Оказалось очень компактное и удобное устройство особенно при работе на чужом компьютере. Попробовал переделать ваш пример для L152, но сходу не получилось. Вчера сбегал в ЧипДип и купил F103C8. Плату практически спаял. В ближайшее время буду запускать. Заранее спасибо. Затронули за живое.

  18. Добрый вечер! Собрал две одинаковых схемки USB HID. Компьютер рисует график с четырех аналоговых входов. Все хорошо на старых компьютерах с ХР. На компьютерах с 8.1 или тишина или устройство распознается неправильно, правда на одном ноутбуке на одном из трех разъемов запускаеся через раз. Пробовал безрезультатно подтягивающий резистор 1,5к подключать к 5V, а также к другому выводу D- (как в схеме с AVR). Аналогичная схема на AVR работает везде. Может надо управлять подтяжкой через один из выводов МК ?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *