STM32 “Конструктор компонентов” для “Генератора кода”

“Генератора кода” позволяет создавать фрагменты программного кода, который используется при написании программ для микроконтроллеров. Возможности “Генератора” определяются компонентами, входящими в состав библиотеки компонентов. Для создания компонентов предназначен “Конструктор компонентов”, о котором и пойдет речь дальше.

Для начала опишу в общих чертах принцип создания компонентов. Для этого вернемся к “Генератору” и обратим внимание на основное окно программы, в котором открыт компонент “GPIO”.

image

Слева расположено древовидное меню, справа – рабочее поле, внизу – генерируемый код. При клике на выбранном пункте древовидного меню, происходит вызов соответствующего компонента (который располагается в папке ‘Lib’). При этом на рабочем поле размещены различные визуальные микрокомпоненты (кнопки, метки, переключатели и пр.), с помощью которых пользователь выбирает нужный ему режим работы компонента (например, какой порт, пин и пр).

После того, как пользователь выполнит какое-то действие (кликнет на каком-то компоненте), в поле генерируемого кода будет выведен результат – фрагмент интересующего его кода.

Процесс создания компонента включает в себя:

  1. Создание древовидного меню для создаваемого компонента, причем в нем может быть несколько ветвей (как в примере для GPIO, ведь эти настройки справедливы для нескольких подсемейств: STM32F100, STM32F103  и пр). При установке компонента  “Генератором” он автоматически создает в своем меню недостающие пункты.
  2. Создание картинки на рабочем поле.
  3. Написание кода, который определяет код, генерируемый в поле кода.

Результат работы “Конструктора” – файл с расширением “.gpc”, который “Генератором” может быть помещен с помощью мастера установки в библиотеку компонентов. В последствии этот компонент может быть удален или изменен.

Если помимо основного файла создать файл с тем же именем, но с расширением “.RTF”, то этот файл тоже будет помещен в библиотеку, и потом будет доступен как справка к компоненту, в которой можно, например, расположить данные о периферийном модуле (или другую информацию).

Теперь перейдем, собственно, к созданию компонента. Для этого рассмотрим структуру “Конструктора”.

Скачать "Конструктор компонентов" можно здесь: скачать

Начнем со скриншота главного окна.

image

Как видим, много схожего с “Генератором” : справа – рабочее поле, внизу – поле генерируемого кода.

Слева  боковая панель, на которую можно вывести или инспектор объектов, в котором отображаются свойства микрокомпонента (кнопки, переключатели и пр. – это микрокомпоненты) или древовидное меню компонента (для переключения этих двух режимов предназначена копка на панели инструментов)

Для знающих Delphi понимание того, что такое свойства компонентов (в моем случае микрокомпонентов) не будет затруднительным. Для тех, кто с этим не знаком, немного дальше приведу описание основных свойств.

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

Справа вверху расположена по аналогии с Delphi  палитра микрокомпонентов. Пока она имеет две вкладки, но в последствии планирую расширить их количество. Чтобы расположить микрокомпонент на рабочем поле, необходимо кликнуть мышкой на нужном микрокомпоненте, а затем на рабочем поле.

Создание нового компонента

Первый этап

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

image

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

Дата создания компонента изменяется при каждой последующей коррекции компонента. ID генерится случайным образом. Он нужен при установке компонента генератором кода.

В поле “Имя компонента” нужно указать требуемое имя. Чтобы в последствии изменить имя компонента, достаточно изменить имя файла (оставив без изменения расширение).

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

После нажатия кнопки “OK” редактор параметров компонента закроется, рабочее поле будет очищено, а на боковой панели будет размещено древовидное меню компонента, которое можно изменить в любое время.

Второй этап

Размещаем на рабочем поле необходимые микрокомпоненты, которые можно затем перетаскивать мышкой (и изменять их размеры). С помощью инспектора объектов корректируем свойства компонентов.

Третий этап

Самый сложный. Необходимо написать текст программы, которая осуществляет генерацию кода. Для этого предназначен редактор кода, который можно вызвать, кликнув на кнопке “Редактор кода”.

