ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего
профессионального образования
«Санкт-Петербургский государственный электротехнический
университет “ЛЭТИ” имени В.И. Ульянова (Ленина)»
(СПбГЭТУ)
__________________________________________________________________
А.Ю. ВОЛКОВ В.А. КАРТАВЕНКО Д.К. КОСТРИН А.А. УХОВ
МИКРОПРОЦЕССОРНАЯ ТЕХНИКА
Методические рекомендации по проведению
практических и лабораторных занятий
Санкт-Петербург
2008
Введение
Семейство КМОП микроконтроллеров ST7 было разработано и построено вокруг 8-битного ядра и набора периферийных блоков, которые включают ПЗУ, стираемую программируемую постоянную память (EPROM), ОЗУ, электрически стираемую программируемую постоянную память (EEPROM), порты вводы/вывода, последовательные интерфейсы (SPI, SCI, I2C...), 16-битные таймеры, и т.д. Эти блоки могут быть собраны в различных комбинациях, чтобы обеспечить рентабельные решения для различных устройств. Семейство ST7 является частью 8-битовой производственной линии микроконтроллеров фирмы STMicroelectronics, и находит место в широком разнообразии применений, таких как: автоматические системы, устройства дистанционного управления, видео мониторы, автомобильные радиоприемники, и во многих других потребительских, индустриальных, телекоммуникационных, мультимедийных и автомобильных устройствах.
Технические характеристики микроконтроллеров ST7LITE2
Память:
- 8 Кбайт флэш-памяти программ с защитой от считывания. Внутрисхемное (ICP) и внутрипрограммное (IAP) программирование. Гарантированные 10.000 циклов записи/чтения;
- 384 байта ОЗУ.
Тактовый генератор, сброс и питание:
- Усовершенствованная система сброса;
- Усовершенствованный низковольтный супервизор для основного питания и вспомогательный детектор напряжения с возможностью прерывания для обеспечения безопасного сброса системы;
- Источники тактовых импульсов: внутренний RC осциллятор с точностью 1%, кварцевый/керамический резонатор или источник внешнего тактирования;
- Внутренний 32 МГц тактовый генератор для автоматически перезагружаемого таймера;
- Опциональный делитель (PLL) на 4 или на 8 для получения частоты импульсов 4 или 8 МГц;
- Пять режимов пониженного энергопотребления: остановка (halt), активная остановка (active halt), ожидание (wait), замедление (slow), автоматическое включение после остановки (auto wake up from halt).
Порты ввода/вывода:
- До 15 многофункциональных двунаправленных линий ввода/вывода;
- 7 линий с высоким входным током.
Таймеры:
- Настраиваемый сторожевой таймер (watchdog timer);
- Два 8-битных Lite-таймера с предделителем;
- Один 12-битный автоматически перезагружаемый таймер с 4 ШИМ выходами.
Последовательный интерфейс:
- Синхронный последовательный интерфейс SPI.
Обработка прерываний:
- 10 векторов прерываний, плюс программное прерывание и сброс;
- 15 внешних линий прерываний (по 4 векторам).
Аналого-цифровой преобразователь:
- 7 входных каналов;
- Операционный усилитель с фиксированным коэффициентом усиления;
- 13-битное разрешение для напряжения 0 – 430 мВ (при питании 5 В);
- 10-битное разрешение для напряжения 430 мВ – 5 В (при питании 5 В).
Система команд:
- 8-битная обработка данных;
- 63 основных инструкции с определением ошибочных кодов;
- 17 основных режимов адресации;
- инструкции беззнакового умножения двух 8-битных чисел.
Средства разработки:
- Полный набор программных и аппаратных средств разработки;
- Модуль отладки.
В таблице 1 приведены основные характеристики некоторых микроконтроллеров семейства ST7LITE2.
Микроконтроллеры ST7LITE2 являются частью семейства микроконтроллеров ST7, основанных на общепринятой промышленно стандартной 8-битной архитектуре ядра. Они имеют усовершенствованную систему команд.
Флэш-память ST7LITE2 имеет возможность внутрисхемного (ICP) и внутрипрограммного (IAP) программирования. Существует возможность программного перевода микроконтроллера в режим ожидания, замедления или остановки, уменьшая энергопотребление в случае, когда программа бездействует или находится в режиме ожидания.
Таблица 1.
Характеристики микроконтроллеров семейства ST7LITE2
Характеристика
ST7LITE20
ST7LITE25
ST7LITE29

Память программ, байт
8 К

Оперативная память (стек), байт
384 (128)

Память EEPROM, байт
-
-
256

Периферийные устройства
8-битный Lite-таймер, сторожевой таймер, автоматически перезагружаемый таймер, интерфейс SPI, 10-битный АЦП
с операционным усилителем

Рабочее напряжение
2,4 … 5,5 В

Тактовая частота
До 8 МГц
(с внешним осциллятором до 16 МГц)
До 8 МГц (с внешним осциллятором до 16 МГц, 1МГц внутренний RC осциллятор, делитель частоты на 8/4)

Температурный диапазон
- 40…+ 85 оС

Тип корпуса
SO20 300”, DIP20

Усовершенствованная система команд и режимы адресации ST7 предлагают разнообразные возможности разработчикам, позволяя создавать эффективный и компактный код программ.
Общая структурная схема микроконтроллера семейства ST7LITE2 приведена на рис. 1.

Рис. 1. Общая структурная схема микроконтроллера
Назначение выводов микроконтроллера
На рис. 2 приведена цоколевка микроконтроллера в корпусе DIP20. Символы HS около выводов показывает линии способные проводить ток до 20 мА. Обозначение ei0 – ei3 соответствует внешним векторам прерываний микроконтроллера.

Рис. 2. Цоколевка микроконтроллера в корпусе DIP20
В таблице 2 приведено описание функций всех выводов микроконтроллера ST7LITE2. В таблице используются следующие обозначения: тип = I – ввод, O – вывод, S – питание; входной/выходной уровень = CT – КМОП 0,3VDD/0,7VDD с входным триггером; выходной уровень = HS – 20 мА выходной ток.
Конфигурация портов и управления: вход = float – плавающий, wpu – слабое подтягивание, int – прерывание, ana – аналоговый; выход = OD - открытый сток, PP – push-pull.
Состояние каждой ножки после сброса показано полужирным шрифтом.
Таблица 2.
Назначение выводов микроконтроллера ST7FLITE29
№ конт.
Наименование вывода
Тип
Уровень
Порт / управление
Основная функция (после сброса)

Альтернативная функция

SO20
DIP20


Вх.
Вих.
Вх.
Вих.









float
wpu
int
ana
OD
PP



1
16
VSS
S








Общий вывод

2
17
VDD
S








Вывод питания

3
18
RESET
I/O
CT


X


X

Немаскируемое наиболее приоритетное прерывание (активный уровень - 0)

4
19
PB0/AIN0/SS
I/O
CT
X
ei3
X
X
X
Порт B0
Аналоговый вход АЦП 0 /
SPI выбор Slave
(активный уровень – 0)
Внимание: недопустима подача отрицательного напряжения на этот контакт

5
20
PB1/AIN1/SCK

I/O

CT

X


X

X

X

Порт B1
Аналоговый вход АЦП 1 / тактирование SPI
Внимание: недопустима подача отрицательного напряжения на этот контакт

6
1
PB2/AIN2/
MISO
I/O
CT
X

X
X
X
Порт B2
Аналоговый вход АЦП 2 /
SPI: Master In/Slave Out

7
2
PB3/AIN3/
MOSI
I/O
CT
X

ei2
X
X
X
Порт B3
Аналоговый вход АЦП 3 /
SPI: Master Out/Slave In

8
3
PB4/AIN4/
CLKIN
I/O
CT
X

X
X
X
Порт B4
Аналоговый вход АЦП 4 /
Вход внешнего источника тактов

9
4
PB5/AIN5
I/O
CT
X

X
X
X
Порт B5
Аналоговый вход АЦП 5

10
5
PB6/AIN6
I/O
CT
X

X
X
X
Порт B6
Аналоговый вход АЦП 6

11
6
PA7
I/O
CT
HS
X
ei1

X
X
Порт A7
-

12
7
PA6 /MCO/ ICCCLK/
BREAK
I/O
CT
X
ei1

X
X
Порт A6
Выход основного тактового генератора / тактирование ICC / внешний сигнал остановки


Таблица 2 (продолжение).
№ конт.
Наименование вывода
Тип
Уровень
Порт / управление
Основная функция (после сброса)

Альтернативная функция

SO20
DIP20


Вх.
Вих.
Вх.
Вих.









float
wpu
int
ana
OD
PP



13
8
PA5 /ATPWM3/
ICCDATA
I/O
CT
HS
X

ei1

X
X
Порт A5
ШИМ 3 автоперезагружаемого таймера / данные ICC

14
9
PA4/ATPWM2
I/O
CT
HS
X


X
X
Порт A4
ШИМ 2 автоперезагружаемого таймера

15
10
PA3/ATPWM1
I/O
CT
HS
X

ei0

X
X
Порт A3
ШИМ 1 автоперезагружаемого таймера

16
11
PA2/ATPWM0
I/O
CT
HS
X


X
X
Порт A2
ШИМ 0 автоперезагружаемого таймера

17
12
PA1/ATIC
I/O
CT
HS
X


X
X
Порт A1
Вход захвата автоперезагружаемого таймера

18
13
PA0/LTIC
I/O
CT
HS
X


X
X
Порт A0
Вход захвата Lite-таймера

19
14
OSC2
O








Выход инвертирования резонатора осциллятора

20
15
OSC1/CLKIN
I








Вход инвертирования резонатора осциллятора / вход внешнего тактирования


Организация памяти
Как показано на рис. 3 микроконтроллер может обращаться к 64 Кб памяти и регистрам ввода/вывода. Доступные области памяти включают в себя 128 байт регистров, 384 байта ОЗУ, 256 байт данных EEPROM и 8 Кб пользовательской памяти программ. Пространство ОЗУ включает в себя до 128 байт под стек с адресами от 180h до 1FFh.
Верхние адреса памяти содержат пользовательский сброс и вектора прерываний. Флэш память состоит из двух секторов расположенных в верхней части адресного пространства ST7 (рис. 3), таким образом, пользовательский сброс и вектора прерываний расположены в нулевом секторе (F000h – FFFFh).
Размер нулевого сектора флэш-памяти и другие опции настраиваются с помощью специального байта.
Внимание: адреса памяти, отмеченные как «зарезервированные» никогда не должны использоваться. Доступ к зарезервированной области может привести к непредсказуемым последствиям.

Рис. 3. Организация памяти
В таблице 3 приведены адреса всех регистров микроконтроллера. В данной таблице приняты следующие обозначения: x – значение не определено, R/W – чтение/запись. Следует отметить, что содержимое регистров DR портов ввода/вывода можно прочитать только в режиме вывода. Биты соответствующие несуществующим пинам должны всегда сохранять исходное значение.
Таблица 3.
Регистры микроконтроллера ST7
Адреса
Блок
Метка регистра
Наименование регистра
Исходное значение
Примеч.

0000h
0001h
0002h
Порт А
PADR
PADDR
PAOR
Регистр данных порта А
Регистр направления передачи порта А
Регистр настройки порта А
FFh
00h
40h
R/W
R/W
R/W

0003h
0004h
0005h
Порт B
PBDR
PBDDR
PBOR
Регистр данных порта В
Регистр направления передачи порта В
Регистр настройки порта В
FFh
00h
00h
R/W
R/W
R/W)

0006h
0007h

Зарезервированная область (2 байта)

0008h
0009h
000Ah
000Bh
000Ch

Lite-таймер 2
LTCSR2
LTARR
LTCNTR
LTCSR1
LTICR
Регистр 2 контроля/статуса lite-таймера
Регистр автоперезагрузки lite-таймера
Счетный Регистр lite-таймера
Регистр 1 контроля/статуса lite-таймера
Регистр захвата входа lite-таймера
0Fh
00h
00h
0X00 0000h
xxh
R/W
R/W
R
R/W
R

000Dh
000Eh
000Fh
0010h
0011h
0012h
0013h
0014h
0015h
0016h
0017h
0018h
0019h
001Ah
001Bh
001Ch
001Dh
001Eh
001Fh
0020h
0021h
0022h

Автоматически перезагружаемый таймер 2
ATCSR
CNTRH
CNTRL
ATRH
ATRL
PWMCR
PWM0CSR
PWM1CSR
PWM2CSR
PWM3CSR
DCR0H
DCR0L
DCR1H
DCR1L
DCR2H
DCR2L
DCR3H
DCR3L
ATICRH
ATICRL
TRANCR
BREAKCR
Регистр контроля/статуса таймера
Счетный регистр (ст.)
Счетный регистр (мл.)
Регистр автоперезагрузки (ст.)
Регистр автоперезагрузки (мл.)
Регистр управления выхода ШИМ
Регистр контроля/статуса ШИМ 0
Регистр контроля/статуса ШИМ 1
Регистр контроля/статуса ШИМ 2
Регистр контроля/статуса ШИМ 3
Регистр раб. цикла ШИМ 0 (ст.)
Регистр раб. цикла ШИМ 0 (мл.)
Регистр раб. цикла ШИМ 1 (ст.)
Регистр раб. цикла ШИМ 1 (мл.)
Регистр раб. цикла ШИМ 2 (ст.)
Регистр раб. цикла ШИМ 2 (мл.)
Регистр раб. цикла ШИМ 3 (ст.)
Регистр раб. цикла ШИМ 3 (мл.)
Регистр захвата входа (ст.)
Регистр захвата входа (мл.)
Регистр контролю передачи
Регистр контролю остановки
0X00 0000h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
00h
01h
00h
R/W
R
R
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R
R
R/W
R/W

0023h

002Dh
Зарезервированная область (11 байт)

002Eh
Сторожевой таймер
WDGCR
Регистр управления сторожевым таймером
7Fh
R/W

002Fh
Флэш
FCSR
Регистр управления/статуса флэш памяти
00h
R/W

0030h
ЕСППЗУ
EECSR
Регистр управления/статуса ЕСППЗУ
00h
R/W


Таблица 3 (продолжение).
Адреса
Блок
Метка регистра
Наименование регистра
Исходное значение
Примеч.

0031h
0032h
0033h
SPI
SPIDR SPICR SPICSR
Регистр ввода/вывода данных SPI
Регистр управления SPI
Регистр контроля статуса SPI
xxh
0xh
00h
R/W R/W R/W

0034h
0035h
0036h
АЦП
ADCCSR ADCDRH ADCDRL
Регистр контроля статуса АЦП
Регистр данных АЦП (ст.)
Регистр данных АЦП (мл.) /контроль усиления АЦП
00h
xxh
0xh
R/W
R
R/W

0037h
ITC
EICR
Регистр управления внешними прерываниями
00h
R/W

0038h
MCC
MCCSR
Регистр управления (статуса) основного тактового генератора
00h
R/W

0039h
003Ah
Тактирование и сброс
RCCR
SICSR
Регистр контроллера RC генератора
Регистр контроля/статуса целостности системы
FFh
0000 0хх0h
R/W
R/W

003Bh
Зарезервированная область (1 байт)

003Ch
ITC
EISR
Регистр выбора внешнего прерывания
0Ch
R/W

003Dh

0048h

Зарезервированная область (12 байт)

0049h
004Ah

AWU
AWUPR AWUCSR
Регистр предделителя AWU
Регистр контроля/статуса AWU
FFh
00h
R/W
R/W

004Bh
004Ch
004Dh
004Eh
004Fh
0050h

Модуль отладки
(DM)
DMCR DMSR DMBK1H DMBK1L DMBK2H DMBK2L
Регистр управления DM
Регистр статуса DM
Регистр остановки 1 DM (ст.)
Регистр остановки 1 DM (мл.)
Регистр остановки 2 DM (ст.)
Регистр остановки 2 DM (мл.)
00h
00h
00h
00h
00h
00h
R/W
R/W
R/W
R/W
R/W
R/W

0051h

007Fh

Зарезервированная область (47 байт)


Центральное процессорное устройство (ЦПУ)
ЦПУ имеет 8-битную архитектуру (фон-неймановскую) и содержит 6 внутренних регистров, позволяющих производить эффективную манипуляцию с 8-битными данными. Основными характеристиками ЦПУ являются:
63 базовых команды;
быстрое умножение двух 8-битных чисел;
17 основных режимов адресации;
2 8-битных индексных регистра;
16-битный указатель стека;
режимы пониженного энергопотребления;
маскируемые аппаратные прерывания;
немаскируемое программное прерывание.
Шесть регистров ЦПУ (показаны на рис. 4) не представлены в распределении памяти и доступны посредством специальных инструкций.

Рис. 4. Регистры ЦПУ
Аккумулятор (A) – это 8-битный регистр общего назначения, используемый для хранения операндов и результатов арифметических и логических операций, а также для операций с данными.
Индексные 8-битные регистры (X и Y) используется в индексном адресном режиме для создания либо эффективных адресов, либо для временного хранения данных. Регистр Y не затрагивается автоматическими процедурами прерываний, т.е. не сохраняется в стек и не считывается из него.
Счетчик команд (Program Counter - PC) является 16-битным регистром, содержащим адрес следующей выполняемой ЦПУ команды. Данный регистр состоит из двух 8-битных регистров PCL (Program Counter Low) и PCH (Program Counter High).
Регистр состояния (Condition Code Register – CC) – это 8-битный регистр, включающий маску прерываний и 4 флага, определяющие результат только что выполненной команды. Над данным регистром могут быть произведены операции записи в стек (PUSH) и чтения из стека (POP).
7






0

1
1
1
H
I
N
Z
C


