Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
ob:o7:first [2026/04/24 10:32] саша |
ob:o7:first [2026/04/24 16:44] (текущий) саша |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Первая программа на языке программирования Оберон ====== | ====== Первая программа на языке программирования Оберон ====== | ||
| - | В предыдущей заметке было описано, | + | В [[ob: |
| - | Теперь разберём детально сам код этого небольшого модуля, | + | Теперь разберём детально сам код этого небольшого модуля, |
| После запуска проекта открывается следующий код: | После запуска проекта открывается следующий код: | ||
| Строка 9: | Строка 9: | ||
| < | < | ||
| + | MODULE Main; | ||
| + | |||
| + | | ||
| IMPORT SYSTEM, | IMPORT SYSTEM, | ||
| ARMv7M := MicroARMv7M, | ARMv7M := MicroARMv7M, | ||
| Строка 49: | Строка 51: | ||
| Setup; | Setup; | ||
| Loop | Loop | ||
| + | |||
| + | END Main. | ||
| </ | </ | ||
| Программа прошивки состоит из модулей, | Программа прошивки состоит из модулей, | ||
| - | **Модуль** всегда начинается с слова | + | **Модуль** всегда начинается с слова |
| < | < | ||
| - | | + | MODULE Main; |
| - | | + | END Main. |
| | | ||
| Строка 68: | Строка 71: | ||
| В общем случае название модуля может быть любым, название главного модуля редактируется в настройках проекта. Именно для главного модуля будет создаваться прошивка при нажатии на кнопку сборки на панели меню. | В общем случае название модуля может быть любым, название главного модуля редактируется в настройках проекта. Именно для главного модуля будет создаваться прошивка при нажатии на кнопку сборки на панели меню. | ||
| - | Секция импорта начинается ключевым словом | + | Секция импорта начинается ключевым словом |
| < | < | ||
| - | | + | MODULE Main; |
| - | IMPORT SYSTEM, | + | IMPORT SYSTEM, |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| </ | </ | ||
| - | После секции импорта возможно указывать константы и описывать новые типы данных. Однако в этой простой программе это не используются, | + | После секции импорта возможно указывать константы и описывать новые типы данных. Однако в этой простой программе это не используются, |
| < | < | ||
| - | | + | VAR |
| - | msec: INTEGER; | + | msec: INTEGER; |
| </ | </ | ||
| Строка 97: | Строка 100: | ||
| < | < | ||
| + | MODULE Main; | ||
| | | ||
| - | | + | |
| - | CHAR литеры | + | ARMv7M := MicroARMv7M, |
| - | INTEGER | + | SysTick0 := MobxARMv7MSTM32SysTick0, |
| - | REAL | + | MCU := MicroSTM32F4, |
| - | BYTE целые числа от 0 до 255 | + | Pins := MicroSTM32F4Pins, |
| - | SET | + | Sys := MicroSTM32F4System; |
| | | ||
| </ | </ | ||
| Строка 109: | Строка 113: | ||
| После описания переменных идёт описание процедур и программный код модуля. В этом примере две процедуры: | После описания переменных идёт описание процедур и программный код модуля. В этом примере две процедуры: | ||
| - | **Setup** — отвечает за настройку микроконтроллера, | + | '' |
| - | **Loop** — содержит главную петлю программы, | + | '' |
| < | < | ||
| - | | + | MODULE Main; |
| - | ... | + | ... |
| - | | + | |
| - | BEGIN | + | BEGIN |
| - | ... | + | ... |
| - | END Setup; | + | END Setup; |
| | | ||
| - | | + | |
| - | BEGIN | + | |
| - | ... | + | |
| - | END Loop; | + | |
| BEGIN | BEGIN | ||
| - | Setup; | + | |
| - | Loop | + | END Loop; |
| - | END Main. | + | |
| + | BEGIN | ||
| + | | ||
| + | Loop | ||
| + | END Main. | ||
| | | ||
| </ | </ | ||
| - | Процедура настройки | + | Процедура настройки |
| - установка начального значения глобальной переменной; | - установка начального значения глобальной переменной; | ||
| - | - настройка частоты таймера делается вызовом процедуры Init из модуля SysTick0. Процедура имеет два аргумента, | + | - настройка частоты таймера делается вызовом процедуры |
| - | - настройка вывода PC13 осуществляется с помощью специального модуля Pins через процедуру Configure, 6 параметров задают порт, номер вывода, | + | - настройка вывода |
| + | |||
| + | < | ||
| + | PROCEDURE Setup; | ||
| + | BEGIN | ||
| + | msec := 0; | ||
| + | SysTick0.Init(Sys.HCLK, | ||
| + | Pins.Configure(Pins.C, | ||
| + | END Setup; | ||
| + | </ | ||
| + | |||
| + | Процедура '' | ||
| + | |||
| + | - условие проверки срабатывание таймера '' | ||
| + | - команда которая отправляет микроконтроллер в спящий режим до срабатывания следующего вызова таймера или иного прерывания '' | ||
| + | |||
| + | < | ||
| + | PROCEDURE Loop; | ||
| + | BEGIN | ||
| + | REPEAT | ||
| + | IF SysTick0.OnTimer() THEN | ||
| + | IF msec = 999 THEN msec := 0 ELSE INC(msec) END; | ||
| + | IF msec = 0 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | ELSIF msec = 500 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | END; | ||
| + | END; | ||
| + | ARMv7M.WFI | ||
| + | UNTIL FALSE | ||
| + | END Loop; | ||
| + | </ | ||
| + | |||
| + | Внутри условия, | ||
| + | |||
| + | < | ||
| + | IF msec = 999 THEN msec := 0 ELSE INC(msec) END; | ||
| + | </ | ||
| + | |||
| + | Второе условное ветвление, | ||
| + | |||
| + | < | ||
| + | IF msec = 0 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | ELSIF msec = 500 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | END; | ||
| + | </ | ||
| + | |||
| + | {13} — это константа типа SET, которая соответствует двоичному числу с единицей в положении 13. | ||
| + | |||
| + | < | ||
| + | 0000 0000 0000 0000 0001 0000 0000 0000 | ||
| + | </ | ||
| + | |||
| + | Запись такого машинного слова по адресу **MCU.GPIOCBSRR** вызывает документированные изменения напряжений на выводе **PC13**, как описано выше. | ||
| + | |||
| + | {13+16} — это также константа типа SET, которая соответствует двоичному числу с единицей в положении 29. | ||
| + | |||
| + | < | ||
| + | 0001 0000 0000 0000 0000 0000 0000 0000 | ||
| + | </ | ||
| + | |||
| + | Мы специально записали эту константу в виде суммы 13+16, чтобы было легче читать код. Ведь запись такого машинного слова | ||
| + | |||
| + | «Почему один регистр управляет и включением и выключением напряжения? | ||
| + | |||
| + | К примеру вот такая команда за один такт работы микроконтроллера включит напряжение на выводах **PC1** и **PC3**, при этом выключит напряжения начиная с **PC6** и до **PC12**. | ||
| + | |||
| + | < | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | </ | ||
| + | |||
| + | BSSR — расшифровывается как Bit Set/Reset Register (регистр для установки и сброса бит). | ||
| + | |||
| + | Подробнее про управление регистрами читайте [[https:// | ||
| + | |||
| + | Управление микроконтроллером — это запись и чтение данных из регистров. Про чтение регистров мы поговорим в следующей заметке, | ||
| + | |||
| + | Задавайте вопросы в группе [[https:// | ||