Code::Blocks 12.11 – настройка Wizard для работы с платами STM32F3Discovery и STM32F4Discovery


Признаться, «Code::Blocks» я пользую относительно недавно – с момента написания первого корявого приложения прошло чуть более двух лет.
Используя IAR для реализации своих изысканий в области микроконтроллеров, я неоднократно обращал внимание на некоторое неудобство редактора кода оной IDE. Быстродействие, автодополнение, поиск и навигация по коду, и т.д., и т.п. – все это, мягко говоря, было не на высшем уровне. Потому «творил» я довольно неудобным образом: редактировал код в «Code::Blocks» (ибо мил сердцу моему он и шибко люб), а компилировал и отлаживал – в «IAR».
Так продолжалось пару месяцев, пока однажды не пришло понимание того, что об удобстве инструмента следует позаботиться, ибо из-под тупого рубанка сто процентов вылезет колючий и занозистый Буратино со скверным характером.
Я решил настроить «Code::Blocks» для работы с ARM-микроконтроллерами семейства «STM32», но… делать этого мне не пришлось – совершенно случайным образом я наткнулся в Сети на следующий материал авторства некоего Nike Khin.
В статье описывается процесс настройки специальной редакции «Code::Blocks Arduino Edition» для работы с микроконтроллерами STM32, а точнее – с микроконтроллером STM32F100RBT6B, который есть установлен на плате «STM32VLDiscovery» (на примере данной платы автор обсуждаемой статьи производит обучение и настраивает тестовый проект).
Собственно, меня все устроило, однако возникла мысль чуть доработать мастер проектов, дабы можно было без излишней суматохи в два щелчка создавать «болванку» для проектов на основе микроконтроллеров серий «F30x» и «F4xx». Основополагающей я взял идею Nike Khin в плане проекта для демо-платы, ибо за рамки демо-платы выйти можно в любом проекте, а при работе именно с Discovery всяко удобно будет. Далее я предполагаю, что архив с «Code::Blocks» скачан и распакован в любом удобном месте.
Добиться желаемого результата мне предстояло в два этапа: создать необходимые папки, в которые сложить нужные исходные файлы для «болванки» проекта, и подправить скрипт визарда таким образом, чтобы он автоматически подключал все исходники к проекту.
Создаем папку «STM32F3Discovery» (первым делом мне нужна была болванка именно под эту плату) в следующей локации: «CodeBlocks\share\CodeBlocks\templates\wizard\arm\files\». В этой папке основными вложенными у нас будут папки «Inc» (в ней – хидер «stm32f30x_conf.h») и «Lib» — здесь будут располагаться исходные файлы CMSIS, стандартной библиотеки, и исходники, имеющие непосредственное отношение к демо-плате Discovery. Также в папку «STM32F3Discovery» кладем исходный файл «main.c» (редактируем как душе угодно), и скрипт линкера «stm32_flash.ld». Все вложенное подробно не расписываю – для любопытствующих архив с папкой «STM32F3Discovery» прикреплен к топику.
Теперь беремся за wizard.script, который находится в следующем месте: «CodeBlocks\share\CodeBlocks\templates\wizard\arm\wizard.script». Нужно задекларировать нашу конфигурацию, добавить ее в список выбора, и в функции «SetupDerivative(derivative,project)» (с соответствующим конфигурации выбором оператора case) внимательно и аккуратно прописать пути ко всем папкам, которые мы желаем включить в проект – то есть, ко всем вложенным папкам в «STM32F3Discovery». Соответственно, в той же функции объявляется тип cpu (cortex-m4), опции компилятора (при желании), и опции линкера (тут же указывается название скрипта линкера stm32_flash.ld).
Получается примерно вот так:
function SetupDerivative(derivative,project)
{
	switch (board)
	{
		case -2:// STM32F3DISCOVERY
			project.AddIncludeDir(_T("lib/CMSIS/Device/ST/STM32F30x/Include"));
			project.AddIncludeDir(_T("lib/CMSIS/Include"));
			project.AddIncludeDir(_T("lib/CMSIS/Device/ST/STM32F30x/Source/Templates"));
			project.AddIncludeDir(_T("lib/STM32F30x_StdPeriph_Driver/inc"));
			project.AddIncludeDir(_T("lib/Utilities"));
			project.AddIncludeDir(_T("inc"));

			project.AddCompilerOption(_T("-fexceptions"));
			project.AddCompilerOption(_T("-mcpu=cortex-m4"));
			project.AddCompilerOption(_T("-mthumb"));
			project.AddCompilerOption(_T("-ffunction-sections"));
			project.AddCompilerOption(_T("-fdata-sections"));

			project.AddCompilerOption(_T("-DUSE_STDPERIPH_DRIVER"));
			project.AddCompilerOption(_T("-DSTM32F30X"));

			project.AddLinkerOption(_T("-T stm32_flash.ld"));
			project.AddLinkerOption(_T("-mcpu=cortex-m4"));
			project.AddLinkerOption(_T("-mthumb"));
			project.AddLinkerOption(_T("-Wl,--gc-sections"));
			project.AddLinkerOption(_T("-nostartfiles"));

			break;
.
.
.
            }
}