Данные биты могут быть проверены индивидуально, а также использованы некоторыми командами. При сбросе содержимое регистра приобретает вид 111х1ххх, где х – неопределенное значение.
Бит 4 (H) регистра CC является флагом полупереноса (Half Carry). Данный флаг аппаратно устанавливается, когда происходит перенос между 3-ьим и 4-ым битами АЛУ при операциях ADD или ADC. Флаг сбрасывается аппаратно во время аналогичных инструкций. Значение H = 0 соответствует отсутствие переноса, H = 1 – перенос имел место. Данный бит проверяется во время инструкций JRH и JRNH.
Бит 3 (I) – маска прерываний (Interrupt Mask). Этот бит устанавливается аппаратно при входе в прерывание или программно для запрета всех прерываний за исключением программного прерывания TRAP. Данный бит сбрасывается программно. Значение I = 0 – прерывания разрешены, I = 1 – прерывания запрещены. Бит I контролируется инструкциями RIM, SIM и IRET и проверяется командами JRM и JRNM.
Прерывания, запрошенные, в то время как флаг I установлен в единицу, захватываются и могут быть обработаны после установления флага в ноль. По умолчанию процедура прерывания не может быть прервана поскольку, флаг I аппаратно устанавливается в единицу в начале процедуры и сбрасывается командой IRET в конце процедуры. Если бит I сбрасывается программно во время процедуры обработки прерывания, ожидающие прерывания обрабатываются вне зависимости от уровня приоритета выполняемой в данный момент процедуры обработки прерывания.
Бит 2 (N) – отрицание. Этот бит устанавливается и сбрасывается только аппаратно. Данный флаг показывает знак результата последней арифметической или логической операции, или операции переноса данных. Он является копией 7-го бита результата. Если N = 0, то результат последней операции положителен или равен нулю, если N = 1, то результат отрицательный (7-бит равен единице). Данный флаг используется командами JRMI и JRPL.
Бит 1 (Z) – флаг нуля. Данный бит устанавливается и сбрасывается аппаратно. Флаг Z показывает, что результат последней арифметической или логической операции, или операции переноса данных равен нулю. Если Z = 0 то результат отличен от нуля, если Z = 1, то результат последней операции равен нулю. Данный бит проверяется командами JREQ и JRNE.
Бит 0 (С) – флаг переноса/заема. Этот флаг может быть установлен как аппаратно, так и программно. Флаг C показывает, что в результате операции возник перенос или заем. Значение C = 0 показывает отсутствие переноса/заема, C = 1, перенос/заем произошел. Данный бит устанавливается командами SCF и RCF и проверяется инструкциями JRC и JRNC. Он также подвержен влиянию команд проверки битов, сдвига и циклического сдвига.
Признак переноса C устанавливается, если результат операции сложения превышает значение 0FFh, или результат операции вычитания меньше 0h. Данный признак используется в арифметических операциях с 16-разрядными (и более) числами, чтобы увеличить на 1 (при сложении) или уменьшить на 1 (при вычитании) результат сложения старших байтов, если при операции с младшими байтами результат вышел за границы 8-разрядной сетки. Признак также может устанавливаться/сбрасываться с помощью команд SCF и RCF соответственно, проверка признака осуществляется командами JRC и JRNC. Кроме того, признак может устанавливаться при выполнении команд сдвига/вращения.
Таблица 4.
Назначение битов регистра кода условия
Бит
Символ
Имя
Описание

7
-
Не используется
Равен 1

6
-
Не используется
Равен 1

5
-
Не используется
Равен 1

4
Н
Признак
переноса для полубайтов
H=1, когда есть перенос (заем) в старший полубайт (из старшего полубайта) в результате выполнения
операции сложения (вычитания)

3
I
Маска прерываний
I=1
отключает прерывания

2
N
Признак
отрицательного
значения
N=1,
если результат последней операции отрицательный

1
Z
Признак нулевого значения
Z=1,
если результат последней операции равен нулю

0
С
Признак переноса
C=1,
когда результат операции сложения (вычитания) выходит за границы 8-разрядной сетки


Признак нулевого значения Z устанавливается при нулевом результате операции. Таким образом, команды «OR A, #0» и «AND A,$FF» могут быть использованы для проверки содержимого аккумулятора: в случае нулевого значения признак Z будет установлен. Проверку признака можно осуществить с помощью команд JREQ и JRNE.
Признак отрицательного значения N устанавливается, когда старший (7-й) бит аккумулятора равен 1. Проверка значения признака осуществляется командами JRMI и JRPL.
Маска прерываний I не устанавливается в результате каких-либо арифметических операций. Значение данного бита регистра CC счи-тывается дешифратором при возникновении запроса на прерывание. Если I=1, то прерывание только фиксируется, но его обработка не выполняется. Маска управляется командами RIM (сброс), SIM (установка) и IRET (возврат из обработчика прерываний), проверка маски осуществляется командами JRM и JRNM.
Признак переноса для полубайтов H устанавливается при переносе (займе) в старший полубайт (из старшего полубайта) в результате выполнения операции сложения (вычитания). Данный признак обычно используется при реализации алгоритмов обработки чисел, в которых каждый разряд представляется одним байтом (например, двоично-десятичные числа). Проверка признака осуществляется командами JRH и JRNH.
Указатель стека (Stack Pointer - SP) – это 16-битный регистр, всегда показывающий на следующий свободный адрес в стеке. Указатель стека декрементируется, когда данные считываются из стека и инкрементируется, когда данные в стек записываются (см. рис. 5).

Рис. 5. Примеры операций со стеком
Так как глубина стека составляет 128 бит, то старшие 9 бит задаются аппаратно. После сброса микроконтроллера или после команды сброса указателя стека RSP, указатель стека принимает исходное значение (01FFh) являющееся крайним значением адреса.
15






8

0
0
0
0
0
0
0
1


7






0

1
sp6
sp5
sp4
sp3
sp2
sp1
sp0

К младшему байту указателя стека (называемому S) можно непосредственно обратиться с помощью команды LD.
При переходе через нижнюю границу стека, регистр SP принимает значение верхнего предела, при этом индикация переполнения стека не производится. Сохраненная ранее информация перезаписывается и таким образом теряется. Аналогичный переход, но только от верхнего предела к нижнему, происходит при переходе через верхнюю границу стека.
Стек используется для сохранения адреса возврата при вызове подпрограммы, а также для хранения данных из ЦПУ при обработке прерывания. Также, может быть осуществлен доступ к стеку посредством команд PUSH и POP. В случае прерывания PCL сохраняется по первому адресу, указанному в SP, а дальше в стек помещаются другие регистры в порядке, показанном на рис. 5.
Вызов подпрограммы занимает две позиции в стеке, а обработка прерывания пять позиций.
Система команд
Система команд ST7 предоставляет большие возможности обработки данных, реализацию арифметических, логических операций, команды вызова подпрограмм и возврата, безусловного и условного переходов, команды обработки отдельных бит и пересылки данных, а также обеспечивает управление в режиме реального времени.
Процессор ST7 содержит регистр-аккумулятор, два индексных регистра X и Y, регистр состояния процессора, счетчик команд, адресующий 64 Кбайт памяти, 16-разрядный указатель стека, в котором доступен только младший байт (остальные 8 бит зарезервированы и аппаратно устанавливаются в единицу).
Система команд включает в себя 63 инструкции длиной от 1 до 4 байт. Минимальное время исполнения 1-байтной команды составляет 250 нс при внутренней тактовой частоте 8 МГц.
Далее в описании машинных команд микроконтроллера ST7 будут использоваться некоторые условные обозначения. Флаги: H – полуперенос (half carry bit), I – маска прерываний (interrupt mask), N – отрицательный (negative), Z – ноль (zero), C – перенос (carry/borrow). Переменные: dst – приемник (destination), src – источник (source), SP – указатель стека (stack pointer), PC – счетчик команд (program counter), CC – регистр кодов признаков (conditional code register).
Таблица 5.
Виды команд ST7
Загрузка
LD
CLR







Работа со стеком
PUSH
POP
RSP






Инкремент/декремент
INC
DEC







Сравнение
CP
TNZ
BCP






Логические операции
AND
OR
XOR
CPL
NEG




Битовые операции
BSET
BRES







Проверка битов, ветвление
BUT
BTJF







Арифметические операции
ADC
ADD
SUB
SBC
MUL




Сдвиги и вращения
SLL
SRL
SRA
RLC
RRC
SWAP
SLA


Безусловный переход, вызов подпрограммы
JRA
JRT
JRF
JP
CALL
CALLR
NOP
RET

Условные переходы
JRxx








Управление прерываниями
TRAP
WFI
HALT
IRET





Изменение флагов регистра кода условия
SIM
RIM
SCF
RCF






Таблица 6.
Система команд микроконтроллера ST7
Мнемоника
Описание
Синтаксис
Флаги




H
I
N
Z
C

ADC
Сложение с переносом
adc dst, src
H

N
Z
C

ADD
Сложение
add dst, src
H

N
Z
C

AND
Логическая операция И
and dst, src


N
Z


BCP
Логическое побитное сравнение
bcp dst, src


N
Z


BRES
Установка бита в ноль
bres dst, #pos






BSET
Установка бита в единицу
bset dst, #pos






BTJF
Проверка бита и переход если ноль
btjf dst, #pos, rel




C

BTJT
Проверка бита и переход если единица
btjt dst, #pos, rel




C

CALL
Вызов подпрограммы (безусловный)
call dst






CALLR
Вызов подпрограммы (условный)
callr dst






CLR
Обнуление байта
clr dst


0
1


CP
Сравнение
cp dst, src


N
Z
C

CPL
Логическая инверсия
cpl dst


N
Z
1

DEC
Декремент
dec dst


N
Z


HALT
Остановка работы программы
halt

0




INC
Инкремент
inc dst


N
Z


IRET
Возврат из обработки прерывания
iret
H
I
N
Z
C

JP
Переход (безусловный)
jp dst






JRA
Относительный безусловный переход
jra dst






JRC
Переход если флаг переноса единица
jrc dst






JREQ
Переход в случае равенства
jreq dst






JRF
Переход если условие ложно
jrf dst






JRH
Перенос если флаг полупереноса единица
jrh dst






JRIH
Переход если уровень линии прерывания высокий
jrih dst






JRIL
Переход если уровень линии прерывания низкий
jril dst






JRM
Переход если прерывания запрещены
jrm dst






JRMI
Переход если результат отрицательный
jrmi dst






JRNC
Переход если флаг переноса ноль
jrnc dst






JRNE
Переход в случае неравенства
jrne dst






JRNH
Перенос если флаг полупереноса ноль
jrnh dst






JRNM
Переход если прерывания разрешены
jrnm dst






JRPL
Переход если результат положительный
jrpl dst






JRT
Переход если условие истинно
jrt dst






JRUGE
Переход если больше либо равно
jruge dst






JRUGT
Переход если больше
jrugt dst






JRULE
Переход если меньше либо равно
jrule dst






JRULT
Переход если меньше
jrult dst






LD
Загрузка данных
ld dst, src


N
Z


MUL
Умножение (беззнаковое)
mul dst, src
0



0

NEG
Отрицание
neg dst


N
Z
C

NOP
Нет команды
nop






OR
Логическая операция ИЛИ
or dst, src


N
Z


Таблица 6 (продолжение).
Мнемоника
Описание
Синтаксис
Флаги




H
I
N
Z
C

POP
Чтение из стека
pop dst
H
I
N
Z
C

PUSH
Запись в стек
push dst






RCF
Обнуление флага переноса
rcf




0

RET
Возврат из подпрограммы
ret






RIM
Разрешение прерываний
rim

0




RLC
Логический сдвиг влево через флаг переноса
rlc dst


N
Z
C

RRC
Логический сдвиг вправо через флаг переноса
rrc dst


N
Z
C

RSP
Обнуление регистра SP
rsp






SBC
Вычитание с переносом
sbc dst, src


N
Z
C

SCF
Установка флага переноса
scf




1

SIM
Запрет прерываний
sim

1




SLA
Арифметический сдвиг влево
sla dst


N
Z
C

SLL
Логический сдвиг влево
sll dst


N
Z
C

SRA
Арифметический сдвиг вправо
sra dst


N
Z
C

SRL
Логический сдвиг вправо
srl dst


N
Z
C

SUB
Вычитание
sub dst, src


N
Z
C

SWAP
Обмен нибблами
swap dst


N
Z


TNZ
Проверка на отрицательность или ноль
tnz dst


N
Z


TRAP
Программное прерывание
trap

1




WFI
Ожидание прерывания
wfi

0




XOR
Логическая операция исключающее ИЛИ
xor dst, src


N
Z



Режимы адресации
Микроконтроллеры семейства ST7 выполняют набор операций над операндами, размещенными в аккумуляторе, индексных регистрах X и Y, памяти. Предоставляется 17 различных режимов адресации, которые можно разделить на следующие 7 групп:
– адресация кодом команды, или безадресный режим (inherent);
– непосредственная адресация (immediate);
– прямая (direct);
– индексированная (indexed);
– косвенная (indirect);
– относительная (relative);
– битовые операции (bit operations).
Для минимизации длины инструкции в байтах большинство режимов адресации имеют длинный и короткий способы. При длинном способе адресации адрес задается 16-ю битами, при коротком – 8-ю. Таким образом, длинный режим адресации позволяет получить доступ к любому байту из адресуемых 64 кб адресного пространства, а короткий – предоставляет доступ только к нулевой странице памяти (диапазон 00..FF).
Выбор способа адресации осуществляется автоматически без дополнительного участия программиста.
Инструкции CLR, CPL, NEG, BSET, BRES, BTJT, BTJF, INC, DEC, RLC, RRC, SLL, SRL, SRA, SWAP работают только с коротким способом адресации.
Ниже приведено описание режимов адресации семейства микроконтроллеров ST7.
Адресация кодом команды или безадресный режим. Данный режим адресации используется для команд, которые не требуют операндов. Код операции полностью определяет, какие действия должны быть выполнены. Инструкции такого типа занимают 1 байт памяти.
Таблица 7.
Инструкции, использующие безадресный режим адресации
Инструкция
Описание

NOP
Пустая операция

TRAP
Программное прерывание

WFI
Ждать прерывания

HALT
Остановка

RET
Возврат из подпрограммы

IRET
Возврат из подпрограммы обработки прерывания

SIM
Установка маски прерывания

RIM
Сброс маски прерывания

SCF
Установка флага переноса

RCF
Сброс флага переноса

RSP
Сброс указателя стека

PUSH/POP
Протолкнуть в стек/вытолкнуть из стека

Непосредственная адресация. В данном режиме адресации 8-разрядный операнд следует сразу за кодом операции (табл. 8). Признак режима непосредственной адресации – символ # перед операндом.
Таблица 8.
Инструкции, использующие непосредственную адресацию
Инструкция
Описание
Пример

LD
Загрузка
LD A, #$3

CP
Сравнение
CP A, #%00001000

BCP
Битовое сравнение
BCP A, #%01011010

AND, OR, XOR
Логические операции
AND A, #$D6

ADC, ADD, SUB, SBC
Арифметические операции
ADD A,8

В примере, показанном на рис. 6, производится загрузка константы $10, указанной непосредственно, в аккумулятор.

Рис. 6. Пример непосредственной адресации
Прямая адресация. При прямой адресации 8- (короткий способ) или 16-разрядный (длинный способ) адрес операнда задается сразу после кода операции. В таблице 9 приведены инструкции, использующие данный режим адресации с указанием допустимых способов адресации.
Таблица 9.
Инструкции, использующие прямую адресацию
Инструкция
Описание
Пример
Короткий способ
Длинный
способ

LD
Загрузка
LD A,$55
Да
Да

CP
Сравнение
CP A,$55
Да
Да

BCP
Битовое сравнение
BCP A,$55
Да
Да

AND, OR, XOR
Логические операции
OR A, $55
Да
Да

ADC, ADD, SUB, SBC
Арифметические операции
ADC A, $55
Да
Да

CLR
Очистка
CLR A
Да
Нет

INC, DEC
Инкремент/
декремент
INC addr
Да
Нет

TNZ
Проверка на <=0
TNZ A
Да
Нет

CPL, NEG
Перевод в дополнительный код
CPL label
Да
Нет

BSET, BRES
Установка/сброс битов
BRES ATCSR,#CMPIE
Да
Нет

BUT, BTJF
Проверка битов и переходы
BTJT variable, #3, label
Да
Нет

SLL, SRL,
SRA, RLC,
RRC
Операции сдвига и вращения
SRL addr,#3
Да
Нет

SWAP
Обмен полубайтов
SWAP A
Да
Нет

CALL, JP
Вызовы
подпрограмм,
безусловные
переходы
CALL subpr
Да
Нет


В примере, показанном на рис. 7, производится декремент данных, размещенных по адресу $40.

Рис. 7. Пример прямой адресации
Индексированная адресация. При индексированной адресации адрес операнда образуется сложением содержимого индексного регистра (X или Y) и 8- или 16-разрядного смещения, заданного во втором и третьем байте команды. Регистр X используется по умолчанию, для указания регистра Y используется префикс. Таким образом, команды, использующие регистр Y, длиннее на 1 байт, чем команды, использующие регистр X.
Так как оба индексных регистра являются 8-битными, то без смещения можно получить доступ только к диапазону адресов 00h-FFh. Возможные варианты задания смещения приведены в таблице 10, а перечень инструкций - в таблице 11.
Таблица 10.
Варианты смещения для индексной адресации
Тип смещения
Длина в байтах
Адресуемое пространство
Примеры

без смещения
0
00.. FF
NEG (X)

короткое смещение
1
00..1FE
SWAP (variable, X)

длинное смещение
2
64 кБ
OR A, (variable, Y)


