Содержание

Моя первая программа для STM32

Урок посвящен созданию простой программы на языке Oberon-07 с помощью компилятора O7.

Для этого урока используем плату с микроконтроллером STM32F103C8T6 на основе архитектуры ARM Cortex M3. Этот микроконтроллер выбран в связи с доступностью очень недорогих отладочных плат на его основе (ebay.com, au.ru, avito.ru). При этом контроллер достаточно производительный для большинства несложных приложений, а также имеет российский аналог.

Для создания файла с прошивкой нам потребуется:

  1. написать код модулей нашей программы,
  2. скомпилировать модули,
  3. собрать полученные кодовые файлы в единый файл прошивки (с расширениями bin и hex).

Рассмотрим эти действия по порядку.

1 Написание простого модуля

Создайте новый документ для вашей программы через меню 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.

2 Компиляция

Чтобы откомпилировать модуль, выберите в меню O7→ARMv7M Compile.

Либо после окончания модуля удобно вставить такую команду.

^Q O7ARMv7MP.Compile @/s

^Q тут обозначает специальный символ комма́ндера, который в вашем коде необходимо добавить через меню Tools→Insert Commander. Комма́ндер — это небольшая кнопка, нажатие на которую запускает команду после нее.

3 Сборка

Для сборки надо указать целевой микроконтроллер в команде для сборки.

^Q O7ARMv7MLinker.Link STM32F103C8 MyBlink

После нажатия на такой коммандер, в папке My/Files появятся файлы Blink.bin и Blink.hex.

Файлы исходных кодов прошивок также лучше хранить в папке My/Files.

Про то, как прошить полученным файлом микроконтроллер, читайте в статье «Прошивка микроконтроллера через UART».


Автор заметки: И.А. Денисов