Программа пишется на Паскаль-подобном языке. Текст программы затем помещается  в файл компонента, а в генераторе кода имеется интерпретатор, который будет работать с этим кодом. Данный интерпретатор – это не мое творчество. Я его скачал с сайта http://alexboiko.ru и адаптировал под свои нужды.

Интерпретатор поддерживает следующие операторы:
if, begin, end, else, for, to, while, repeat, until, do, break, continue, exit, goto, case, or, and, not, shl, shr, 

bitor, bitnot, bitxor, bitand, or, and, not.

Ну и конечно зарезервированные символы:

=‘,  ‘,‘, ‘:‘, ‘<>‘, ‘>‘, ‘<‘, ‘>=‘,’<=‘, ‘+‘, ‘-‘, ‘*‘, ‘/‘,’^‘, ‘(‘, ‘)‘, ‘[', ']‘,’;‘, ‘//‘, ‘{‘, ‘}‘, ‘:=

Некоторые отличия от стандартного Паскаля.

Во-первых, это типы переменных и способ их объявления. Имеется всего два типа переменных – строковые и вещественные. Это не есть хорошо, но пока достаточно. Объявлять переменные не нужно. Достаточно присвоить ее в любом месте программы значение соответствующего типа. Более того, если дальше присвоить ей значение другого типа, то она поменяет свой тип. Например:

s:=’Hello, Word’;     //переменная s  строкового типа

… пользуемся этой переменной…

s:=12;                   //теперь это переменная вещественного типа

Во-вторых, введен специальный оператор “~”, который позволяет выводить строку в поле генерируемого кода. Если он находится в начале строки (пробелы не в счет), то все символы после него выводятся пользователю. Например:

~Привет, мир

При выполнении этой строки в поле кода будет выведено следующее:

Привет, мир

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

s:=’Hello, Word’;

~Привет, мир "@s@

В результате получим следующее:

Привет, мир Hello, Word

Такая вставка переменных имеет один существенный недостаток: сложно красиво размещать комментарии. Чтобы решить эту проблему было введено автоматическое выравнивание комментариев, которые начинаются с двойного слеша. Для этой цели имеется переменная tab, которая определяет позицию, с которой начнется комментарий. По умолчанию она равна 55. Выравнивание начинает действовать, если позиция комментария больше 3. Если tab:=0, то автовыравнивание отключается.

Стандартные функции

Интерпретатор поддерживает ряд стандартных для Delphi функций.

Функции для работы со строками: Val, IntToStr, StrToInt, FloatToStr, StrToFloat, Copy, Pos, Length, Insert, Delete, Trim, TrimLeft, TrimRight, UperCase, LowerCase, Format, IntToHex. Приведу описание некоторых.

  • IntToStr ( value:integer ) : string – преобразует переменную типа integer в string ;
  • StrToInt ( value:string ) : integer – преобразует переменную типа string в integer ;
  • IntToHex( value:integer; cnt:integer) : string – преобразует переменную типа integer в string  в шестнадцатиричном формате. Cnt определяет количество выводимых символов;

 

продолжение следует…

Комментарии (4) на “STM32 “Конструктор компонентов” для “Генератора кода””

  • Alex:

    Посмотрите на среду HiAsm.
    Может не стоит городить огород — а перегнать xml из MicroExplorer от STM в базу данных создать шаблон — и выложить в HiAsm репозиторий — пусть добавляют люди.
    Я тоже подумываю о генераторе кода — но как-то даром делать не охота.
    Если есть желание — у меня есть возможность подтянуть жену для переноса данных из даташитов в прогу — можно скооперироваться. Правда добавлять код под заказ и за небольшую плату — добровольную.
    Ну или под заказ за плату побольше…

  • макс:

    класс! уже сваял для базовых таймеров для тренировочки)

  • mmavka:

    А генерировать еще бы и хидер!? отдельно писать что куда вставить? Было-бы удобно. Вида две вкладки внизу.

Оставить комментарий

Spam Protection by WP-SpamFree