Таблица 11.
Инструкции, использующие индексированную адресацию
Инструкция
Описание
Пример
Короткий способ
Длинный
способ

LD
Загрузка
LD A,(txtoff,X)
Да
Да

CP
Сравнение
CP A, (Y)
Да
Да

BCP
Битовое сравнение
BCP A, (X)
Да
Да

AND, OR, XOR
Логические операции
AND A, (Y)
Да
Да

ADC, ADD, SUB, SBC
Арифметические операции
SUB A, (X)
Да
Да

CLR
Очистка
CLR (Y)
Да
Нет

INC, DEC
Инкремент/ декремент
DEC (X)
Да
Нет

TNZ
Проверка на <=0
TNZ (Y)
Да
Нет

CPL, NEG
Перевод в
дополнительный код
CPL (Y)
Да
Нет

BSET, BRES
Установка/сброс битов
BSET (X), #3
Да
Нет

BUT, BTJF
Проверка битов и переходы
BTJF (X), #3, label
Да
Нет

SLL, SRL,
SRA, RLC,
RRC
Операции сдвига и вращения
RLC (variable, Y)
Да
Нет

SWAP
Обмен полубайтов
SWAP (variable, Y)
Да
Нет

CALL, JP
Вызовы подпрограмм, безусловные переходы
JP (X)
Да
Нет

На рис. 8 показан пример индексированной адресации без смещения. В дополнительный код переводятся данные, находящиеся по адресу, который хранится в индексном регистре Y.
На рис. 9 показан пример длинного способа индексированной адресации со смещением. В аккумулятор загружаются данные, находящиеся по адресу $2AA5, вычисляющегося как сумма label=$2AA4 и значения индексного регистра X=$01.

Рис. 8. Пример индексированной адресации без смещения

Рис. 9. Пример индексированной адресации со смещением
Косвенная адресация. Данные, используемые в операции, находятся по адресу, который хранится в памяти (указателю). Адрес указателя следует за кодом операции. Возможны короткий (указатель находится в пределах 00..FF) и длинный (указатель находится в любой ячейке из 64 кБ адресного пространства) способы адресации (табл. 12).
Таблица 12.
Инструкции, позволяющие использовать косвенную адресацию
Инструкция
Описание
Пример
Короткий способ
Длинный
способ

LD
Загрузка
LD A, [label.w]
Да
Да

СР
Сравнение
CP A, [label.w]
Да
Да

ВСР
Битовое сравнение
BCP A, [label.w]
Да
Да

AND, OR, XOR
Логические операции
AND A, [label.w]
Да
Да

ADC, ADD, SUB, SBC
Арифметические операции
ADD A, [label.w]
Да
Да

CLR
Очистка
CLR [label]
Да
Нет

INC, DEC
Инкремент/ декремент
INC [variable]
Да
Нет

TNZ
Проверка на <=0
TNZ [variable]
Да
Нет

CPL, NEG
Перевод в дополнительный код
CPL [variable]
Да
Нет

BSET, BRES
Установка/ сброс битов
BRES [variable], #7
Да
Нет

BUT, BTJF
Проверка битов
и переходы
BTJT [variable], #3, label
Да
Нет

SLL, SRL,
SRA, RLC, RRC
Операции сдвига и вращения
RLC [variable],#3
Да
Нет

SWAP
Обмен полубайтов
SWAP [label]
Да
Нет

CALL, JP
Вызовы подпрограмм, безусловные переходы
CALL [label]
Да
Нет

На рис. 10 косвенный режим адресации проиллюстрирован на примере команды SWAP. Данная команда меняет местами полубайты ячейки по адресу, указатель на который хранится в label=$3C.

Рис. 10. Пример косвенной адресации
Относительная адресация. Относительная адресация используется только в командах ветвления. Адрес следующей команды образуется сложением текущего содержимого счетчика команд (PC) и заданного во втором байте команды 8-битного смещения. Смещение является знаковым числом и может задаваться прямым (указывается в явном виде сразу после кода операции) или непрямым (после кода операции указывается адрес, по которому хранится смещение) способами (табл. 12).
При относительной адресации возможен переход к командам, расположенных в пределах 127 позиций ниже или выше текущей команды программы.
Таблица 12.
Инструкции, использующие относительную адресацию
Инструкция
Описание
Пример

JRxx
Условные переходы
JREQ timerb_exit

CALLR
Вызов подпрограммы
CALL lcd_reg_write

В таблице 13 сгруппированы все рассмотренные выше режимы адресации и их комбинации.
Таблица 13.
Режимы адресации микроконтроллеров ST7
Режим адресации
Пример
Диапазон адресов
Размер указателя
Размер
в байтах

Безадресный
NOP


+ 0

Непосредственный
LD А,#$55


+ 1

Короткий
Прямой

LD A,$10
00..FF

+ 1

Длинный
Прямой

LD A,$1000
0000..FF FF

+ 2

Без смещения
Прямой
Индекс.
LD A,(X)
00..FF

+ 0
(при X)
+ 1
(при Y)

Короткий
Прямой
Индекс.
LD A,($10,X)
00..1FE

+ 1

Длинный
Прямой
Индекс.
LD A,($1000,X )
0000..FF FF

+ 2

Короткий
Косвенный

LD A,[$10]
00..FF
Байт
+ 2

Длинный
Косвенный

LD A,[$10.W]
0000..FF FF
Слово
+ 2

Короткий
Косвенный
Индекс.
LD А,([$10],Х)
00..1FE
Байт
+ 2

Длинный
Косвенный
Индекс.
LD
0000..FF FF
Слово
+ 2

Относит.
Прямой

JRNE LOOP
PC-128/ PC+127

+ 1

Относит.
Косвенный

JRNE [$10]
PC-128/ PC+127
Байт
+ 2

Битовый
Прямой

BSET $10,#7
00..FF

+ 1

Битовый
Косвенный

BSET [$10],#7
00..FF
Байт
+ 2

Битовый
Прямой
Относит.
BUT $10,
#7,LBL
00..FF

+ 2

Битовый
Косвенный
Относит.
BTJT [$10],
#7,LBL
00..FF
Байт
+ 3

Обработка прерываний
Запросы на прерывания могут генерироваться несколькими внутренними (таймеры, порт SPI) или внешними источниками (порты ввода/вывода). Кроме того, в микроконтроллерах семейства ST7 поддерживаются программные прерывания (инструкция TRAP). На рис. 11 показаны различные возможные источники прерываний.

Рис. 11. Источники прерываний
Механизм обработки прерываний (рис. 12) состоит из следующих этапов:
– сохранение текущего контекста (регистры CC, A, X , PC) в стеке;
– отключение всех других прерываний путем установки бита I в регистре кода условия;
– загрузка вектора прерывания в счетчик команд;
– обработка прерывания;
– восстановление контекста;
– разрешение прерываний (сброс бита I).

Рис. 12. Механизм обработки прерываний семейства ST7
Приоритет между прерываниями распределяется согласно вектору прерывания (рис. 13).

Рис. 13. Приоритет прерываний семейства ST7
Программное обеспечение лабораторного стенда
Язык ассемблера является родным языком для каждого микропроцессора. Процесс написания программы на языке ассемблера требует особой осторожности и внимания, а также большого количества строк программного кода для выполнения относительно маленькой несложной задачи. Однако язык ассемблера был и есть достаточно востребованным, когда речь идет об оптимизации используемых ресурсов (скорость выполнения программы, экономия памяти данных, памяти программ и т.д.), либо когда алгоритм является достаточно простым. В остальных случаях рекомендуется применение языков высокого уровня, таких как C. Помимо этого при написании программы разработчик получает возможность использовать «смешанный» стиль описания, когда в исходный код на языке высокого уровня вставляются ассемблерные вставки.
Разработка программы, в общем случае, состоит из трех основных этапов: анализ, написание кода (кодирование), отладка.
На первом этапе программист должен понять, что программа должна делать. Особенность данного этапа заключается в том, что в большей степени это бумажная работа (представление программы на уровне блочной структуры, составление алгоритмов, определение параметров и типов входных/выходных данных, приблизительный анализ необходимого объема памяти и т.д.).
На втором этапе происходит процесс трансляции результатов первого этапа, результатом которой является исходный код и несколько служебных (проектных) файлов, управляющих утилитами программирования.
Третий этап состоит из операций, необходимых для корректной трансляции исходного кода – удаления программных ошибок, которые могут появиться на предыдущих этапах разработки (логические ошибки, управления данными и т.д.). Данный этап является наиболее трудоемким и занимает наибольшую часть времени из всех вышеперечисленных.
Когда программа функционально закончена и отлажена, она сохраняется в EPROM, которая может быть как внешней, так и внутренней по отношению к МК.
Язык ассемблера – это набор мнемоник, которые просто дублируют каждую инструкцию ядра МК в более читабельной форме. Данный набор формирует определенный алгоритм работы всей системы (операции над данными, настройка периферийных узлов и т.д.).
Следует также различать понятие «ассемблер» и «язык ассемблера», так как под ассемблером понимают не только программный код, но и набор утилит и средств для интерпретации программы в машинный код, с последующей имплементацией его в микроконтроллер.
Выходным результатом программного кода на языке ассемблера является:
– объектный файл, содержащий двоичный код (*.obj);
– листинг файл – файл отчета, который включает в себя исходный код на ассемблере, а также его цифровую интерпретацию (*.lst);
– другие файлы, количество и тип которых зависит от конкретного типа ассемблера: файлы отчетов об ошибках (*.err), файлы символьных таблиц (*.sym), типах переменных и т.д.
В настоящее время большинство приложений строится из множества файлов проекта (библиотеки и т.д.), каждый из которых содержит сотни и тысячи строк ассемблерного кода. Для организации механизма разработки иерархических проектов ассемблер ST7 ряд дополнительных ключевых слов и инструкций EXTERN и PUBLIC.
Ключевое слово EXTERN для компоновщика означает, что конкретная метка (функция, переменная) объявлена во внешнем файле. Ключевое слово PUBLIC означает, что данная переменная (функцию) может использоваться в других внешних файлах проекта.
Таким образом, обязательным атрибутом любого ассемблера является наличие компоновщика (linker), в задачи которого входит:
– объединение объектных файлов (*.obj) в один;
– корректировка значений адресов во всех операндах команд, которые ссылаются на объект, чье расположение в памяти установлено либо изменено в процессе конкатенации.
Для выполнения подобных действий необходим контрольный файл, в котором бы оговаривались правила последовательности объединения объектов (*.obj), их перечень, а также абсолютные адреса, к которым будет произведена привязка при занесении их в память микроконтроллера.
Как только программа скомпонована, на выходе получаем абсолютный объектный файл (*.abs или *.cod), который может использоваться как для отладки в эмуляторе, так и для прошивки EPROM микроконтроллера.
Результатом работы компоновщика являются:
– абсолютный объектный файл (*.cod или *.abs);
– файл таблицы имен (*.sym);
– файл распределения (*.map).
Файл таблицы имен (*.sym) содержит используемые в программе идентификаторы (метки, имена подпрограмм и переменных) и их атрибуты (признаки); таблица имен создается во время работы транслятором и компоновщиком; используется на стадиях семантического анализа и генерации промежуточного кода, а также для компоновки программы. Она может быть сохранена соответственно в объектном или загрузочном модуле для целей отладки.
Файл распределения (*.mар) содержит информацию о компонуемых файлах и внешних (public) символах.
Программный код, написанный на языке ассемблера ST7 и сохраненный в текстовом ASCII формате, называется исходным файлом проекта. Исходный файл проекта имеет расширение *.asm.
Как и для любого ассемблера, исходный файл проекта для микроконтроллеров ST7 имеет строгий формат и синтаксис. Первая строка данного файла зарезервирована для указания *.tab файла, т.е. целевого процессора, под который пишется программа.
Исходный файл проекта на языке ассемблере ST7 обязательно должен заканчиваться ключевым словом END, в противном случае компилятор выдаст ошибку.
Остальной формат исходного кода имеет следующий вид:
[метка[:]]<space>[КОП]<space>[операнд]<space>[;комментарий]
где <space> – это символ клавиши «SPACE» или «TAB»; КОП – код операции.
Все четыре поля могут быть пустыми, однако поле <space> является обязательным, если: – вся строка пустая; – строка начинается с комментария; – строка заканчивается перед оставшимся полем. Пример кода на ассемблере ST7:
ld X, #255 ; загрузим в регистр Х значение 255
Меткой может быть имя переменной или адрес в коде, для того чтобы упростить доступ к памяти и работу с инструкцией JUMP соответственно. Метки следует всегда начинать с первой колонки, и наоборот, каждое выражение, начинающееся в первой колонке, будет рассматриваться компилятором как метка.
Мнемоники или код операции получают имя, для того чтобы упростить понимание кода программы и заменить машинный код на более интуитивно понятный. Они никогда не могут находиться в первой колонке.
Директивы дают указание ассемблеру или компоновщику для управления процессом трансляции и компоновки исходного текста в файл прошивки:
#INCLUDE "ST7Lite2.INC" ; Директива ассемблера
WORDS ; Директива ассемблера
segment 'rom' ; Директива компоновщика
… ;
.NEXT ; Метка
LD (Table, X), A ; Мнемоника
DEC X ; Мнемоника
JRPL NEXT ; Мнемоника
Следующим в структуре файла исходного кода идет раздел объявления файлов включения (*.inc), в которых хранятся прототипы импортируемых функций и переменных, распределение регистров и памяти конкретного семейства микроконтроллеров фирмы STM.
Например, файл ST7Lite2.inc содержит прототипы предопределенных переменных (распределение регистров и памяти) для МК ST7FLite29.
Данная структура не является строгой, но, файлы ST7Lite2.asm и ST7Lite2.inc должны быть включены в проект обязательно.
Разработчику рекомендуется выносить константы и переменные всего проекта в отдельные файлы – например, const.asm и variable.asm и делать глобальными только те из них, которые он сам считает необходимым, описывая их в файле const.inc и variable.inc соответственно.
По умолчанию все переменные, константы и т.д. в исходном коде являются локальными, т.е. недоступными извне. Если же предполагается экспортировать эти данные в другой модуль, для этого необходимо объявить их глобальными.
Сделать это можно несколькими способами – поставить точку перед меткой (например, .var_exp) или использовать ключевое слово PUBLIC перед списком глобальных переменных в первом модуле. Второй шаг – размещение ключевого слова EXTERN в файле включения (*.inc) перед необходимым списком внешних переменных и подключение этого файл к другому модулю.
Символы, как и константные типы данных, определяются в исходном файле и не могут изменяться во время выполнения программы. Основным отличием является то, что их значения доступны только на время сборки (времени ассемблирования), а не во время выполнения программы. Особую ценность символы представляют для генерации константных данных. Символические значения определяются при помощи оператора EQU. Например:
A_DOZEN EQU 12
После этого, слово A_DOZEN может быть там, где есть необходимость использовать число 12. Данный подход особенно полезен, если определенное значение предполагается применять в нескольких частях программного кода.
Перед тем как в программном коде использовать переменные и константы, они должны быть изначально объявлены. Для выделения части оперативной памяти RAM (для переменных) необходимо использовать ключевые слова DS.b и DS.w для определения переменной типа байт (byte - 8 бит) и типа слово (word - 16 бит) соответственно:
aByte: DS.B 1 ; переменная типа байтa
aWord: DS.W 1 ; переменная типа word – 2 байта
Array1: DS.B 20 ; массив 20 однобайтовых переменных
Array2: DS.W 40 ; массив 20 двухбайтовых переменных
Константы в языке ассемблер ST7 могут быть двух типов: константные данные и данные символьного типа.
Для объявления констант необходимо выделить часть памяти (ROM), для этого используются следующие директивы – DC.b (byte), DC.w (word). Использование ключевого слова WORD вместо DC.w позволяет выделить память, начиная с младшего байта, однако BYTE и DC.b работают одинаково:
Примечание: необходимо использовать ключевое слово DS. всегда, когда надо выделить память под переменную, вместо ключевого слова EQU, которое не резервирует никакой памяти.
Примечание: для оптимизации работы программы рекомендуется размещать часто используемые переменные на «нулевой странице» (‘ram0’, т.е. от 0 до 0FFh).
Директивы BYTES, WORDS определяют 8 или 16 битовый адрес для меток, следующих за ними. Следовательно, ключевое слово BYTES необходимо располагать перед определением аппаратных регистров и переменных в оперативной памяти (RAM) на «нулевой странице» (0..0FFh). Директиву WORDS следует использовать во всех остальных случаях, например, при определении переменных в RAM на других страницах, EEPROM переменных, для программного кода, констант и векторов прерывания в памяти ROM.
Ключевое слово segment является директивой компоновщика и используется для определения границ памяти. Данная директива опрашивается каждый раз, когда вы хотите поместить переменную или программный код в разных границах памяти.
Существует несколько групп сегментов, называемых классом. Понятие класс не имеет никаких свойств. Их концепция была введена для того, чтобы помочь разработчику сформировать адресуемое пространство в зависимости от характеристик конкретных областей памяти.
Для блока исходного кода, директива segment может использоваться только после безусловного перехода или инструкции выхода из подпрограммы из-за того, что два сегмента являются независимыми объектами, которые могут располагаться в различных частях памяти. Т.е. два сегмента, которые следует друг за другом в исходном файле, могут быть размещены в разных частях памяти в процессе трансляции исходного кода. Разделение программы на сегменты позволяет упростить процесс ее размещения.
Таблица 14.
Набор стандартных классов сегментов
Имя класса
Тип класса и область применения

‘ROM’
в ПЗУ (ROM) МК,
для макрокоманд

‘RAMO’
в ОЗУ (RAM) МК,
«нулевая страница» (0..0FFh)

‘RAM’
в ОЗУ (RAM) МК,
используется расширенная адресация