Опять же, дабы не захламлять топик, задумывавшийся как краткий, непонятного вида строчками скрипта, попросту прикреплю wizard.script к материалу.
Аналогичным образом поступаем (при необходимости) и с конфигурацией «STM32F4Discovery».
Таким нехитрым образом получаем возможность в любое время дня и ночи создать проект для любой демо-платы в два щелчка пальцами. Естественно, аналогично можно создавать конфигурации для любых других МК, для самодельных отладочных плат, и т.д.


ЗЫ. Во время загрузки обсуждаемой редакции «Code::Blocks» меня немного напрягала надпись «Arduino Edition» на заставке, и я ее стер. Изображение находится в следующей локации: «CodeBlocks\share\CodeBlocks\images\splash_1211.png». Можно вставить туда свою фотографию. :D

UPD.

Несколько слов о настройке GDB сервера. В «комплекте» обсуждаемой редакции «Code::Blocks» имеются два оных сервера: OpenOCD и STLink. Nike Khin настраивал openOCD, мы же попробуем работать с STLink GDB.
Забегая вперед, скажу, что STLink работает с «Code::Blocks» ощутимо быстрее, чем OpenOCD.
Как было сказано выше, в комплект редакции «Code::Blocks Arduino Edition» входит STLink GDB, однако по какой-то причине у меня работать он отказался, поэтому я опишу процесс настройки «с нуля», да и пользователям стандартного «C::B» полезно будет.
Качаем STLink GDB сервер (v.0.5.3) отсюда (осторожно, скачивание начнется автоматически после нажатия), распаковываем архив в папку «Code Blocks\utils\stlinkwin\» (папку создаем самостоятельно).
Далее нам необходимо создать в среде «Code::Blocks» новый инструмент: Tools->Configure Tools…->Add.
В открывшемся окне заполняем поля:
Name: stutil
Executable: $(APP_PATH)\utils\stlinkwin\bin\st-util.exe
Working directory: $(APP_PATH)\utils\stlinkwin
Опцию «Launching options» оставляем в варианте «Launch tool in a new console windows and wait for a keypress when done». В общем виде все выглядит вот так:


Теперь настраиваем проект на работу с данным GDB сервером. Идем «Project->Properties», находим вкладку «Debugger», в окне «Select target:» выбираем «Project», и заполняем поля:
IP address: localhost
Port: 4242 (openOCD «слушает» на 3333 порту, а STLink – на 4242)


И завершающий штрих — тут же, во вкладке «Debugger», открываем «Additional GDB commands», и в окне «After connection» вписываем две команды, которые будут посланы автоматически GDB-серверу после установки соединения:

monitor reset halt
load


Жмем «ОК». Сконфигурировано и готово к работе.
Для начала нам нужно установить соединение с отладчиком. Снова идем «Tools», и в списке инструментов выбираем наш «stutil». В возникшей консоли STLink салютует нам об успешном соединении и считанных параметрах тарджет-контроллера, к которому он получил доступ.


Теперь можем запускать отладку в «Code::Blocks».


Процесс пошел.


