Урок посвящен созданию простой программы на языке Oberon-07 с помощью компилятора O7.
Для этого урока используем плату с микроконтроллером STM32F103C8T6 на основе архитектуры ARM Cortex M3. Этот микроконтроллер выбран в связи с доступностью очень недорогих отладочных плат на его основе (ebay.com, au.ru, avito.ru). При этом контроллер достаточно производительный для большинства несложных приложений, а также имеет российский аналог.
Для создания файла с прошивкой нам потребуется:
Рассмотрим эти действия по порядку.
Создайте новый документ для вашей программы через меню File→New. Минимальный код для модуля содержит слово `MODULE`, название, `END` и опять название, после которого следует точка.
MODULE MyBlink; END MyBlink.
Название модуля начинается с заглавной буквы и содержит две части. Первая часть — название подсистемы, вторая — название файла в этой подсистеме. Название файла также должно начинаться с заглавной буквы.
Чтобы использовать другие модули в вашей программе, их необходимо указать в секции `IMPORT`. При этом для них возможно присвоить более удобное короткое альтернативное имя через знак присваивания :=.
После секции импорта идет объявление констант `CONST`, глобальных переменных `VAR` (их нет в этом примере) и процедур. В примере ниже добавляется одна процедура, которая обеспечивает задержку путем рутиной операции вычитания единицы `DEC`.
После всех объявлений следует секция `BEGIN`, в которой описан код, выполняющийся при загрузке модуля.
MODULE MyBlink; IMPORT SYSTEM, MCU := MicroSTM32F10xxD, PinCfg := MicroSTM32F10xPinCfg; CONST sleepTime = 800000; (* ~ 1 sec @ Thumb-16 *) PROCEDURE Sleep (x: INTEGER); BEGIN REPEAT DEC(x) UNTIL x = 0 END Sleep; BEGIN PinCfg.Configure(PinCfg.C, 13, PinCfg.outputPushPull2MHz); REPEAT Sleep(sleepTime); SYSTEM.PUT(MCU.GPIOCBSRR, {13}); (* !PC13 *) Sleep(sleepTime); SYSTEM.PUT(MCU.GPIOCBSRR, {13 + 16}) (* !~PC13 *) UNTIL FALSE END MyBlink.
Мы пользуемся готовым модулем PinCfg для настройки параметров вывода PC13. А затем идет бесконечный цикл, который формирует периодическую смену состояния вывода PC13 путем записи 13-го и 29-го бита в управляющий регистр BSRR для порта C.
BSRR расшифровывается как Bit Set/Reset Register. Первые 16 битов отвечают за подачу напряжения на пин, а с 16 по 31 — за сброс напряжения. Преимущество использования одного регистра связано с тем, что вы можете установить один пин, и сбросить другой за одну операцию с гарантией, что между операциями сброса и установки не будет вызова прерываний, которые могут сформировать нежелательную задержку. Более подробную информацию про все регистры вы найдете в руководстве RM0008 от фирмы ST.
Для записи значений используется команда SYSTEM.PUT, которая записывает переменную типа INTEGER или SET по адресу регистра. Важно отметить, что для битовых операций в Обероне используется тип SET. Подробнее про работу с типом SET читайте в статье Витра SET: Недооцениваемый тип данных и его компиляция для ARM.
Чтобы откомпилировать модуль, выберите в меню O7→ARMv7M Compile.
Либо после окончания модуля удобно вставить такую команду.
^Q O7ARMv7MP.Compile @/s
^Q тут обозначает специальный символ комма́ндера, который в вашем коде необходимо добавить через меню Tools→Insert Commander. Комма́ндер — это небольшая кнопка, нажатие на которую запускает команду после нее.
Для сборки надо указать целевой микроконтроллер в команде для сборки.
^Q O7ARMv7MLinker.Link STM32F103C8 MyBlink
После нажатия на такой коммандер, в папке My/Files появятся файлы Blink.bin и Blink.hex.
Файлы исходных кодов прошивок также лучше хранить в папке My/Files.
Про то, как прошить полученным файлом микроконтроллер, читайте в статье «Прошивка микроконтроллера через UART».
Автор заметки: И.А. Денисов