‘STACK’
в ОЗУ (RAM), доступна указателю стека
для регистров ввода/вывода (всегда на «нулевой странице»)


Примечание: ассемблер не может определить длину (разрядность) метки по ключевому слову segment, которое распознает только компоновщик, вот почему необходимо указывать длину метки, используя ключевые слова BYTES и WORDS.
Примечание: WORDS является значением по умолчанию. Рекомендуется размещать его в начале *.asm - файла и в конце файла *.inc.
Примечание: BYTES и WORDS определяют не длину переменной, а длину адреса переменной. Возможна ситуация, когда 16-битовые данные (слово) размещено на «нулевой странице» и байт (8-битовая переменная) хранятся после адреса $100. Таким образом, нельзя смешивать в программном коде директивы BYTES и WORDS с BYTE и WORD:
BYTES
segment 'ram0'
.count ds.w 1 ; зарезервировать на 0-ой странице RAM
; переменную count типа word
WORDS
segment 'ram1'
.step ds.b 3 ; зарезервировать 3 байта
; для переменной step
segment 'rom'
.rate dc.w 9600 ; зарезервировать константу rate в ROM
.tab dc.b $AA,%01010101 ; зарезервировать константу tab в
; два байта
Большинство современных программ имеют нелинейную структуру. Зачастую при написании исходного кода разработчик сталкивается с необходимостью выполнения микроконтроллером одних и тех же часто повторяющихся операций, например: обмен данными с периферийными устройствами (опрос датчиков и исполнительных устройств), работа с индикацией, обработка прерываний и т.д.
Для уменьшения количества строк и структуризации исходного кода программы используется модульно-процедурный подход программирования, где основной минимальной структурной единицей является подпрограмма (функция или процедура).
Ассемблер ST7 позволяет разработчику делить основную программу на процедуры и функции и, в зависимости от выполняемой задачи, вызывать необходимые.
Ниже приведен пример подпрограммы формирования задержки:
wait:
ld X,#255
decr2:
ld Y,#255
decr1:
dec Y jrne
decr1 dec X
jrne decr2
ret
Обязательными параметрами является пара – метка (имя подпрограммы) и ключевое слово ret (возврат из подпрограммы).
Для вызова процедуры в исходном коде главной программы используется инструкция CALL имя_подпрограммы. Например:
call init_port
call wait
После выполнения директивы CALL адрес следующей за ней инструкции сохраняется в стеке и только после этого осуществляется переход в подпрограмму. Специальная команда ret осуществляет выход из подпрограммы – загружает в счетчик команд (PC) хранимое значение адреса следующей команды ассемблера основной программы из стека. Все подпрограммы должны быть определены перед тем, как будут использованы в исходном коде (перед вызовом CALL). Как уже было сказано выше, разработчик также получает возможность их экспортировать в другие файлы проекта (использовать в качестве библиотечных функций), для этого используются ключевые слова PUBLIC и EXTERN.
Выполнение программы на микроконтроллере ST7FLITE29 начинается с вызова вектора прерывания RESET, которому может быть назначена подпрограмма, в разделе описания векторов, обрабатывающая его. Она и является основным телом программы, с которой начинается выполнение всего программного кода. В нашем случае вектор прерывания RESET обрабатывает подпрограмма main, которая, в свою очередь, является точкой входа в основную программу.
Микроконтроллер – программируемый компонент, который выполняет только одну инструкцию в определенный промежуток времени. Однако, большинство, если не все приложения, требуют управления многими задачами одновременно. Обычно для повышения эффективности и упрощения систем на микроконтроллере разработчики пытаются реализовать большее количество функциональных возможностей на одном чипе. Решением подобной проблемы находится в двух сферах – программной и аппаратной. Аппаратный подход – применение механизма прерываний, программный – многозадачность.
Прерывание в компьютерной терминологии – механизм, который позволяет приостановить текущее выполнение программы в случае возникновения какого-либо события с более высоким приоритетом. После этого события вызывается подпрограмма обработки прерывания, а затем происходит возврат в исходную точку главной программы.
При появлении запроса на прерывание от внешнего источника, первое, что делает микропроцессорное ядро (после окончания выполнения текущей инструкции) – сохранение состояния внутренних регистров, чтобы по возврату из подпрограммы обработки прерывания продолжить работу без потери данных. Данная процедура выполняется следующим образом: значения всех регистров ядра сохраняются в стеке (счетчик команд, регистр X, аккумулятор, регистр признака) кроме значения регистра Y, т.к. архитектура ST7 была наследована от архитектуры микроконтроллера, у которого он отсутствовал. Если существует необходимость, то значение регистра Y может быть принудительно помещено в стек в начале выполнения подпрограммы обработки прерывания (команда PUSH Y).
Подпрограмма обработки прерывания всегда представлена в виде пары: метка – имя и ключевое слово IRET – выход из подпрограммы. После выхода из подпрограммы обработки прерывания происходит возврат в основную программу, при этом из стека восстанавливаются предыдущие значения регистров.
В том случае, если программист до этого сохранял значение регистра Y, его также необходимо восстановить. Для этого используется директива ассемблера POP Y.
Чтобы предостеречь выполнение подпрограммы обработки прерывания от срабатывания другого прерывания, в регистре признака результата автоматически устанавливается 5-ый бит (флаг I). Некоторые периферийные узлы МК автоматически снимают его (устанавливают в 0) после окончания работы процедуры. В этом случае никаких особых действий выполнять не надо.
Другие же модули (например, таймер) не снимают флаг I даже после завершения процедуры обработки. Поэтому его обязательно необходимо сбрасывать вручную в теле подпрограммы обработки прерывания до ключевого слова IRET, в противном случае она будет вызвана повторно (войдет в бесконечный цикл) и основная программа будет заблокирована. Еще один случай, когда может понадобиться ручной сброс флага прерывания I – это необходимость приостановки текущего выполнения обработчика (например, время его работы достаточно большое). Однако прибегать к подобным процедурам желательно только при необходимости, т.к. размер стека ограничен.
Последним разделом в структуре главного файла проекта идет область объявления векторов прерывания.
Основным назначением инициализации векторов прерывания является необходимость указания микропроцессорному ядру адреса кода, который должен выполняться при возникновении того или иного внешнего события (формировании запроса).
Вектора прерывания представляют собой таблицу 16-битовых слов в памяти программ, которые содержат начальный адрес различных подпрограмм обработки прерывания.
В зависимости от источника прерывания (ввод/вывод, таймер и т.д.) ядро выбирает из заранее определенной области адрес подпрограммы обработки прерывания. Вектора всегда размещаются в конце адресного пространства микроконтроллера. Для каждого источника прерывания существует один вектор, плюс еще один для события RESET. Когда происходит прерывание или наступает событие RESET, выбирается необходимый вектор для выполнения подпрограммы обработки прерываний или запуска основной программы.
Лабораторные работы
Ввод программы пользователя осуществляется на персональной ЭВМ при помощи специального программного обеспечения. После компиляции программа загружается через программатор во флэш-память лабораторного стенда. В дальнейшем, программа может быть запущена на выполнение.
Лабораторная работа №1
Изучение кросс-средств для программирования микроконтроллера ST7LITE2
Задание: ознакомится с принципами функционирования средств разработки программ для микроконтроллеров ST7.
Теоретические сведения
Для разработки и отладки проектов под микроконтроллеры ST7 необходимо наличие программной среды. Фирма STM предлагает интегрированный пакет (Toolset), который включает в себя два средства: ST7 Visual Developer (STVD7) с возможностью внутрисхемной отладки проектных решений и ST7 Visual Programmer (STVP7) – средство для программирования МК.
Работа с отладочным комплектом ST7 требует следующих программных компонент:
кросс-ассемблер (asm);
компоновщик (lyn);
средства форматирования (obsend);
библиотека (lib).
ST7 Visual Developer IDE представляет собой среду разработки проектов под микроконтроллеры фирмы STM (рис. 14).

Рис. 14. Общий вид среды разработки STVD7 IDE
Близкие по назначению проекты могут объединяться в наборы проектов – рабочую среду (Workspace). В начале разработки программы необходимо создать рабочую среду, после чего добавить проект.
Для создания проекта необходимо запустить ST7 Visual Developer IDE на выполнение (рис. 15).

Рис. 15. Запуск среды STVD7 на выполнение
Для этого в меню Пуск->Программы->SofTecMicrosystems->inDART-STX->ST7 выбрать ярлык «STVD7 for inDART-STX» как показано на рис. 15, после чего на экране появится основное окно рабочей среды (рис. 16).

Рис. 16. Интегрированная среда разработки STVD7 IDE
Для создания новой рабочей среды (проекта) в меню “File” необходимо выбрать “New Workspace...” (рис. 17).
В появившемся диалоговом окне New Workspace (рис. 17) существуют следующие варианты выбора:
- создать рабочую среду вмести с новым проектом (Create workspace and project);
- создать пустую рабочую среду (Create empty Workspace);
- создать из проекта (Create from Project);
- создать обертку для исполняемого файла (Wrap Executable);- создать обертку для сборочного файла проекта (Wrap Makefile).

Рис. 17. Диалоговое окно создания рабочей среды
Выбираем первый пункт “Create workspace and project”. В появившемся диалоговом окне (рис. 18) необходимо ввести имя рабочей среды (Workspace filename) и путь к каталогу, где будут размещаться файлы среды (Workspace location).

Рис. 18. Диалоговое окно создания рабочей среды
После создания рабочей среды необходимо указать имя проекта, полный путь к папке проекта, а также требуемый компоновщик (в нашем случае ST7 Assembler Linker) (рис. 19).

Рис. 19. Диалоговое окно создания проекта
Последним этапом при создании проекта является выбор семейства микроконтроллера, под который будет разрабатываться проект (рис. 20).

Рис. 20. Диалоговое окно выбора типа микроконтроллера
Среда разработки STVD7 поддерживает механизм внутрисхемной отладки проектных решений (рис. 21).

Рис. 21. Отладка в среде STVD7
Основным преимуществами использования STVD7 является возможность получения расширенных результатов работы приложения (значения регистров периферийных модулей, значения внутренних регистров ядра, стека, регистра признака, состояние переменных в памяти ROM, RAM и т.д.) в реальной масштабе времени с использованием режима внутрисхемной отладки.
Меню File (Файл) предоставляет стандартные команды для управления рабочими областями и текстовыми файлами, включает следующие пункты: New, Open, Close, Close All, Save, Save as, Save All, Print и Recent (рис. 22).
Команды для работы с рабочими областями New Workspace и Open Workspace достаточно важны, поскольку перед созданием проектов, разработкой и отладкой ваших приложений вы должны создать (или открыть существующую) рабочую область.
Меню Edit (Правка) включает команды редактирования файла и поиска текста. Эти команды доступны, когда открыто окно редактора в режимах создания и отладки. Дополнительно это меню предоставляет команды точек останова и доступ к окну Quick Watch, которое используется при отладке.
Undo/Redo – данная команда отменяет последнюю команду редактора или возвращает последнюю отмененную команду.

Рис. 22. Меню «Файл»
Cut, Copy, Paste – стандартные операции с буфером обмена: вырезать, копировать, вставить.
Find…, Find Next и Replace – данные команды предназначены для поиска и/или замены строки в редактируемом тексте. Команда Find также доступна в контекстном меню.
Go to – позволяет осуществить переход к указанной строке, адресу или функции.
Find in Files – находит строку в любом из файлов в заданной директории.
Breakpoints – позволяет добавить точки останова в текст программы в активном окне редактора, после чего программа будет выполняться с учетом этих точек.
Bookmarks – вставка/удаление закладок, а также навигация по ним в пределах текущего файла.
Quick Watch – данная команда открывает окно Quick Watch, предназначенное для быстрого доступа к функциям просмотра значений переменных.
Refresh – регенерирует все окна.
Match Brace – с помощью данной команды можно перейти к скобке, которая соответствует скобке, подсвеченной в окне редактора.
Complete Word – данная команда выводит список возможных завершений введенного слова.
Parameter Info – открывает информацию о синтаксисе вводимой инструкции ассемблера ST7.
Команды меню View (Вид) позволяют открывать такие окна, как Workspace, Output и Instruction Breakpoint в режиме создания или отладки. В режиме отладки это меню также позволяет открывать различные окна для просмотра исходного кода программы, состояния регистров, памяти, стека и переменных (рис. 23).

Рис. 23. Меню «Вид»
Меню Project (Проект) предоставляет доступ к настройкам проекта, просмотру зависимостей и т.п. (рис. 24).

Рис. 24. Меню «Проект»
Set Active Project – позволяет выбрать проект, который вы хотите сделать активным для изменения или конфигурирования.
Insert Files into Project – Открывает окно, в котором существующий файл можно вставить в активный проект.
Dependencies... – позволяет устанавливать зависимости среди проектов в рамках текущей рабочей области.
Settings... – открывает окно настроек проекта.
Export Makefile... – генерирует makefile-скрипт, который может быть запущен на выполнение с помощью утилиты gmake вне среды STVD7.
Insert Project into Workspace – открывает окно, в котором можно указать путь к существующему проекту и добавить его в текущую рабочую область.
Add New Project to Workspace – позволяет создать новый проект и добавить его в текущую рабочую область.
Remove Project from Workspace – удаляет активный проект из рабочей области.
Меню Build (Сборка) содержит команды, которые позволяют конфигурировать, запускать и останавливать создание вашего приложения. Эти команды, за исключением Compile и Batch Build, обращаются к активному проекту в текущей рабочей области. Compile применяется к файлу программы, который Вы выбрали в окне рабочей области. Batch Build применяется к проектам, которые выделены в окне Batch Build. Следует отметить, что доступа к командам в этом меню нет до тех пор, пока не будут созданы рабочая область с проектом (рис. 25).

Рис. 25. Меню «Сборка»
Меню Debug (Отладка) предоставляет доступ к командам запуска и останова загруженной программы (Run, Restart, Continue, Run to Cursor и Stop), пошагового запуска (Step Into, Step Over, Step Out) и командам Go To PC и Set PC (рис. 26). Эти команды предназначены для работы с программой при отладке.

Рис. 26. Меню «Отладка»
Меню Debug instrument (Средства отладки) предоставляет доступ к опциям, которые предназначены для отладки аппаратных средств. Содержание меню меняется в зависимости от выбранных инструментов отладки. Прежде чем будет выбран инструмент отладки, данное меню представит следующие команды:

Рис. 27. Меню «Средства отладки»
Target Settings – открывает окно настроек, позволяющее выбрать инструмент отладки и конфигурировать подключение через USB или Ethernet.
Меню Tools (Инструменты) позволяет настроить внешний вид и расположение окон среды STVD7 и установить различные пользовательские опции (рис. 28).

Рис. 28. Меню «Инструменты»
Customize – позволяет выбрать функции для добавления в меню Tools.
Options – позволяет настроить различные пользовательские опции, включая: панели инструментов, команды, опции редактирования/отладки, рабочие области.
Programmer – открывает интерфейс программирования, предназначенный для загрузки программы в микроконтроллер.
Меню Windows (Окна) предоставляет доступ к командам упорядочивания открытых окон редактора и навигации по ним (рис. 29).

Рис. 29. Меню «Окна»
Next/Previous – с помощью данной команды можно переходить по очереди к открытым окнам редактора.
Cascade/Tile – упорядочивает все открытые окна в пределах главной области приложения согласно выбранной опции. На независимые и связанные окна действие команды не распространяется.
Arrange Icons – упорядочивает пиктограммы всех свернутых окон.
Status Bar – управляет представлением строки состояния.
List of opened files – создает список всех файлов в главном окне. Активное окно помечено специальной отметкой. Если щелкнуть левой кнопкой мыши на любом окне в списке, то это окно становится активным. Двойной щелчок на имени файла открывает его для просмотра.
Меню Help (Помощь) предоставляет пользователю доступ к командам справки (рис. 30).

Рис. 30. Меню «Помощь»
Search – осуществляет поиск в online-справке.
Help Home Page – открывает домашнюю страницу online-справки.
About... – выводит информацию об STVD7 и инструменте отладки.
Help On Instruction... – открывает список команд ST7.
ST7 Instruction Set Contents... – открывает оглавление системы команд ST7.
Generate Support File – позволяет сгенерировать log-файлы, которые Вы можете отправлять службе поддержки для получения справки.
Лабораторная работа №2
Ознакомление с лабораторным стендом, анализ тактовых диаграмм с помощью осциллографа
Задание:
Ознакомится с микроконтроллерным стендом, исследовать работу стенда с записанной в него программой с помощью осциллографа. Используя цифровой осциллограф (см. приложение 3) провести наблюдение тактовых диаграмм, возникающих на выводах микроконтроллера в процессе выполнения программы.
Теоретические сведения
Лабораторный стенд состоит из следующих частей (см. рис. 31): отладочной платы с установленным микроконтроллером ST7FLITE29, программатора/отладчика inDART STX, блока питания. Питание платы микроконтроллера (5В постоянного напряжения) осуществляется подключением блока питания через разъем питания. Программатор необходим для загрузки программы во флэш-память микроконтроллера и, при необходимости, ее отладки.
Плата программатора подключается к персональному компьютеру через USB порт, а программирование контроллера осуществляется через шлейф, присоединяемый к разъему ISP платы (JP1).
Внимание: переключатель выбора микроконтроллера (S3) всегда должен находится в положение ST7.

Рис. 31. Общий вид лабораторного стенда
Восемь переключателей блока S6 позволяют подключать/отключать 8 светодиодов (LED1 – LED8) к портам ввода/вывода микроконтроллера. Переключатель W3 позволяет подключать/отключать DC/DC двигатель к микроконтроллеру. Переключатель W4 осуществляет подключение пьезоэлектрического спикера. Контакты W5, W7 подключают/отключают кнопки S4 и S5. Переключатель W6 позволяют подключать/отключать потенциометр R20 к аналоговому входу микроконтроллера. Кнопка S1 осуществляет сброс микроконтроллера.
Таблица 15.
Подключение внешних устройств к выводам ST7
Наименование вывода
Подключаемое устройство
Вывод ST7