Конечно же, «Code::Blocks» с помощью GDB не предоставит тех возможностей, что способны предоставить дебагеры специально предназначенных и разработанных для встраиваемых систем IDE (IAR, Atollic, Keil и т.д.). Однако, средств, которые мы получаем, используя «Code::Blocks», вполне достаточно для осуществления успешной отладки.
  • +8
  • 13 июня 2013, 11:30
  • SubDia
  • 2
Файлы в топике: STM32F3DISCOVERY.zip, wizard.zip

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

RSS свернуть / развернуть
Чем ардуино эдишн отличается от обычного кодблокса?
0
  • avatar
  • Vga
  • 13 июня 2013, 13:16
Собственно, наличием библиотек, настройкой визарда для Ардуино. Вот что пишут на странице загрузки этой редакции на arduinodev:
It provides more demanding software developers with everything a modern IDE should have including code foldering, code completion, code navgiation, compiling as well as uploading for Arduino. With a dedicated project wizard, it’s easy create a ready-to-go Arduino project. The distribution integrates latest Arduino core files, standard Arduino libraries, AVR toolchain, Arduino Builder, a serial terminal and most interesting, an API-level Arduino simulator (under development).
Features:
dedicated project wizard for Arduino development
integrated Arduino core files and libraries
compiled core files cached for faster compiling speed (comparing to original Arduino IDE)
integrated pre-configured AVR compiler toolchain
popular Arduino boards supported as build targets
uploading HEX to Arduino boards (Leonardo supported) by running the built target
Arduino API-level simulator (very early stage) integrated (as a build target)
0
а что с отладкой арм? нормально там выглядит отладчик для 10х? статью пока не читал
0
Пока гонял на F3 Discovery, вроде полет нормальный. Вечерком могу пару скринов приаттачить.
0
скриншоты бы не помешали
до этого видел уг по сравнению с оригинальным эклипсом от ти
имеется в виду наглядное представление состояний битов регистров, а не унылые столбцы хексов в колонках
0
Я понял, о чем речь. В этом плане, как по мне, у ИАР дела обстоят лучше всех (ну, лично я лучше не видел). В Code::Blocks (openOCD GDB) наглядности меньше. Что касается регистров — их состояние представлено… ну не в виде унылых столбцов хексов, а в виде унылых столбцов децимальных чисел — впрочем, вероятно, это настраивается. Регистры посмотреть с помощью стандартных фиксируемых вкладок нельзя, их смотришь уже при отладке там, где они встречаются. Что из полезного — можно запустить отслеживание любой переменной (переменных), отладчик будет постоянно их мониторить. Ну, а регистры можешь смотреть во вкладке только CPU.
Несколько скринов, как обещал.



Отслеживание переменных