PA0/LTIC
Светодиод LED1
13

PA1/ATIC
Светодиод LED2
12

PA2/ATPWM0
Двигатель
11

PA2/ATPWM1
Светодиод LED3
10

PA2/ATPWM2
Светодиод LED4
9

PA2/ATPWM3/ICCDATA
Зарезервировано для ISP
8

PA6/MCO/ICCCLK/BREAK
Зарезервировано для ISP
7

PA7
Светодиод LED5
6

PB0/SS/AIN0
Потенциометр/кнопка S5/вход 1
19

PB1/SCK/AIN1
Сигнал управления индикатором с помощью SPI: CK SPI
20

PB2/MISO/AIN2
Сигнал управления индикатором – загрузка данных в Max7219
1

PB3/MOSI/AIN3
Сигнал управления индикатором с помощью SPI: MOSI
2

PB4/CLKIN/AIN4
Светодиод LED6
3

PB5/AIN5
Светодиод LED7
4

PB6/AIN6
Светодиод LED8
5

RESET
Кнопка сброса S1
18


Лабораторная работа №3
Порты ввода/вывода микроконтроллера ST7FLITE29
Задание:
Инициализировать порты микроконтроллера ST7FLITE29 и реализовать один из алгоритмов управления светодиодами, приведенных в таблице 5. В качестве времени задержки выбрать Т = 0.5 с.
Порядок работы с отладочным комплектом:
Замкнуть все перемычки в блоке S6;
Если в работе используется звуковой сигнал, то отключить светодиод №3 в блоке S6 и замкнуть перемычку W4;
Если в работе используется электрический двигатель, то замкнуть перемычку W3;
Все остальные перемычки должны быть разомкнуты;
Все задания на лабораторную работу определены в виде числовых цепочек, числа в которой соответствуют номерам светодиодов на плате (рис. 32). Группа из 8 чисел представляет собой состояние линий портов, к которым подключены светодиоды в какой-то момент времени. Последовательность групп чисел является временной последовательностью, которую и необходимо реализовать. При этом цифра, выделенная жирным шрифтом, соответствует «горящему» светодиоду.

Рис. 32. Обозначение светодиодов на плате
Таблица 16.
Задание на лабораторную работу
Вариант
Задание

1
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>

2
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>

3
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>

4
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>

5
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>

6
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>

7
12345678>12345678>12345678>12345678>

8
12345678>12345678>12345678>12345678>


Таблица 16 (продолжение).
Вариант
Задание

9
12345678>12345678>12345678>12345678>
12345678>12345678>

10
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>

11
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>12345678>12345678>12345678>
12345678>


Теоретические сведения
Порты ввода/вывода. Микроконтроллер ST7FLITE29 имеет 15 линий ввода/вывода – 8 линий на порту A и 7 линий на порту B.
Каждый из портов может быть запрограммирован как для ввода данных, так и для вывода. Также некоторые из портов могут выполнять альтернативные функции, то есть, например, являться входом для источника внешних прерываний, АЦП, выходом ШИМ или периферийных модулей типа UART, SPI, USB.
Управление состоянием линий портов осуществляется с помощью 6 регистров (по 3 регистра на каждый порт): PADR, PBDR, PADDR, PBDDR, PAOR, PBOR (табл. 17).
Таблица 17.
Предназначение регистров управления портами
Порт
Обозначение регистров
Назначение

A
PADR Port A Data Register
PADDR Port A Data Direction Register
PAOR Port A Option Register
Регистр данных порта A
Регистр направления передачи данных порта A
Регистр опций порта A

B
PBDR Port B Data Register
PBDDR Port B Data Direction Register
PBOR Port B Option Register
Регистр данных порта B
Регистр направления передачи данных порта B
Регистр опций порта B


Установка бита с номером n в 0 в регистре PXDDR приводит к тому, что n-я линия порта (n-й пин) будет работать на вход. Соответственно, установка бита с номером n в 1 приводит к тому, что n-я линия порта будет работать на выход. В зависимости от состояния битов в регистре PXOR возможны следующие конфигурации (табл. 18):
Таблица 18.
Режимы конфигурации портов
Режим конфигурации
DDR
OR

Ввод
Высокоимпедансный вход* (без подтягивающего резистора)
0
0


Вход с подтягивающим резистором
0
1

Вывод
Выход с подтягивающим резистором
1
1


Выход с открытым стоком (Open Drain)
1
0

* – значение по умолчанию (после сброса МК).
При использовании линий в качестве входа внешних прерываний требуется запрограммировать их в режим ввода и установить соответствующие биты в PXOR равными 1, т.е. PXDDR:PXOR = 0:1.
При использовании линий в качестве аналогового входа АЦП требуется запрограммировать их в режим ввода и установить соответствующие биты в PXOR равными 0, т.е. PXDDR:PXOR = 0:0.
Базовый листинг
Задание:
Обеспечить следующий алгоритм управления светодиодами:
12345678>12345678>
Листинг 1:
st7/
TITLE "GPIO.ASM"
MOTOROLA
#INCLUDE "ST7FLITE29.INC"
BYTES
segment byte at 0080-00FF 'ram'
LED_OUT ds.b 1
WORDS
segment byte at E000-FFDF 'rom'
.MAIN
CALL INIT_PORT ;Инициализация портов ввода/вывода
loop:
LD A, #$55
LD LED_OUT, A
CALL FIRE_LED ;”Зажигаем” нечетные светодиоды
CALL DELAY ;Организуем задержку в полсекунды
LD A, #$AA
LD LED_OUT, A
CALL FIRE_LED ;”Зажигаем” нечетные светодиоды
CALL DELAY
JP loop

.INIT_PORT
LD A, #$9B
LD PADDR, A ;PA7, PA4, PA3, PA1, PA0 на выход
LD PAOR, A ;PA7, PA4, PA3, PA1, PA0 push-pull выход
LD A, #$70
LD PBDDR, A ;PB4, PB5, PB6 на выход
LD PBOR, A ;PB4, PB5, PB6 push-pull выход
RET
.DELAY ;Организация задержки 0,5 с
PUSH X
PUSH Y
LD X, #$FF
dec_2:LD Y, #$FF
dec_1:DEC Y
JRNE dec_1
DEC X
JRNE dec_2
POP Y
POP X
RET
.FIRE_LED ;Побитовый вывод числа LED_OUT на светодиоды
LD A, #$00
BTJF LED_OUT, #0, skip0
OR A, #$40
skip0:BTJF LED_OUT, #1, skip1
OR A, #$20
skip1:BTJF LED_OUT, #2, skip2
OR A, #$10
skip2:LD PBDR, A
LD A, #$00
BTJF LED_OUT, #3, skip3
OR A, #$80
skip3:BTJF LED_OUT, #4, skip4
OR A, #$10
skip4:BTJF LED_OUT, #5, skip5
OR A, #$08
skip5:BTJF LED_OUT, #6, skip6
OR A, #$02
skip6:BTJF LED_OUT, #7, skip7
OR A, #$01
skip7:LD PADR, A
RET
segment byte at FFE0-FFFF 'vectit'
UNUSED1 DC.W 0 ; FFE0-FFE1h
SPI DC.W 0 ; FFE2-FFE3h
LTMR_RTC1 DC.W 0 ; FFE4-FFE5h
LTMR_CAP DC.W 0 ; FFE6-FFE7h
ATMR_OVF DC.W 0 ; FFE8-FFE9h
ATMR_CMP DC.W 0 ; FFEA-FFEBh
AVD DC.W 0 ; FFEC-FFEDh
UNUSED2 DC.W 0 ; FFEE-FFEFh
LTIMER DC.W 0 ; FFF0-FFF1h
EXT3 DC.W 0 ; FFF2-FFF3h
EXT2 DC.W 0 ; FFF4-FFF5h
EXT1 DC.W 0 ; FFF6-FFF7h
EXT0 DC.W 0 ; FFF8-FFF9h
AWU DC.W 0 ; FFFA-FFFBh
SOFTWARE DC.W 0 ; FFFC-FFFDh
RESET DC.W MAIN ; FFFE-FFFFh
END


Лабораторная работа №4
Система прерываний микроконтроллера ST7FLITE29
Задание:
Написать программу управления светодиодом с помощью кнопок S4 и S5 согласно заданному варианту. Для этого настроить соответствующие порты микроконтроллера для реакции на внешний источник прерываний.
Порядок работы с отладочным набором:
Замкнуть все перемычки в блоке B1/S6, кроме 3 (PA3);
Замкнуть перемычки W5 и W7;
Разомкнуть перемычки W3, W4 и W6;
Таблица 19.
Способы управления светодиодом
Вариант
Задание

1
12345678>S4>12345678>S4>12345678>S4>12345678>S4>

2
12345678>S5>12345678>S5>12345678>S5>12345678>S5>

3
12345678>S4>12345678>S4>12345678>S4>12345678>S4>

4
12345678>S5>12345678>S5>12345678>S5>12345678>S5>

5
12345678>S4>12345678>S4>12345678>S4>
12345678>S4>12345678>S4>12345678>S4>

6
12345678>S5>12345678>S5>12345678>S5>
12345678>S5>12345678>S5>12345678>S5>

7
12345678>S4>12345678>S4>12345678>S4>12345678>S4>

Таблица 19 (продолжение).
Вариант
Задание

8
12345678>S5>12345678>S5>12345678>S5>12345678>S5>

9
12345678>S4>12345678>S4>12345678>S4>
12345678>S4>12345678>S4>12345678>S4>

10
12345678>S5>12345678>S5>12345678>S5>
12345678>S5>12345678>S5>12345678>S5>
12345678>S5>12345678>S5>12345678>S5>
12345678>S5>12345678>S5>12345678>S5>


Теоретические сведения
Прерывания. Микроконтроллер ST7FLITE29 имеет два типа прерываний: маскированные и немаскированные. Немаскированные прерывания генерируются командой TRAP и выполняются независимо от состояния бита I в регистре кода условий. Типы прерываний и начальные адреса подпрограмм их обработки перечислены в таблице 20.
Таблица 20.
Источники прерываний

Прерывание
Описание
Приоритет
Адрес подпрограммы (вектор)

1
RESET
Сброс
Высокий
Низкий
FFFE – FFFF

2
TRAP
Программное прерывание

FFFC – FFFD

3
AWU


FFFA – FFFB

4
EI0
Внешнее прерывание 0

FFF8 – FFF9

5
EI1
Внешнее прерывание 1

FFF6 – FFF7

6
EI2
Внешнее прерывание 2

FFF4 – FFF5

7
EI3
Внешнее прерывание 3

FFF2 – FFF3

8
LITE TIMER
По переполнению

FFF0 – FFF1

9

Не используется

FFEE – FFEF

10
SI
AVD прерывание

FFEC – FFED

11
AT TIMER
Захват, Равенство

FFEA – FFEB

12

По переполнению

FFE8 – FFE9

13
LITE TIMER
Захват входного прерывания

FFE6 – FFE7

14

По переполнению

FFE4 – FFE5

15
SPI
Транзакции на SPI шине

FFE2 – FFE3

16



FFE0 – FFE1


Перед выполнением программного кода обработки прерывания в стек помещается содержимое следующих регистров: PC, X, A, CC. Код обработки прерывания должен заканчиваться инструкцией IRET. После выполнения этой команды регистры PC, X, A, CC восстанавливают свои значения из стека.
Как видно из таблицы 20 микроконтроллер может обрабатывать 4 внешних прерывания. Настройка модуля обработки прерываний осуществляется с помощью двух регистров: EICR и EISR. Соответственно первый их них определяет чувствительность к сигналу, а второй подключает соответствующий порт микроконтроллера к внутренней логике обработки внешних прерываний.
Чувствительность к сигналу настраивается с помощью регистра EICR (EXTERNAL INTERRUPT CONTROL REGISTER). Формат регистра EICR приведен в таблице 21.
Таблица 21.
Формат регистра EICR
EICR
Название
Описание

7:6
IS31:0
00 задает чувствительность по срезу и низкому уровню
01 задает чувствительность только по фронту
10 задает чувствительность только по срезу
11 задает чувствительность по срезу и по фронту

5:4
IS21:0


3:2
IS11:0


1:0
IS01:0



Таблица 22.
Формат регистра EISR
EISR
Название
Описание

7:6
EI31:0
Выбор входа внешних прерываний для портов PB0 - PB2
00 задает в качестве входа внешних прерываний линию PB0
01 задает в качестве входа внешних прерываний линию PB1
10 задает в качестве входа внешних прерываний линию PB2

5:4
EI21:0
Выбор входа внешних прерываний для портов PB3 - PB6
00 задает в качестве входа внешних прерываний линию PB3
01 задает в качестве входа внешних прерываний линию PB4
10 задает в качестве входа внешних прерываний линию PB5
11 задает в качестве входа внешних прерываний линию PB6

3:2
EI11:0
Выбор входа внешних прерываний для портов PA4 - PA7
00 задает в качестве входа внешних прерываний линию PA4
01 задает в качестве входа внешних прерываний линию PA5
10 задает в качестве входа внешних прерываний линию PA6
11 задает в качестве входа внешних прерываний линию PA7

1:0
EI01:0
Выбор входа внешних прерываний для портов PA0 - PA3
00 задает в качестве входа внешних прерываний линию PA0
01 задает в качестве входа внешних прерываний линию PA1
10 задает в качестве входа внешних прерываний линию PA2
11 задает в качестве входа внешних прерываний линию PA3


Чтобы подключить линию внешнего прерывания к соответствующему входу микроконтроллера необходимо установить соответствующие биты в регистры EISR (EXTERNAL INTERRUPT SELECT REGISTER). Формат регистра EISR приведен в таблице 22.
Базовый листинг
Задание:
Обеспечить следующий алгоритм управления светодиодами:
12345678>S4>12345678>S4>
Листинг 2:

.MAIN
RSP
CLR MCCSR ;Нормальный режим работы ядра
CALL INIT_PORT ;Инициализация портов ввода/вывода
CALL INIT_EXT_INT ;Инициализация модуля внешних прерываний
RIM ;Разрешение прерываний
LD A, #$00
LD LED_OUT, A
loop:
CALL FIRE_LED
JP loop

.INIT_PORT
LD A, #$93 ;Конфигурируем линии PA0, PA1, PA4, PA7 как
LD PADDR, A ;push-pull выходы, а линию PA3 как floating
LD A, #$9B ;вход (под внешнее прерывание).
LD PAOR, A

LD A, #$70 ;Конфигурируем линии PB4, PB5, PB6 как
LD PBDDR, A ;push-pull выходы.
LD PBOR, A
RET
.INIT_EXT_INT
PUSH A
LD A, #%00000010 ;Чувствительность по срезу
LD EICR,A
LD A, #%00000011 ;PA3 - вход внешних прерываний
LD EISR,A
POP A
RET
.DELAY ;Программная задержка порядка 0.5 с
PUSH X
PUSH Y
LD X, #$FF
dec_2:LD Y, #$FF
dec_1:DEC Y
JRNE dec_1
DEC X
JRNE dec_2
POP Y
POP X
RET
.EXT_Handler0 ;Код обработки внешнего прерывания (нажатия
LD A, LED_OUT ;кнопки S4)
XOR A, #$0F
AND A, #$0F
LD LED_OUT, A
IRET


segment byte at FFE0-FFFF 'vectit'

EXT0 DC.W EXT_Handler0 ;FFF8-FFF9h

END


Лабораторная работа №5
Интерфейс SPI микроконтроллеров ST7
Задание:
Инициализировать интерфейс SPI микроконтроллера, используя для этого соответствующие порты: PB1 для сигнала SCK, PB2 для сигнала MISO, PB3 для сигнала MOSI.
Порядок работы с отладочной платой:
Выставить перемычки B1/S6 в верхнее положение.
Замкнуть перемычки W4, W6.
Разомкнуть перемычки W3, W5, W7.
Теоретические сведения
Интерфейс порта SPI (Serial Port Interface) предназначен для высокоскоростного обмена между микроконтроллерами ST7 и периферийными микросхемами, такими как АЦП, ЦАП, FLASH-память, различные датчики, часы реального времени. Данный интерфейс может быть также использован для обмена между двумя микроконтроллерами, расположенными на небольшом расстоянии. Достоинством синхронной последовательной приемо-передачи с использованием протокола SPI является полный дуплексный обмен данными, что в случае необходимости позволяет реализовать экономичную потенциальную развязку между приемником и передатчиком.
Интерфейс основан на сдвиговом регистре, который предназначен для выполнения преобразования последовательного интерфейса в параллельный, а также для обратного преобразования. Интерфейс трехпроводный, состоит из двух каналов данных и одного канала синхронизации (рис. 33).

Рис. 33. Схема подключения двух устройство по шине SPI
Временная диаграмма обмена данными по интерфейсу SPI для различных режимов работы приведена на рис. 34.


Рис. 34. Диаграмма обмена данными по интерфейсу SPI
Настройка интерфейса SPI осуществляется с помощью регистра SPICR (SPI Control Register), описание битов данного регистра приведено в табл. 21.
Таблица 21.
Регистр SPICR
SPICR
Название
Описание

7
SPIE
Бит разрешения прерывания
0 – прерывания запрещены
1 – прерывания разрешены

6
SPE
Разрешение выхода
0 – SPI отключен от внешних входов
1 – SPI подключен к внешнему устройству

5
SPR2
Выбор рабочей частоты (табл. 12).

4
MSTR
Признак MASTER или SLAVE
0 – SLAVE
1 – MASTER

3
CPOL
Полярность тактового генератора (рис. 34)

2
CPHA
Используемый фронт тактового генератора (рис. 34)

1:0
SPR1:0
Выбор рабочей частоты (табл. 22).


Таблица 22.
Выбор рабочей частоты
Частота
SPR2
SPR1
SPR0

FCPU/4
1
0
0

FCPU/8
0
0
0

FCPU/16
0
0
1

FCPU/32
1
1
0

FCPU/64
0
1
0

FCPU/128
0
1
1


Для просмотра статуса интерфейса SPI предназначен 8-битный регистр SPISR (SPI Status Register), описание битов данного регистра приведено ниже.
Таблица 23.
Регистр SPISR
SPISR
Название
Описание

7
SPIF
Флаг передачи данных
0 – передача данных не завершена
1 – передача данных завершена

6
WCOL
Статус коллизии записи

5
OVR
Ошибка переполнения SPI

4
MODF
Флаг ошибки режима

3
-


2
SOD
запрещение выхода SPI
0 – выход SPI запрещен
1 – выход SPI разрешен

1:0
-



Пример инициализации порта SPI показан в листинге ниже. В аккумулятор загружается константа, содержащая требуемые настройки порта, затем содержимое аккумулятора записывается в регистр управления портом SPICR.
Базовый листинг
Задание:
Вывести на знакосинтезирующий индикатор число 1984, используя подключаемую библиотеку для работы с MAX7219 (LED Display Driver).
Листинг 3:

#include "MAX7219.INC" ;Прототипы импортируемых переменных и
;процедур для MAX7219

main:
rsp ;Сбрасываем указатель стэка
sim ;Маскируем прерывания
clr MCCSR ;Нормальный режим работы ГТИ
call init ;Инициализируем порты МК
call init_SPI ;Инициализируем SPI
call MAX7219_INIT ;Инициализируем MAX7219
call MAX7219_CLEAR ;Очищаем MAX7219
loop:
;Выводим число 1 на 1-й ЗСИ
ld A, #$01 ;Загружаем в аккумулятор номер ЗСИ
ld LED_N, A ;Помещаем номер ЗСИ в переменную LED_N
ld A, #$01 ;Загружаем в аккумулятор отображаемое число
ld LED_S, A ;Помещаем число в переменную LED_S
call MAX7219_DISPLAY ;Вызываем функцию отображения
;Выводим число 9 на 2-й ЗСИ
ld A, #$02
ld LED_N, A
ld A, #$09
ld LED_S, A
call MAX7219_DISPLAY
;Выводим число 8 на 3-й ЗСИ
ld A, #$03
ld LED_N, A
ld A, #$08
ld LED_S, A
call MAX7219_DISPLAY
;Выводим число 4 на 4-й ЗСИ
ld A, #$04
ld LED_N, A
ld A, #$04
ld LED_S, A
call MAX7219_DISPLAY
jp loop ;Зацикливаем вывод числа
init:
ld A, #%00000000
ld PADDR, A ;PA0-PA7 на вход
ld A, #%00001110
ld PBDDR, A ;PB1, PB2, PB3 на выход
ld A, #%00001110
ld PBOR,A ;PB1, PB2, PB3 как push-pull выходы
ret
.init_SPI
ld A, #%00000011
ld SPISR, A ;Включаем режим MASTER для SPI
ld A, #%01011100
ld SPICR, A ;CPHA = 1 – активен фронт импульса
;CPOL = 1 – активен высокий уровень
;MSTR = 1 – SCK ведущий генератор
;SPE = 1 – включаем SPI
ret

end


Лабораторная работа №6
Таймер ART микроконтроллера ST7FLITE29
Задание:
Инициализировать регистры управления таймером и запрограммировать секундомер, используя в качестве индикации семисегментные индикаторы. Обеспечить счет секунд от 0 до 59, а также сброс в начальное состояние по нажатию кнопки S4 и запуск/останов таймера по нажатию кнопки S5.
Теоретические сведения
Таймер ART представляет собой 12-битный таймер с автоперезагрузкой.
Предназначен для:
Реализация временных задержек;
Генерация прерывания при переполнении;
Таймер основан на автономном (несинхронизированном) 12-битном счетчике с входным автоперезагружаемым регистром и 4-мя выходными PWM-каналами.
Имеет 6 внешних выводов:
4 выхода ШИМ;
Вход ATIC (AT Input Capture) для функции захвата;
Вход BREAK для ШИМ (для прекращения сигнала на PWM выходах);
Основные характеристики ART-таймера:
Частота счета 2 кГц – 4 МГц при fCPU = 8 МГц;
Управление полярностью сигналов;
Генерация прерываний при переполнении таймера
Реализация временных задержек. При переполнении 12-битного счетчика CNTR устанавливается флаг переполнения OVF в регистре управления/статуса ATCSR, что свидетельствует об окончании временного интервала. Длительность интервала можно задавать записью соответствующего кода в регистр ATR.
Режим захвата (Input Capture). После фронта/среза импульса на выходе ATIC микроконтроллера содержимое 12-битного счетчика CNTR запоминается в регистр ATICR, при этом выставляется флаг ICF в регистре ATCSR и, если прерывание разрешено, то оно генерируется. Бит ICF сбрасывается при чтении регистра ATICR. Регистр ATICR доступен лишь для чтения и содержит значение счетчика, соответствующее последнему захвату данных. Пока бит ICF выставлен, дальнейший захват данных невозможен.
Режим сравнения (Output Compare Mode). Чтобы реализовать этот режим необходимо загрузить 12-битное значение в регистровую пару DCRxH и DCRxL. Если счетчик (CNTR) достигнет значения, записанного в DCRxH и DCRxL, то в регистре PWMxCSR бит CMPF устанавливается в 1 и генерируется прерывание, если установлен бит CMPIE в регистре ATCSR.
Генерация ШИМ-сигналов. PWM режим позволяет сгенерировать до 4-х ШИМ сигналов. PWMx выход может быть разрешен или запрещен битом OEx в регистре PWMCR. Четыре PWM сигнала имеют одинаковую частоту (fPWM), которая задается частотой счетчика и значением регистра ATR:
fPWM = fCOUNTER/(4096 - ATR)
Из формулы 4.1. можно сделать следующие выводы:
Если fCOUNTER = 32 МГц, то максимальное значение fPWM = 8 МГц (значение регистра ATR = 4092), минимальное значение – 8 КГц (значение регистра ATR = 0);
Если fCOUNTER = 4 МГц, то максимальное значение fPWM = 2 МГц (значение регистра ATR = 4094), минимальное значение – 1 КГц (значение регистра ATR = 0);
Функция BREAK. Активируется внешним сигналом BREAK на одноимённом входе (активный уровень 0) (рис. 35). Для использования функции BREAK необходимо установить бит BPEN в регистре BREAKCR. При появлении низкого уровня на входе BREAK устанавливается бит BA в регистре BREAKCR, при этом выходы ШИМ прекращают генерировать импульсы, а регистры ARR, PWMCR, DCRx сбрасываются в исходное состояние.

Рис. 35. Влияние сигнала BREAK на ШИМ
Описание регистров таймера.
Регистр управления/статуса таймера ATCSR (Autoreload Timer Control Status Register).
Регистр допускает операции чтения и записи. Значение по умолчанию 0x00. Формат регистра ATCSR представлен в таблице 24:
Таблица 24.
Формат регистра ATCSR
ATCSR
Название
Описание

7
0


6
ICF
Input capture Flag
Флаг захвата. Этот бит устанавливается аппаратно и сбрасывается программно при чтении регистра ATICR. Запись в этот бит не меняет его содержимого. Если ICF = 1, то захват был осуществлен.

5
ICIE
IC Interrupt Enable
Разрешает IC прерывания. Этот бит устанавливается и сбрасывается программно.
0 – запрещает IC прерывание
1 - разрешает IC прерывание


Таблица 24 (продолжение).
ATCSR
Название
Описание

4:3
CK1:0
Counter Clock Selection
Выбор генератора для счетчика. Эти биты устанавливаются и сбрасываются программно, а также сбрасываются по сигналу RESET. Эти биты определяют частоту генератора. Изменения вступают в силу после переполнения.
00 – Off
01 – fLTIMER(период 1 мс при fCPU = 8 МГц)
10 – fCPU
11 – 32 МГц

2
OVF
Overflow Flag
Флаг переполнения. Этот бит устанавливается аппаратно и сбрасывается программно при чтении регистра TCSR.

1
OVFIE
Overflow Interrupt Enable
Разрешает прерывания от переполнения. Этот бит устанавливается/сбрасывается программно.
0 – OVF прерывание запрещено
1 – OVF прерывание разрешено

0
CMPIE
Compare Interrupt Enable
Разрешает CMPF прерывания. Этот бит устанавливается/сбрасывается программно.
0 – CMPF прерывание запрещено
1 – CMPF прерывание разрешено


Регистр CNTR. Регистр состоит из старшей части CNTRH и младшей части CNTRL. Эти оба регистры доступны только для чтения. Биты CNTR[11..0] (Counter Value) значения счетчика. Счетчик инкрементируется с каждым тактовым импульсом генератора, выбранного битам CK[1:0]. При считывании значения счетчика используются 2 последовательные операции чтения. При переполнении счетчика в него заносится значение ATR регистра. Формат старшей и младшей части регистра CNTR приведен в табл. 25 – 26.
Таблица 25.
Формат регистра CNTRH
CNTRH
Название
Описание

7:4
0


3:0
CNTR11:8
Counter Value
Старшие 4 бита регистра CNTR.

Таблица 26.
Формат регистра CNTRL
CNTRL
Название
Описание

7:0
CNTR7:0
Counter Value
Младшие 8 бит регистра CNTR.


Регистр автоперезагрузки ATR (AutoReload Register). Регистр состоит из старшей части ATRH и младшей части ATRL. Эти оба регистры доступны для чтения и записи. Биты ATR[11..0] – значение автоперезагружаемого регистра. Значение ATR автоматически загружается в счетчик CNTR при его переполнении. В режиме ШИМ значение регистра ATR используется для задания частоты выходного сигнала ШИМ. Формат старшей и младшей части регистра ATR приведен в табл. 27 – 28.
Таблица 27.
Формат регистра ATRH
ATRH
Название
Описание

7:4
0


3:0
ATR11:8
AutoReload Register
Старшие 4 бита регистра ATR.

Таблица 28.
Формат регистра ATRL
ATRL
Название
Описание

7:0
ATR7:0
AutoReload Register
Младшие 8 бит регистра ATR.


Регистр управления выводом PWM PWMCR (PWM Control Register). Регистр допускает чтения и запись. Формат регистра приведен в табл. 29.
Таблица 29.
Формат регистра PWMCR
PWMCR
Название
Описание

7
0


6
OE3
PWM3 output enable
Подключают PWM3 к соответствующему выходу МК. Устанавливаются и сбрасываются программно.
0 – PWM3 отключен от выхода МК
1 – PWM3 подключен к выходу МК

5
0


4
OE2
PWM2 output enable
Подключают PWM2 к соответствующему выходу МК. Устанавливаются и сбрасываются программно.
0 – PWM2 отключен от выхода МК
1 – PWM2 подключен к выходу МК

3
0


2
OE1
PWM1 output enable
Подключают PWM1 к соответствующему выходу МК. Устанавливаются и сбрасываются программно.
0 – PWM1 отключен от выхода МК
1 – PWM1 подключен к выходу МК


Таблица 29 (продолжение).
PWMCR
Название
Описание

1
0


0
OE0
PWM0 output enable
Подключают PWM0 к соответствующему выходу МК. Устанавливаются и сбрасываются программно.
0 – PWM0 отключен от выхода МК
1 – PWM0 подключен к выходу МК


PWMxCSR (PWMx Control Status Register). Регистр допускает операцию чтения записи. Формат регистра PWMxCSR приведен в табл. 30.
Таблица 30.
Формат регистра
PWMxCSR
Название
Описание

7:2
0


1
OPx
PWMx Output Polarity
Определяет полярность выходного сигнала

0
CMPFx
PWMx Compare Flag
Этот бит устанавливается аппаратно и сбрасывается программно при чтении регистра PWMxCSR.
0 - значение счетчика не совпадает со значением в регистре DCRx
1 - значение счетчика совпадает с значением в регистре DCRx


Регистр управления остановкой BREAKCR (BREAK Control Register). Допускает операцию чтения и записи. Формат регистра BREAKCR приведен в табл. 31.
Таблица 31.
Формат регистра BREAKCR
BREAKCR
Название
Описание

7:6
0


5
BA
Break Active
Остановка разрешена. Этот бит устанавливается/сбрасывается программно. Также он устанавливается аппаратно при появлении низкого уровня на входе BREAK.

4
BPEN
Break Pin Enable
Подключает линию BREAK к соответствующему входу МК
0 – отключен
1 – подключен

3:0
PWM3:0
Break Pattern
Определяю те линии ШИМ, на которые влияет сигнал BREAK, если функция BREAK активна.

Регистр DCRx. Поддерживает операцию чтения и записи. Биты DCR[11..0] (PWMx Duty Cycle Value) задают значение для конкретного режима работы. Если OEx = 1 в регистре PWMCR, то DCR[11..0] определяют скважность выходного сигнала ШИМ. В режиме сравнения они определяют значение, которое сравнивается со значением счетчика. Формирование ШИМ импульсов пояснено на рис. 36. Формат младшей и старшей частей данного регистра приведены в табл. 32. и 33.
Таблица 32.
Формат регистра DCRxH
DCRxH
Название
Описание

7:4
0


3:0
DCR11:8
Старшие 4 бита регистра DCRx

Таблица 33.
Формат регистра DCRxL
DCRxL
Название
Описание

7:0
DCR7:0
Младшие 8 бит регистра DCRx



Рис. 36. Формирование ШИМ-сигнала
Регистр ATICR допускает только чтение. Биты ICR[11..0] (Input Capture Data) – данные захвата. Регистр ATICR хранит значение 12-битного регистра CNTR на момент появления фронта/среза импульса на выводе ATIC. Захват данных возможен в том случае, когда бит ICF сброшен. Формат младшей и старшей частей данного регистра приведены в табл. 34 и 35.
Таблица 34.
Формат регистра ATICRH
ATICRH
Название
Описание

7:4
0


3:0
ICR11:8
Старшие 4 бита регистра ATICR

Таблица 35.
Формат регистра ATICRL
ATICRL
Название
Описание

7:0
ICR7:0
Младшие 8 бит регистра ATICR


Регистр управления передачей TRANCR (TRANSFER CONTROL REGISTER). Поддерживает операцию чтения и записи. Формат регистра приведен в табл. 36.
Таблица 36.
Формат регистра TRANCR
ATICRL
Название
Описание

7:1
0
Младшие 8 бит регистра ATICR

0
TRAN
Transfer Enable
Разрешает перезапись DCRx в теневой регистр после переполнения. Устанавливается/сбрасывается программно


Базовый листинг
Задание:
Реализовать простой счетчик секунд, используя таймер для организации секундных интервалов и интерфейс SPI для вывода цифр на семисегментные индикаторы.
Листинг 4:

#INCLUDE "MAX7219.INC"

BYTES
segment byte at 0080-00FF 'ram'

DELAYH ds.b 1
DELAYL ds.b 1
SECONDS ds.b 1
WORDS
segment byte at E000-FFDF 'rom'
.MAIN
RSP ;Сбрасываем указатель стэка
SIM ;Запрещаем прерывания
CLR MCCSR ;Нормальный режим работы ядра
LD A, #$7E
LD RCCR, A ;Калибруем тактовый генератор
CALL INIT_PORT ;Инициализируем порты МК
CALL INIT_TIMER ;Инициализируем таймер
CALL INIT_SPI ;Инициализируем SPI
CALL MAX7219_INIT ;Инициализируем и очищаем MAX7219
CALL MAX7219_CLEAR
LD A, #$03 ;Инициализируем счетчик срабатываний
LD DELAYH, A ;таймера
LD A, #$E8
LD DELAYL, A
CLR SECONDS
RIM
loop:
JP loop ;Зацикливаем программу

.INIT_PORT
… ;Инициализируем порты
RET
.INIT_TIMER
LD A, #%00010010 ;В качестве f тактовых импульсов
LD ATCSR, A ;выбираем частоту ядра. Разрешаем
;прерывания по переполнению
LD A, #$00 ;Инициализируем регистр ATR числом
LD ATRH, A ;96 = 0x60. Таким образом частота
;срабатывания таймера устанавливается
LD A, #$60 ;как fcpu/4000
LD ATRL, A
RET
.INIT_SPI
… ;Инициализируем SPI
RET
.TIMER_Handler
LD A, ATCSR ;Сбрасываем флаг OVF

DEC DELAYL ;Уменьшаем частоту срабатывания
JRNE thend ;таймера до 1 Гц
LD A, #$FF
LD DELAYL, A
DEC DELAYH
JRPL thend
LD A, #$03
LD DELAYH, A
LD A, #$E8
LD DELAYL, A

INC SECONDS
CALL HEX_TO_DEC ;Осуществляем операцию ДД-коррекции
CALL DISPLAY_Seconds ;выводим секунды на индикатор
thend:
IRET
.HEX_TO_DEC
LD A, SECONDS ;Двоично-десятичная коррекция
AND A, #$0F
SUB A, #$0A
JRNE htd
LD A, SECONDS
ADD A, #$06
LD SECONDS, A

LD A, SECONDS
SUB A, #$60
JRNE htd
CLR SECONDS
htd:
RET
.DISPLAY_Seconds
LD A, #$4 ;Вывод секунд на индикатор
LD LED_N, A
LD A, SECONDS
AND A, #$0F
LD LED_S, A
CALL MAX7219_DISPLAY