GPIOD state
0
Если Вам не очень сложно-напишите, пожалуйста, как к CodeBlocks'у отладчик прикрутить, вот хотя бы тот же ST-Link.
Ибо меня тоже отсутствие многих нужностей в ИАР-е стало напрягать, начал задумывать об альтернативах. И если «в чём писать»-вариантов вагон и тележка, то «как и где отлаживать»… :(
-1
Просьбу понял. Пойдем по накатанной, вечером добавлю апдейт по привинчиванию ST-Link. Кстати, вчера опытным путем определил, что STlink GDB работает не в пример шустрее, нежели openOCD.
+2
Огромное Вам спасибо за дополнение статьи!
0
Да ради Бога, это Вам спасибо за внимание.
А от написания данного материала я также получил немало пользы.
+1
А от написания данного материала я также получил немало пользы.
Так оно чаще всего и бывает. Когда для себя делаешь то, как правило, необходимость колупать дальше отпадает как только получается приемлемый результат. А когда пишешь так, что бы и другие почитали, то приходится копать шире и глубже, а там не редко оказывается еще что-то полезное, что проглядел, пока для себя делал :)
+1
Заранее, извиняюсь за некропост =)
А что кодблокс не умеет в автодополнение толковое?(
Речь о хедерах для STM32.
Пытаюсь сделать так, чтобы после написания GPIOA (кстати это имя он видит как макро и автодоплняет) и постановки ->он показал список доступных регистров. Но он не хочет(

Вот так объявлен GPIOA, а сам GPIO_TypeDef и содержит структуру с регистрами.
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
0
Я, кстати, заметил ту же особенность у EmBitz'а. Кто-нибудь знает рецепт исправления?
0
EmBitz это побочная ветвь кодблокса, а значит болячки у них одинаковые.

Задал вопрос на официальном форуме codeblocks.

В итоге, плагин автодополнения не имеет в себе препроцессора чтобы разворачивать подобные макросы. Но там предложили использовать другой плагин автодополнения ClangCC. Но его надо полностью из исходников собирать.
0
и как ты отлаживаеш? например изменить бит в регистре надо и надо мне конвертировать в новое число и записывать его руками?
0
Вопрос «неудобный», но тем не менее, интересный. Руками лопатить огромные числа — не вариант, конечно. Пока что я нахожусь в стадии углубленного изучения предмета, возможно, и есть способы попроще.
0
т.е. все эти халявные опенсцорсы полная херня
херня и иар с его редактором
херня и еклипс с его тормозами

вообще 95% софта полное гавно
непонятно только, почему программистов требуется больше всего из остальных итшников
-2
Ну как сказать… Code::Blocks не имеет собственного дебагера для АРМ, приходится юзать GDB — ограничения функционалом GDB. В то время как тот же IAR for ARM разрабатывался чисто для работы с АРМ-контроллерами.
По результату, конечно, вроде и то не то, и это не туда. Но я свой выбор сделал (пафосно, конечно, прозвучало — ну да хрен с ним).
Насчет программистов — сам недоумеваю. :D
0
Code::Blocks не имеет собственного дебагера для АРМ, приходится юзать GDB — ограничения функционалом GDB.
Функциональности GDB вполне достаточно, если я правильно понимаю, о чем идет речь. Наглядное представление регистров — это забота фронтэнда к дебаггеру, но C::B вообще-то не эмбеддерская IDE, так что такой функциональности в его GDB-фронтэнде нет. Есть только типичная для сред для прикладного программирования (watchlist, всплывающие подсказки для переменных, шагание по коду — ковырять битики в регистрах прикладникам как правило не требуется).
Но, в принципе, это же опенсорс — при желании можно сделать свой плагин к C::B, который будет показывать регистры как угодно.
+1
…при желании можно сделать свой плагин к C::B, который будет показывать регистры как угодно.
Да‑да, всё как всегда. Если хочешь, чтоб что‑то было сделано, сделай это сам.
+1
По крайней мере, регистропоказывалку к C::B прикрутить можно. А нормальный редактор к иару — нет (впрочем, кажется, они что-то для эклипса пилили...).
-1
Функциональности GDB вполне достаточно, если я правильно понимаю, о чем идет речь.
Да, все верно. Я имел в виду как раз общее взаимодействие «C::B» и GDB. Можно, к примеру, стягивать дамп той или иной области памяти, а потом преобразовывать в желаемом виде. Интересно, неужто ни у кого мыслей не возникало написать эдакий плагин?
0
Можно, к примеру, стягивать дамп той или иной области памяти, а потом преобразовывать в желаемом виде.

Разве это так сильно нужно?
Такая фича всю дорогу была в AVRStudio. F в Atmel Studio её не сделали — не так уж она и нужна.
Есть более нужные вещи, которые не реализованы.
0
Есть более нужные вещи, которые не реализованы.
Какие, например?
0
Какие, например?
Когда пост писал, что-то было в голове из нужного, но сейчас никак вспомнить не могу. Забыл мыслю.
0
Оно оказалось на столько нужным, что вы про него забыли?
+2
Видимо так. :)
0
Возникало, и не один раз. В частности есть как минимум три кастомные версии C::B, специализирующиеся на работе со встраиваемыми системами — www.emide.org
www.emblocks.org
www.imagecraft.com
Отдельные плугины тоже пытались писать, но тут сложнее, особенно с учётом того, что дебаггер-фреймворк недавно был заметно переписан.
0
EmIDE — интересная версия. Но не могу взять в толк — он заточен под «JLink», и в принципе другой дебагер привинтить туда нельзя. Так получается.
0
Ну тут ничего сказать не могу — во-первых у меня в наличии только JLink`и, во-вторых я их юзаю только для заливки прошивки, а в третьих я форками не пользуюсь, мне мейнстримный C::B как-то ближе (как минимум возможностью программить не только под контроллеры… =) ).
0
А у меня как-то все ST-Linkи, и интегрированные, и оригинал… ну да ладно, от добра добра не ищут, но было интересно пощупать; теперь знаю, что в природе есть и такие версии «C::B».
0
теперь боле менее понятна причина
остался вопрос: почему никто не напишет такой полезный плагин?
0
Больше всего из компутерщиков — это эникейщиков, к ним примыкают сисадмины, потом идет огромный слой программеров, которые «не_пишут», т.е. тот же наполовину сисадмин + «сервис_инженер» при офисном/корпоративном ПО/субд/1C и т.п. Потом видимо web + html кодеры. C# и Java программеры. C++ под винду. Дальше трудно понять, но пирамида сужается, где-то тоже должны быть автор Тотал командира, эмбеддеры(у которых своя иерархия), программеры под Linux, сам Линус еще и Нотч и т.д.
0
Ну это понятно, но для ARM это вроде как роли не играет, можно с обычным кодблоксом работать?
0
А, в этом плане. Да можно, конечно.
0
У меня на рабочем ноутбуке стоит, кроме ардуиновской редакции, обычный кодблокс. Только что, ради интереса, поставил gcc (в соответствии со статьей Nike Khin) и настроил визард на обычном. Работает, все ок.
0
GCC? А с IAR'овским тулчейном подружить не пробовал?
0
Вообще не пробовал. Но даже интересно стало, может и попробую.
0
Там в последних gcc для армов добавили поддержку аппаратной плавучки в M4F и поддержку M0 (да и вообще причесали соответствующие опции), но дефолтная поддержка для arm-gcc в Code::Blocks о них не в курсе (по крайней мере была, когда я в нее смотрел последний раз). Он так же не в курсе о существовании LTO (link time optimization). Не знаешь, допилили уже эту часть и если нет, то можно ли ее отрихтовать таким способом как описано в топике? Было бы весьма удобно щелкать процессоры просто указывая M0/M0+/M3/M4 в настройках.
0
В дефолтной версии CodeBlocks отсутствует и GNU ARM GCC. Качал и ставил отдельно. В таком варианте, конечно, проблем нет.
0
Самого его нет, понятное дело. Но настройки под него есть (в смысле, в списке компиляторов он есть). Собственно именно там были основные, скажем так, неудобства. Там и с настройками тулчейна были мелкие неудобства (плагин заточен под гцц для «взрослых» армов, а не под кортексы).
0
А если скачать и поставить arm gcc — не проще будет?
0
Он есть в нескольких инкарнациях, среди которых арм гцц для «взрослых» армов и арм гцц «для голого железа» — arm-none-eabi, которым мы для кортексов пользуемся.
0
Вам нужно менять камни в одном проекте, или использовать разные настройки компилятора для разных проектов? В первом случае в проекте можно задефайнить переменную, типа MCU_TYPE=m3 и на её основе использовать те или иные опции. Я например так делал кросс-платформенный файл проекта для AVR:
[[if (PLATFORM == PLATFORM_MSW) print(_T("cmd /c \"avr-objdump -h -S $(TARGET_OUTPUT_FILE) > $(TARGET_OUTPUT_FILE).lss\"")); else print(_T("avr-objdump -h -S $(TARGET_OUTPUT_FILE) > $(TARGET_OUTPUT_FILE).lss"));]]
[[if (PLATFORM != PLATFORM_MSW) print(_T("wine ~/win_bin/")); ]]avr-size --mcu=$(MT_MCU) --format=avr $(TARGET_OUTPUT_FILE)
Если второе, то можно просто насоздавать копий компилятора с настройками под каждый камень (см. Settings->Compiler->Selected compiler->Copy).
0
Да, можно, конечно, и так, но это муторно. Собственно, я смотрел в пузо плагина и, по большому счету правильнее будет именно отрихтовать плагин (там есть взаимозависимости между флажками) под свежие версии арм-гцц.
0
Про какой именно плагин идёт речь? CompilerGCC? На всякий случай хочу обратить внимание, что его пол года назад очень сильно переписали.
0
ARM GCC, сорри не помню совсем точного названия. Я смотрел относительно свежую версию, через какое-то время после того, как вышла версия arm-none-eabi с поддержкой LTO и хардварной плавучки в F4.
0
Спасибо за статью.
Что-то упустил C::B из виду (крайний раз под Jennic`овские модули в ней писал года три тому назад), хотя IDE вполне достойна.
Странно, что 12.11 замаскирована до сих пор, хотя датирована концом ноября прошлого года…
Ну да ладно, накатим — глянем что за зверь.
0
Как замаскирована? В каком смысле?
0
Calculate Linux :-)
Поставил) Настрою затра
0
Спасибо еще раз за статью! Поставил, настроил — работает, все прям летает
0
тут еще спрошу у владельцев мсвс 2010 с++
есть у кого годный шаблон нового проекта, чтобы студия не генерировала кучу мусорных файлов? и чтобы все по полочкам было разложено
или может где на русском об этом почитать можно? в гугле ничего толком не нашел и даже запрос толком не могу задать
0
Добрый день, подскажите пожалуйста как настроить генерацию выходного файла *.hex или *.bin
0
Сконвертировать выданный компилятором ELF при помощи соответствующей утилиты. ЕМНИП copyobj. Это можно добавить как post-build команду.
0
добрый день. можете написать post-build команду, я начинающий user.
0
Я ее не помню. objcopy --help и кури полученный ман.
Алсо, для ответа на комментарий есть отдельная кнопочка прямо под ним.
0
Ну как-то вот так (окно project build options):
0
Ни шиша на скрине не видно, вот в текстовом виде команда «post-build steps»:
arm-none-eabi-objcopy.exe -O ihex E:\Dropbox\STM32F3_SSD1289_LSM303_Touch\bin\Debug\STM32F3_SSD1289_LSM303_Touch.elf STM32F3_SSD1289_LSM303_Touch.hex
0
Только мне кажется, у любой уважающей себя IDE есть макросы вида $(PROJECT_PATH) и $(PROJECT_NAME), позволяющие не писать полные пути в подобных местах.
0
Верно, они есть.
Просто с этим нужно разобраться.
0
Спасибо всем откликнувшимся, заработало при использовании команды
arm-none-eabi-objcopy.exe -O ihex c:\_pjt\dj\bin\Debug\dj.sys c:\_pjt\dj\bin\Debug\dj.hex
буду разбираться как добавлять в проект автоматом.
0
И ещё если добавить в wizard.script для ARM, после switch (board){ (это после 487 стоки) код для stm32f3
case -2:
target.AddCommandsAfterBuild(_T(«arm-none-eabi-objcopy.exe -O ihex „) + target.GetBasePath() + Wizard.GetDebugOutputDir() + projectname + _T(“.sys „) + target.GetBasePath() + Wizard.GetDebugOutputDir() + projectname + _T(“.hex „));
break;
получим автоматическое заполнение поля post-build команды.
0
Вот наткнулся на такую сборку СВ.
В мастере проекта можно выбрать готовую платформу.

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

Ну и собственно саму сборку можно качнуть тут. Минус — люди «хотят кушать».
www.comsytec.eu/us/online-store/detail/34-software-development-tools/flypage%7Ceps/112-codeblocks-eps--embedded-plugin-suite?sef=hcfp&vmcchk=1
В демо режиме очень суровые ограничения.
0
Как это интересно согласуется с тем, что сам Code::Blocks под GPL3…
0
License
Perpetual, 1 year for updates, after expiration you cannot use updated version until renewal. The most recent version before expiration will be kept functional. During license validity period software updates and support are included in product price. The license applies to EPS Debugger plugin only. Other parts can be used freely. If you need another kind of license or floating license please write to us.
Но жадность зашкаливает, судя по прайсу.
0
А чем он отличается от отладки через имеющийся GDB-плагин?
0
Не знаю, я его не смотрел.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.