LD A, #$3
LD LED_N, A
LD A, SECONDS
SWAP A
AND A, #$0F
LD LED_S, A
CALL MAX7219_DISPLAY
RET
segment byte at FFE0-FFFF 'vectit'

ATMR_OVF DC.W TIMER_Handler
RESET DC.W MAIN

END


Лабораторная работа №7
Управление работой линейного двигателя с помощью микроконтроллера ST7
Задание:
Написать программу, осуществляющую управление линейным двигателем, с возможностью изменения режима работы (вращение по часовой стрелке, вращение против часовой стрелки, остановка двигателя) при помощи клавиш лабораторного стенда.
Порядок работы с отладочным комплектом:
Замкнуть перемычку W3;
Теоретические сведения
Следует организовать программное подавление дребезга клавиатуры (обычно при нажатии на клавишу на входе МК фиксируется несколько кратковременных импульсов). Наиболее простой способ подавления дребезга – организация периодического считывания содержимого порта и сравнение текущего его состояния с результатом предыдущего считывания. Если в обоих случаях из разряда порта считывается «1», то делается вывод о том, что клавиша была нажата. Если считываются две «0», то клавиша отпущена. Время между двумя последовательными считываниями состояния клавиатуры должно составлять 10–20 мс. Для организации временной задержки можно воспользоваться встроенным в МК таймером. Одновременно можно вывести на индикаторы стенда информацию о текущем режиме работы двигателя вида.
Лабораторная работа №8
АЦП микроконтроллера ST7FLITE29
Задание:
Инициализировать модуль АЦП микроконтроллера и осуществить съем данных с потенциометра R20. Обеспечить вывод данных в шестнадцатеричном формате на 3 семисегментных индикатора с помощью соответствующих функций, объявленных в MAX7219.INC.
Порядок работы с отладочным комплектом:
Замкнуть все перемычки в блоке S6;
Разомкнуть перемычки W4 и W7;
Замкнуть перемычки W3, W5 и W4;
Теоретические сведения
Аналого-цифровой преобразователь. Представляет собой 10-битный АЦП последовательного приближения. Структурная схема представлена на рис. 36.
Как видно из рисунка периферийный модуль содержит: аналого-цифровой преобразователь, входной усилитель с регулируемым коэффициентом усиления (x1 – x8), регистр данных ADCDR, регистр управления/статуса ADCCSR.

Рис. 36. Структурная схема АЦП микроконтроллера ST7FLITE29

Таблица 37.
Регистра данных ADCDRH
ADCDRН
Название
Описание

7:0
D9..D2
Старший байт регистра данных


Таблица 38.
Регистр данных ADCDRL
ADCDRL
Название
Описание

1:0
D1..D0
Младшие биты регистра данных

2
AMPSEL
Бит выбора коэффициента усиления
0 – коэффициент усиления x1
1 – коэффициент усиления x8

3
SLOW
Используется вместе с битом SPEED регистра ADCCSR для настройки частоты преобразования АЦП (табл. 5.4.).

4
AMPCAL
Используется для калибровки АЦП, когда AMPSEL = 1. Установка этого бита подсоединяет вход АЦП к 0 В. Это необходимо для того, чтобы исключить ошибку смещения уровня.

7..0
-
0


Таблица 39.
Регистр управления/статуса ADCCSR
ADCCSR
Название
Описание

2..0
CH2..CH0
Channel Selection
Определяют канала для преобразования
000 - AIN0
001 - AIN1
010 - AIN2
011 - AIN3
100 - AIN4
101 - AIN5
110 - AIN6

3..4
-
0

5
ADON
A/D Converter On
Запуск АЦП

6
SPEED
Используется вместе с битом SLOW регистра ADCDRН для настройки частоты преобразования АЦП (табл. 5.4.).

7
EOC
End Of Conversion
Устанавливается в 1, после окончания преобразования (оцифровывания)


Таблица 40.
Выбор частоты преобразования АЦП
fADC
SLOW
SPEED

fCPU/2
0
0

fCPU
0
1

fCPU/4
1
x


Базовый листинг
Задание:
Вывести содержимое регистра ADCDRH на светодиодные индикаторы
Листинг 5:

.MAIN
RSP
CLR MCCSR
CALL INIT
RIM
loop:
BTJF ADCCSR, #7, loop ;Ждем флага EOC – окончание преобр.
LD A, ADCDRH ;Выводим содержимое регистра ADCDRH
LD LED_OUT, A ;на светодиодный индикатор
CALL FIRE_LED
JP loop
.INIT
LD A, #$9B
LD PADDR, A
LD PAOR, A
LD A, #$70
LD PBDDR, A
LD PBOR, A
LD A, #$20
LD ADCCSR, A ;Запускаем АЦП
RET
.FIRE_LED

RET
segment byte at FFE0-FFFF 'vectit'

RESET DC.W MAIN
END


Список литературы
1. Белов А.В. Конструирование устройств на микроконтроллерах. – СПб.: Наука и Техника, 2005. – 256 с.
2. Предко М. Руководство по микроконтроллерам. Том I. М: Постмаркет, 2001. - 416 с.
3. Предко М. Руководство по микроконтроллерам. Том II. М: Постмаркет, 2001. - 488 с.
4. Проектирование встроенных систем на микроконтроллерах STMicroelectronics / Под ред. Харченко В.С., Орехова А.А. - Министерство образования и науки Украины, Национальный аэрокосмический университет им. Н.Е. Жуковского «ХАИ», 2007. – 197 с.
5. Ридико Л. Микроконтроллеры фирмы STMicroelectronics. Часть 1. // Электронные компоненты, 2002. – №5. – с. 74-78.
6. Ридико Л. Микроконтроллеры фирмы STMicroelectronics. Часть 2. // Электронные компоненты, 2002. – №7. – с. 98-100.
7. www.st.com/mcu – STDV7 – IDE & ST7 in 10 Steps, 2008.
8. www.st.com/mcu – ST7LITE2 User Manual, 2006.
9. www.st.com/mcu – ST7Lite family, 2008.
10. www.st.com/mcu – ST7 family programming manual. 2005.
11. www.st.com/mcu – ST7 8-bit MCU family user guide, 2002.
Приложение 1.
Система команд микроконтроллера ST7
ADC – сложение с переносом
Синтаксис: adc dst, src
Пример: adc A, #$15
Операция: dst <= dst + src + C
Описание: Исходный байт вместе с флагом переноса добавляются к конечному байту, результат записывается в конечный байт. Исходным байтом является байт памяти, а конечным – аккумулятор.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

ADC
A
Mem

Флаги состояния:
H
I
N
Z
C

H

N
Z
C


ADD – сложение
Синтаксис: add dst, src
Пример: add A, #%11001010
Операция: dst <= dst + src
Описание: Исходный байт добавляется к конечному байту, результат записывается в конечный байт. Исходным байтом является байт памяти, а конечным – аккумулятор.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

ADD
A
Mem

Флаги состояния:
H
I
N
Z
C

H

N
Z
C


AND – логическая операция И
Синтаксис: and dst, src
Пример: and A, #%00110101
Операция: dst <= dst AND src
Описание: Исходный байт побитно логически сравнивается с конечным байтом, результат сравнения записывается в конечный байт. Исходным байтом является байт памяти, а конечным – аккумулятор.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

AND
A
Mem

Флаги состояния:
H
I
N
Z
C



N
Z



BCP – логическое побитное сравнение
Синтаксис: bcp dst, src
Пример: bcp A, #%10100101
Операция: {N, Z} <= dst AND src
Описание: Исходный байт побитно логически сравнивается с конечным байтом. Результат сравнения не сохраняется, но флаги N и Z обновляются соответствующим образом. Исходным байтом является байт памяти, а конечным – аккумулятор. Данная инструкция может быть использована для проверки битов аккумулятора.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

BCP
A
Mem

Флаги состояния:
H
I
N
Z
C



N
Z



BRES – установка бита в ноль
Синтаксис: bres dst, #pos pos = [0..7]
Пример: bres PADR, #6
Операция: dst <= dst AND COMPLEMENT (2**pos)
Описание: Считывается конечный байт, соответствующий бит устанавливается в ноль, результат записывается в конечный байт. Конечным байтом является байт памяти. Позиция бита – константа. Данная инструкция быстра, компактна и не влияет ни на какие регистры. Используется для манипуляций с булевыми переменными.
Обзор инструкции:
Мнемоника
Конечный байт
Позиция бита

BRES
Mem
#pos

Флаги состояния:
H
I
N
Z
C








BSET – установка бита в единицу
Синтаксис: bset dst, #pos pos = [0..7]
Пример: bset PADR, #0
Операция: dst <= dst OR (2**pos)
Описание: Считывается конечный байт, соответствующий бит устанавливается в единицу, результат записывается в конечный байт. Конечным байтом является байт памяти. Позиция бита – константа. Данная инструкция быстра, компактна и не влияет ни на какие регистры. Используется для манипуляций с булевыми переменными.
Обзор инструкции:
Мнемоника
Конечный байт
Позиция бита

BSET
Mem
#pos

Флаги состояния:
H
I
N
Z
C








BTJF – проверка бита и переход если ноль
Синтаксис: btjf dst, #pos, rel pos = [0..7], rel – метка условного перехода
Пример: btjf PADR, #3, skip
Операция: PC = PC + 3; PC = PC + rel IF (dst AND (2**pos)) = 0
Описание: Считывается конечный байт, проверяется соответствующий бит и осуществляется переход на метку rel в том случае, если бит равен нулю, иначе программа продолжается со следующей инструкции. Проверяемый бит сохраняется в флаге C. Конечным байтом является байт памяти. Позиция бита – константа. Метка перехода указывает на адрес в памяти.
Обзор инструкции:
Мнемоника
Конечный байт
Позиция бита
Метка перехода

BTJF
Mem
#pos
rel

Флаги состояния:
H
I
N
Z
C





C


BTJT – проверка бита и переход если единица
Синтаксис: btjt dst, #pos, rel pos = [0..7], rel – метка условного перехода
Пример: btjt PADR, #7, skip
Операция: PC = PC + 3; PC = PC + rel IF (dst AND (2**pos)) <> 0
Описание: Считывается конечный байт, проверяется соответствующий бит и осуществляется переход на метку rel в том случае, если бит равен единице, иначе программа продолжается со следующей инструкции. Проверяемый бит сохраняется в флаге C. Конечным байтом является байт памяти. Позиция бита – константа. Метка перехода указывает на адрес в памяти.
Обзор инструкции:
Мнемоника
Конечный байт
Позиция бита
Метка перехода

BTJT
Mem
#pos
rel


Флаги состояния:
H
I
N
Z
C





C


CALL – вызов подпрограммы (безусловный)
Синтаксис: call dst
Пример: call divide32_16
Операция: PC = PC + lgth; (SP--) = LSB(PC); (SP--) = MSB(PC); PC = dst
Описание: Текущее значение регистра PC записывается в стек, далее в PC загружается заданный адрес. Данная инструкция должна использоваться вместо CALLR при разработке программ.
Обзор инструкции:
Мнемоника
Конечный байт

CALL
Mem

Флаги состояния:
H
I
N
Z
C








CALLR – вызов подпрограммы (условный)
Синтаксис: callr dst
Пример: call chk_pol
Операция: PC = PC + lgth; (SP--) = LSB(PC); (SP--) = MSB(PC); PC = PC + dst
Описание: Текущее значение регистра PC записывается в стек, далее в PC загружается относительный адрес. Данная инструкция используется для отладки программы для уменьшения размера кода.
Обзор инструкции:
Мнемоника
Конечный байт

CALLR
Mem

Флаги состояния:
H
I
N
Z
C








CLR – обнуление байта
Синтаксис: clr dst
Пример: clr X
Операция: dst <= 00
Описание: В конечный байт записывается 00. Конечным байтом является либо байт памяти, либо регистр. Данная инструкция компактна и не влияет ни на один регистр при использовании с переменными в ОЗУ.
Обзор инструкции:
Мнемоника
Конечный байт

CLR
Mem

CLR
Reg

Флаги состояния:
H
I
N
Z
C



0
1




0
1



CP – сравнение
Синтаксис: cp dst, src
Пример: cp A, (tbl, X)
Операция: {N, Z, C} = Test (dst - src)
Описание: Исходный байт вычитается из конечного байта, результат не сохраняется. Однако, флаги N, Z, C обновляются в соответствии с результатом. Исходным байтом является байт памяти, а конечным – регистр. Эта инструкция обычно используется перед командой условного перехода.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

CP
Reg
Mem

Флаги состояния:
H
I
N
Z
C



N
Z
C


CPL – логическая инверсия
Синтаксис: cpl dst
Пример: cpl (X)
Операция: dst <= dst XOR FF, или FF - dst
Описание: Конечный байт считывается, каждый его бит логически инвертируется, результат записывается в конечный байт. Конечным байтом является либо байт памяти, либо регистр.
Обзор инструкции:
Мнемоника
Конечный байт

CPL
Mem

CPL
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
1



N
Z
1


DEC – декремент
Синтаксис: dec dst
Пример: dec Y
Операция: dst <= dst - 1
Описание: Конечный байт считывается, из него вычитается единица, результат записывается в конечный байт. Конечным байтом является либо байт памяти, либо регистр.
Обзор инструкции:
Мнемоника
Конечный байт

DEC
Mem

DEC
Reg

Флаги состояния:
H
I
N
Z
C



N
Z




N
Z



HALT – остановка работы программы
Синтаксис: halt
Операция: I = 0, осциллятор останавливается до тех пор, пока не возникнет прерывание
Описание: Маска прерываний обнуляется, таким образом, разрешается обработка прерываний. Далее останавливается осциллятор, прекращая работу процессора и всех внутренних периферийных устройств, уменьшая энергопотребление микроконтроллера до минимального значения. Микроконтроллер продолжит свою работу по получению внешнего прерывания, перезапустив осциллятор.
Обзор инструкции:
Мнемоника

HALT

Флаги состояния:
H
I
N
Z
C


0





INC – инкремент
Синтаксис: inc dst
Пример: inc counter
Операция: dst <= dst + 1
Описание: Конечный байт считывается, к нему прибавляется единица, результат записывается в конечный байт. Конечным байтом является либо байт памяти, либо регистр.
Обзор инструкции:
Мнемоника
Конечный байт

INC
Mem

INC
Reg


Флаги состояния:
H
I
N
Z
C



N
Z




N
Z



IRET – возврат из обработки прерывания
Синтаксис: iret
Операция: CC = (++SP); A = (++SP); X = (++SP); MSB (PC) = (++SP); LSB (PC) = (++SP)
Описание: Данная инструкция размещается в конце подпрограммы обработки прерывания и возвращает исходную программу к тому состоянию, которое было до возникновения прерывания. Значения всех регистров сохраненных в стеке восстанавливается.
Обзор инструкции:
Мнемоника

IRET

Флаги состояния:
H
I
N
Z
C

H
I
N
Z
C


JP – переход (безусловный)
Синтаксис: jp dst
Пример: jp test
Операция: PC <= dst
Описание: Команда безусловного перехода заменяет содержимое регистра PC значением конечного байта. Данная инструкция должна использоваться вместо JRA при написании программ.
Обзор инструкции:
Мнемоника
Конечный байт

JP
Mem

Флаги состояния:
H
I
N
Z
C








JRA – относительный безусловный переход
Синтаксис: jra dst
Пример: jra loop
Операция: PC <= PC + dst
Описание: Безусловный относительный переход. В регистр PC записывается сумма его предыдущего значения и значения конечного байта. Данная инструкция может быть использована при отладке программы с целью увеличения быстродействия и уменьшения кода.
Обзор инструкции:
Мнемоника
Конечный байт

JRA
Mem

Флаги состояния:
H
I
N
Z
C








JRxx – относительный условный переход
Синтаксис: jrxx dst
Пример: jrxx loop
Операция: PC <= PC + dst if Condition is True
Описание: Условный относительный переход. В регистр PC записывается сумма его предыдущего значения и значения конечного байта в случае истинности заданного условия. Программа переходит к строчке, адрес которой записан в PC. В случае невыполнения условия выполнение программы продолжается со следующей строчки.
Обзор инструкции:
Мнемоника
Конечный байт

JRxx
Mem


Флаги состояния:
H
I
N
Z
C








Список возможных инструкций:
Мнемоника
Описание
Условие

JRC
Переход если флаг переноса единица
C = 1

JREQ
Переход в случае равенства
Z = 1

JRF
Переход если условие ложно
Ложь

JRH
Перенос если флаг полупереноса единица
H = 1

JRIH
Переход если уровень линии прерывания высокий
-

JRIL
Переход если уровень линии прерывания низкий
-

JRM
Переход если прерывания запрещены
I = 1

JRMI
Переход если результат отрицательный
N = 1

JRNC
Переход если флаг переноса ноль
C = 0

JRNE
Переход в случае неравенства
Z = 0

JRNH
Перенос если флаг полупереноса ноль
H = 0

JRNM
Переход если прерывания разрешены
I = 0

JRPL
Переход если результат положительный
N = 0

JRT
Переход если условие истинно
Истина

JRUGE
Переход если больше либо равно
C = 0

JRUGT
Переход если больше
(C или Z) = 0

JRULE
Переход если меньше либо равно
(C или Z) = 1

JRULT
Переход если меньше
C = 1


LD – загрузка данных
Синтаксис: ld dst, src
Пример: ld A, #$15
Операция: dst <= src
Описание: Значение исходного байта заносится в конечный байт.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

LD
Reg
Mem

LD
Mem
Reg

LD
Reg
Reg

LD
S
Reg

LD
Reg
S

Флаги состояния:
H
I
N
Z
C



N
Z




N
Z





















MUL – умножение (беззнаковое)
Синтаксис: mul dst, src
Пример: mul X, A
Операция: dst:src <= dst x src
Описание: Исходный байт умножается на конечный байт. Старшая часть 16 битного результата сохраняется в конечный байт, а младшая часть в исходный байт.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

MUL
X:A
X, A

MUL
Y:A
Y, A

Флаги состояния:
H
I
N
Z
C

0



0

0



0


NEG – отрицание
Синтаксис: neg dst
Пример: neg (X)
Операция: dst <= (dst XOR FF) + 1, or 00 - dst
Описание: Конечный байт считывается, каждый его бит логически инвертируется, результат увеличивается на единицу и записывается в конечный байт. Конечным байтом является либо байт памяти, либо регистр. Флаг переноса обнуляется, если результат равен нулю. Данная инструкция используется для инверсии знаковых чисел.
Обзор инструкции:
Мнемоника
Конечный байт

NEG
Mem

NEG
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
C



N
Z
C


NOP – нет команды
Синтаксис: nop
Описание: Данная инструкция не делает ничего. Она может быть использована либо для отключения команды, либо для организации задержки.
Обзор инструкции:
Мнемоника

NOP

Флаги состояния:
H
I
N
Z
C








OR – логическая операция ИЛИ
Синтаксис: or dst, src
Пример: or A, #%00110101
Операция: dst <= dst OR src
Описание: Исходный байт побитно логически сравнивается с конечным байтом, результат сравнения записывается в конечный байт. Исходным байтом является байт памяти, а конечным – аккумулятор.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

OR
A
Mem

Флаги состояния:
H
I
N
Z
C



N
Z



POP – чтение из стека
Синтаксис: pop dst
Пример: pop CC
Операция: dst <= (++SP)
Описание: Чтение из стека предварительно занесенного туда байта данных. Результат чтения помещается в конечный байт. Регистр SP увеличивается на единицу.
Обзор инструкции:
Мнемоника
Конечный байт

POP
A

POP
X

POP
Y

POP
CC

Флаги состояния:
H
I
N
Z
C



















H
I
N
Z
C


PUSH – запись в стек
Синтаксис: push dst
Пример: push A
Операция: (SP--) <= dst
Описание: Запись в стек байта данных. Регистр SP уменьшается на единицу.
Обзор инструкции:
Мнемоника
Конечный байт

PUSH
A

PUSH
X

PUSH
Y

PUSH
CC

Флаги состояния:
H
I
N
Z
C


























RCF – обнуление флага переноса
Синтаксис: rcf
Операция: C = 0
Описание: Данная команда устанавливает флаг переноса регистра CC в ноль. Может быть использована для контроля над флагами.
Обзор инструкции:
Мнемоника

RCF


Флаги состояния:
H
I
N
Z
C





0


RET – возврат из подпрограммы
Синтаксис: ret
Операция: MSB (PC) = (++SP); LSB (PC) = (++SP)
Описание: Восстанавливает значение PC из стека. Регистр SP инкрементируется дважды. Данная инструкция является последней командой каждой подпрограммы.
Обзор инструкции:
Мнемоника

RET

Флаги состояния:
H
I
N
Z
C








RIM – сброс маски прерываний/разрешение прерываний
Синтаксис: rim
Операция: I = 0
Описание: Команда обнуляет маску прерываний в регистре CC, что разрешает прерывания. Данная инструкция обычно помещается в основном цикле программы, после того, как все необходимые прерывания нужным образом настроены.
Обзор инструкции:
Мнемоника

RIM

Флаги состояния:
H
I
N
Z
C


0





RLC – логический сдвиг влево через флаг переноса
Синтаксис: rlc dst
Пример: rlc (X)
Операция:

Описание: Конечным байтом является либо байт памяти, либо регистр.
Обзор инструкции:
Мнемоника
Конечный байт

RLC
Mem

RLC
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
bit7



N
Z
bit7


RRC – логический сдвиг вправо через флаг переноса
Синтаксис: rrc dst
Пример: rrc (X)
Операция:

Описание: Конечным байтом является либо байт памяти, либо регистр.
Обзор инструкции:
Мнемоника
Конечный байт

RLC
Mem

RLC
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
bit0



N
Z
bit0


RSP – обнуление регистра SP
Синтаксис: rsp
Операция: SP = Reset Value
Описание: Сброс регистра SP на первоначальное значение. Данная инструкция может быть помещена вначале процедуры сброса контроллера.
Обзор инструкции:
Мнемоника

RSP

Флаги состояния:
H
I
N
Z
C








SBC – вычитание с переносом
Синтаксис: sbc dst, src
Пример: sbc A, #$15
Операция: dst <= dst - src - C
Описание: Исходный байт вместе с флагом переноса вычитаются из конечного байта, результат записывается в конечный байт. Исходным байтом является байт памяти, а конечным – аккумулятор.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

SBC
A
Mem

Флаги состояния:
H
I
N
Z
C



N
Z
C


SCF – установка флага переноса
Синтаксис: scf
Операция: C = 1
Описание: Данная команда устанавливает флаг переноса регистра CC в единицу. Может быть использована для контроля над флагами.
Обзор инструкции:
Мнемоника

SCF

Флаги состояния:
H
I
N
Z
C





1


SIM – установка маски прерываний/запрет прерываний
Синтаксис: sim
Операция: I = 1
Описание: Команда устанавливает маску прерываний в регистре CC, что запрещает прерывания. Данная инструкция бесполезна в начале процедуры обработки прерывания.
Обзор инструкции:
Мнемоника

SIM

Флаги состояния:
H
I
N
Z
C


1





SLA – арифметический сдвиг влево
Синтаксис: sla dst
Пример: sla (X)
Операция:

Описание: Конечным байтом является либо байт памяти, либо регистр. Данная инструкция эквивалентна команде SLL.
Обзор инструкции:
Мнемоника
Конечный байт

SLA
Mem

SLA
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
bit7



N
Z
bit7


SLL – логический сдвиг влево
Синтаксис: sll dst
Пример: sll (X)
Операция:

Описание: Конечным байтом является либо байт памяти, либо регистр. Данная инструкция удваивает значение байта.
Обзор инструкции:
Мнемоника
Конечный байт

SLL
Mem

SLL
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
bit7



N
Z
bit7


SRA – арифметический сдвиг вправо
Синтаксис: sra dst
Пример: sra (X)
Операция:

Описание: Конечным байтом является либо байт памяти, либо регистр. Данная инструкция производит деление на два с учетом знака. Бит 7 отвечающий за знак числа не изменяется.
Обзор инструкции:
Мнемоника
Конечный байт

SRA
Mem

SRA
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
bit0



N
Z
bit0


SRL – логический сдвиг вправо
Синтаксис: srl dst
Пример: srl (X)
Операция:

Описание: Конечным байтом является либо байт памяти, либо регистр. Данная инструкция производит беззнаковое деление числа на два.
Обзор инструкции:
Мнемоника
Конечный байт

SRL
Mem

SRL
Reg

Флаги состояния:
H
I
N
Z
C



N
Z
bit0



N
Z
bit0


SUB – вычитание
Синтаксис: sub dst, src
Пример: sub A, #%11001010
Операция: dst <= dst - src
Описание: Исходный байт вычитается из конечного байта, результат записывается в конечный байт. Исходным байтом является байт памяти, а конечным – аккумулятор.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

SUB
A
Mem

Флаги состояния:
H
I
N
Z
C



N
Z
C


SWAP – обмен нибблами
Синтаксис: swap dst
Пример: swap counter
Операция: dst [7..4] <=> dst [3..0]
Описание: Старший и младший нибблы конечного байта меняются местами. Конечным байтом является либо байт памяти, либо регистр.
Обзор инструкции:
Мнемоника
Конечный байт

SWAP
Mem

SWAP
Reg

Флаги состояния:
H
I
N
Z
C



N
Z




N
Z



TNZ – проверка на отрицательность или ноль
Синтаксис: tnz dst
Пример: tnz A
Операция: {N, Z} = Test(dst)
Описание: Проверяется конечный байт, флаги N и Z обновляются соответствующим образом.
Обзор инструкции:
Мнемоника
Конечный байт

TNZ
Mem

TNZ
Reg

Флаги состояния:
H
I
N
Z
C



N
Z




N
Z



TRAP – программное прерывание
Синтаксис: trap
Операция: PC = PC + 1; (SP--) = LSB (PC); (SP--) = MSB (PC); (SP--) = X; (SP--) = A; (SP--) = CC; PC = Vector Contents
Описание: Данная инструкция приводит к выполнению программного прерывания. Это прерывание не может быть запрещено с помощью маски.
Обзор инструкции:
Мнемоника

TRAP

Флаги состояния:
H
I
N
Z
C


1





WFI – ожидание прерывания (режим низкого энергопотребления)
Синтаксис: wfi
Операция: I = 0; Тактовый генератор останавливается до тех пор, пока не возникнет прерывание. Внутренние периферийные устройства продолжают работать.
Описание: Флаг прерывания обнуляется, разрешая работу прерываний. Далее тактовый генератор останавливается, переводя микроконтроллер в режим малого энергопотребления. Программа продолжит работу по внешнему или внутреннему прерыванию.
Обзор инструкции:
Мнемоника

WFI

Флаги состояния:
H
I
N
Z
C


0





XOR – логическая операция исключающее ИЛИ
Синтаксис: xor dst, src
Пример: xor A, #%00110101
Операция: dst <= dst XOR src
Описание: Исходный байт побитно логически сравнивается с конечным байтом, результат сравнения записывается в конечный байт. Исходным байтом является байт памяти, а конечным – аккумулятор.
Обзор инструкции:
Мнемоника
Конечный байт
Исходный байт

XOR
A
Mem

Флаги состояния:
H
I
N
Z
C



N
Z



Приложение 2.
Директивы препроцессора
BYTE
Синтаксис: BYTE <выражение или «строка»>, [<выражение или «строка»>...]
Операция: определить байт в объектном коде
BYTES
Синтаксис: BYTES
Операция: определение типа метки: тип = байт
CEQU
Синтаксис: метка CEQU <выражение>
Операция: приравнять уже существующую метку к выражению
DC.B
Синтаксис: DC.B <выражение или «строка»>, [<выражение или «строка»>]
Операция: определить байт(ы) в объектном коде
DC.W
Синтаксис: DC.W <выражние> , [<выражение>...]
Операция: определить слово(а) в объектном коде
DC.W
Синтаксис: DC.W <выражние>, [<выражение>...]
Операция: определить слово(а) в объектном коде
DC.L
Синтаксис: DC.L <выражение>, [<выражение>...]
Операция: определить длинные слова в объектном коде
#DEFINE
Синтаксис: #DEFINE <имя_константы> <значение>
Операция: определить именованную константу
DS.B
Синтаксис: DS.B [опционально количество байт]
Операция: определить в объектном коде пространство размером byte
DS.W
Синтаксис: DS.W [опционально количество слов]
Операция: определить в объектном коде пространство размером word
DS.L
Синтаксис: DS.L [опционально количество длинных слов]
Операция: определить в объектном коде пространство размером long
END
Синтаксис: END
Операция: конец исходного кода
EQU
Синтаксис: метка EQU <выражение>
Операция: приравнять метку к выражению
EXTERN
Синтаксис: EXTERN
Операция: определить внешние метки
#INCLUDE
Синтаксис: #INCLUDE «<имя_файла>»
Операция: вставить внешний файл с исходным кодом
LONG
Синтаксис: LONG <выражение>, [<выражение>...]
Операция: определить длинное слово в объектном коде
LONGS
Синтаксис: LONGS
Операция: определить длину новой метки по умолчанию как long
WORD
Синтаксис: WORD <выражение>, [<выражение>...]
Операция: определить слово в объектном коде
WORDS
Синтаксис: WORDS
Операция: определить длину новой метки по умолчанию как word
Приложение 3.
Описание цифровых осциллографов TDS20ххB
Технические параметры осциллографов семейства TDS20ххB
Модель
Число каналов
Полоса пропускания, МГц
Частота выборки, млрд. выб/с
Экран

TDS2002B
2
60
1
Цветной

TDS2004B
4
60
1
Цветной

TDS2012B
2
100
1
Цветной

TDS2014B
4
100
1
Цветной

TDS2022B
2
200
2
Цветной

TDS2024B
4
200
2
Цветной


Расположение органов управления

Элементы управления отображением по вертикали

Кнопки МЕНЮ (К1-К4). Эти кнопки позволяют вывести на экран значения параметров меню по вертикали и включить или отключить отображение сигнала определенного канала.
ВОЛЬТ/ДЕЛ (К1-К4). Выбор масштаба по вертикали.
МЕНЮ МАТЕМАТИКА. После нажатия кнопки на экране отображается меню математических операций для сигналов. Кнопка также используется для включения и выключения расчетных осциллограмм.
Элементы управления отображением по горизонтали

ПОЛОЖЕНИЕ. С помощью этой ручки регулируется положение по горизонтали осциллограмм во всех каналах и расчетных осциллограмм. Разрешение данного элемента управления изменяется в зависимости от значения масштаба времени.
ГОРИЗ МЕНЮ. Вывод на экран меню горизонтали.
УСТ НУЛЬ. Если нажать кнопку, устанавливается нулевое положение по горизонтали.
СЕК/ДЕЛ. Поворотом этой ручки задается коэффициент масштабирования (время/деление) для основного масштаба времени или масштаба времени окна.
Элементы управления синхронизацией

УРОВЕНЬ. Если используется синхронизация по фронту или по длительности импульса, ручка позволяет установить уровень амплитуды, которую должен иметь сигнал, чтобы его можно было зарегистрировать.
МЕНЮ СИНХ. При нажатии этой кнопки на экран выводится меню синхронизации.
УСТ 50%. Уровень запуска устанавливается по вертикали посередине между пиковыми уровнями сигнала синхронизации.
ФОРС ЗАПУСК. При нажатии этой кнопки сбор данных завершается независимо от наличия необходимого сигнала синхронизации. Если регистрация данных уже остановлена, эта кнопка не действует.
Кнопки меню и управления

Универсальная ручка. Конкретная функция ручки определяется отображенным на экране мен или выбранной командой меню. Когда ручка активна, рядом с ней загорается индикатор. В таблице указаны функции ручки.
АВТОДИАПАЗОН. При нажатии кнопки на экране появляется меню автодиапазона и включается или выключается функция автоматического выбора диапазона. При включенном режиме автоматического выбора диапазона рядом с ручкой загорается индикатор.
СОХР/ВЫЗОВ. При нажатии кнопки на экране появляется меню сохранения и загрузки данных для параметров настройки и осциллограмм.
ИЗМЕРЕНИЯ. При нажатии данной кнопки на экране отображается меню автоматических измерений.
СБОР ДАННЫХ. При нажатии этой кнопки отображается меню сбора данных.
REF MENU (Меню опорного сигнала). Вывод на экран меню опорного сигнала, позволяющего быстро отображать и скрывать опорные осциллограммы, хранимые в энергонезависимой памяти осциллографа.
СЕРВИС. При нажатии этой кнопки на экран выводится меню сервиса.
КУРСОР. Вывод на экран меню курсора. Курсоры отображаются на экране после выхода из меню курсора, но изменить их положение невозможно.
ЭКРАН. Отображение меню экрана.
СПРАВКА. Вывод на экран меню справки.
НАСТРОЙКА ПО УМОЛЧАНИЮ. Восстановление заводской настройки.
АВТОУСТ. Автоматическая установка значений параметров управления сигналом, обеспечивающих приемлемое изображение входящих сигналов.
ОДИНОЧН ЗАПУСК. Регистрируется одиночный сигнал, после чего сбор данных прекращается.
ПУСК/СТОП. Сигналы регистрируются непрерывно или сбор данных приостанавливается.
PRINT (Печать). Запуск печати на принтере, совместимом с PictBridge или выполнение функции СОХРАНЕНИЕ на запоминающем устройстве USB.
СОХРАНЕНИЕ. Горящий индикатор указывает, что кнопка PRINT (Печать) настроена для сохранения данных в запоминающем устройстве USB.
Содержание
стр.

Введение……………………………………………………………………...
2

Технические характеристики микроконтроллеров ST7LITE2 ……………
2

Назначение выводов микроконтроллера …………………………………...
5

Организация памяти …………………………………………………………
7

Центральное процессорное устройство ……………………………………
10

Система команд ……………………………………………………………...
16

Режимы адресации …………………………………………………………..
19

Обработка прерываний ……………………………………………………...
29

Программное обеспечение лабораторного стенда ………………………...
31

Лабораторные работы
42

Лабораторная работа №1. Изучение кросс-средств для программирования микроконтроллера ST7LITE2 ………………………...

42

Лабораторная работа №2. Ознакомление с лабораторным стендом, анализ работы стенда с помощью осциллографа ………………………….

53

Лабораторная работа №3. Порты ввода/вывода микроконтроллера ST7FLITE29 ………………………………………………………………….

55

Лабораторная работа №4. Система прерываний микроконтроллера ST7FLITE29 ………………………………………………………………….

61

Лабораторная работа №5. Интерфейс SPI микроконтроллеров ST7 ……..
65

Лабораторная работа №6. Таймер ART микроконтроллера ST7FLITE29 .
71

Лабораторная работа №7. Управление работой линейного двигателя с помощью микроконтроллера ST7 …………………………………………..

81

Лабораторная работа №8. АЦП микроконтроллера ST7FLITE29 ………..
82

Список литературы ………………………………………………………….
86

Приложение 1. Система команд микроконтроллера ST7 …………………
87

Приложение 2. Директивы препроцессора …………………………………
111

Приложение 3. Описание цифровых осциллографов TDS20xxB …………
113