СТМ8
Эта статья нуждается в дополнительных цитатах для проверки . ( январь 2018 г. ) |


STM8 STMicroelectronics — семейство 8- микроконтроллеров компании . битных Микроконтроллеры STM8 используют расширенный вариант архитектуры микроконтроллера ST7 . Микроконтроллеры STM8 особенно дешевы для полнофункционального 8-битного микроконтроллера. [1]
Архитектура
[ редактировать ]STM8 очень похож на более ранний ST7, но лучше подходит в качестве цели для C благодаря своим 16-битным индексным регистрам и режиму адресации относительно указателя стека . Несмотря на то, что внутренняя архитектура представляет собой Гарвардскую архитектуру, она имеет «мост памяти», который создает единое 24-битное адресное пространство, позволяя выполнять код из ОЗУ (полезно для внутрисистемного программирования флэш -ПЗУ ), а данные (например, таблицы поиска ) — быть доступным из ПЗУ. При доступе «мост памяти» при необходимости останавливает ЦП, чтобы стал возможен доступ к записи во флэш-ПЗУ, подобный ОЗУ. Выполнение кода из EEPROM отклоняется и создается событие сброса. Произвольный доступ к данным размером более 64 КБ ограничен специальными инструкциями «загрузить далеко»; Операнды памяти большинства операций могут иметь доступ не более чем к 128 КБ (16-битный базовый адрес плюс 16-битное смещение).
В зависимости от типа устройства объем оперативной памяти находится в диапазоне от 1 до 6 КиБ, а объем ПЗУ — от 4 до 8 КиБ (низкая плотность), от 16 до 32 КиБ (средняя плотность) или от 32 до 96 КиБ ( Высокая плотность).
Он имеет те же шесть регистров (A, X, Y, SP, PC, CC), что и ST7, но индексные регистры X и Y расширены до 16 бит, а счетчик программ расширен до 24 бит. Аккумулятор . A и указатель стека остаются 8- и 16-битными соответственно [2]
Регистр кода состояния имеет еще два определенных бита, всего семь. Имеется флаг переполнения и второй бит разрешения прерывания, позволяющий использовать четыре уровня приоритета прерываний .
Подсемейства
[ редактировать ]- СТМ8АФ автомобильный
- СТМ8АЛ автомобильный маломощный
- STM8L маломощный
- СТМ8С общего назначения
- STM8T сенсорный
- Управление освещением STLUX
- STNRG с широтно-импульсной модуляцией Контроллеры
Поддержка компилятора
[ редактировать ]STM8 поддерживается бесплатным компилятором C Small Device , бесплатным компилятором Cosmic C с закрытым исходным кодом, [3] и несвободные компиляторы IAR C и Raisonance. Помимо C существует STM8 eForth с открытым исходным кодом, [4] интерактивная система Forth для STM8.
Изменения по сравнению с ST7
[ редактировать ]Набор инструкций STM8 в основном является расширенным набором инструкций ST7, но он не полностью совместим на уровне двоичного кода.
Операции с регистрами X и Y расширены до 16 бит. Таким образом, операции загрузки и сохранения получают доступ к двум байтам памяти, а не к одному. (Кроме того, флаг полупереноса был изменен, чтобы отразить перенос с бита 7 на бит 8 16-битного результата, а не с бита 3 на 4.)
Прерывания передают девять байтов состояния вместо пяти, как в ST7.
Команда умножения сохраняет 16-битное произведение в указанном индексном регистре (например, X), а не делит его между X и A.
Режимы косвенной адресации, которые извлекают 8-битный адрес из памяти (коды операций 92 2x
, 92 3x
, 92 Bx
, 92 6x
, 92 Ex
, 91 6x
, и 91 Ex
) были удалены; все режимы косвенной адресации выбирают 16-битные адреса. Новый байт префикса 72
был добавлен и использовался для косвенного кодирования, начиная с 16-битного адреса.
Инструкции по битовым манипуляциям были изменены: теперь они используют 16-битный адрес и требуют 72
префиксный байт. Коды операций без префиксов 0x
и 1x
они ранее были заняты, вместо этого используются для относительной адресации указателя стека.
Коды операций некоторых редко используемых инструкций ветвления были изменены, чтобы требовать 90
префикс, а коды операций без префикса переназначаются подписанным ветвям, которые зависят от флага V.
Инструкции загрузки и сравнения, предназначенные для регистра X, малопригодны для ST7, поскольку режимы адресации индексируются регистром X. В STM8, когда такие операции указывают операнд памяти, индексированный регистром X, операнд регистра изменяется на Y. 90
префикса, регистры меняются местами, поэтому индексный регистр равен Y, а регистр операнда — X.
Одним из основных отличий в производительности является то, что STM8 извлекает 32 бита из ПЗУ за цикл, а выполнение многих инструкций занимает один цикл. В зависимости от длины инструкции и количества необходимых циклов выполнение из ОЗУ происходит несколько медленнее. ST7, напротив, извлекает 8 бит за такт и занимает один такт на каждый байт инструкции.
Набор инструкций
[ редактировать ]Большинство байтов кода операции STM8 состоят из 1 бита типа (один или два операнда), трех битов режима адресации и четырех битов кода операции. Назначаются только 6 режимов адресации и 12 однооперандных кодов операций, оставляя место для кодирования, где размещаются другие инструкции.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Описание |
---|---|---|---|---|---|---|---|---|
0 | режим | код операции | Инструкции с одним операндом (режим ≠ 1, 2) | |||||
0 | 0 | 0 | 1 | код операции | Дополнительные инструкции с двумя операндами | |||
0 | 0 | 1 | 0 | код операции | Условные ветки | |||
0 | код операции | 0 | 0 | 0 | 1 | Другие арифметические инструкции (код операции ≠ 1, 2) | ||
0 | код операции | 0 | 0 | 1 | 0 | |||
0 | код операции | 0 | 1 | 0 | 1 | |||
0 | код операции | 1 | 0 | 1 | 1 | |||
1 | режим | код операции | Инструкции с двумя операндами (режим ≠ 0, 1) | |||||
1 | 0 | 0 | код операции | Различные неарифметические инструкции |
Инструкции STM8 состоят из необязательного префиксного байта ( 7216
, 9016
, 9116
, или 9216
), байт кода операции и несколько (до четырех, но редко более двух) байтов операндов. Байты префикса в основном изменяют режим адресации, используемый для указания операнда памяти, но в некоторых случаях префиксы 72
и 90
полностью измените значение байта кода операции.
Префикс 90
меняет местами X и Y в следующей инструкции. В таблице ниже эти варианты объединены в одну строку записью «X/Y», что означает либо «X», либо «Y». Префикс 90
также используется в двух местах для введения новых кодов операций: инструкций BCPL и BCCM и некоторых условий ветвления.
Префикс 92
преобразует инструкции со смещенным операндом ( addr16 ,X) в косвенную адресацию ([ addr8 ],X). Смещение заменяется 8-битным адресом 16-битного значения смещения в памяти. Он используется только для этой функции.
Префикс 91
имеет оба предыдущих эффекта, преобразуя режимы адресации ([ addr16 ,X) в ([ addr8 ],Y).
Префикс 72
используется во многих местах, но гораздо менее регулярно. В некоторых случаях он вводит новые режимы адресации (в частности, 16-битный косвенный режим ([ addr16 ],X)), но также вводит множество совершенно новых операций.
Префикс | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Операнды | Мнемоника | Описание |
---|---|---|---|---|---|---|---|---|---|---|---|
— | 0 | 0 | 0 | 0 | код операции | адрес8 | ОП ( адрес8 , ИП) | Инструкции с одним операндом (см. ниже) | |||
— | 0 | 0 | 0 | 1 | код операции | адрес8 | ОП А, ( адрес8 , СП) | Инструкции с двумя операндами и стековым операндом | |||
— | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | адрес8 | SUB A, ( адрес 8 , SP) | А := А - операнд |
— | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | адрес8 | CP A, ( адрес8 , SP) | Сравните A — операнд |
— | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | адрес8 | SBC A, ( адрес8 , SP) | A := A − операнд − C вычитание с заимствованием |
— | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | адрес8 | CPW X,( адрес8 ,SP) | Сравнить X — операнд (16-битный) |
— | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | адрес8 | И А,( адрес8 ,SP) | A := A & операнд, поразрядно и |
— | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | адрес8 | BCP A, ( адрес8 , SP) | Побитовый тест A и операнд |
— | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | адрес8 | LDW Y,( адрес8 ,SP) | Y := операнд ( |
— | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | адрес8 | LDW ( адрес8 , SP),Y | Операнд := Y ( |
— | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | адрес8 | XOR A, ( адрес8 , SP) | A := A ^ операнд, исключающее-или |
— | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | адрес8 | АЦП А, ( адрес8 , SP) | A := A + операнд + C, добавить с переносом |
— | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | адрес8 | ИЛИ A,( адрес8 ,SP) | А := А | операнд, включающий или |
— | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | адрес8 | ДОБАВИТЬ A,( адрес8 ,SP) | А := А + операнд |
— | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | имм16 | ADDW X,#imm16 | X := X + немедленно (= |
— | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | имм16 | СУБВ X,#imm16 | X := X - немедленный (= |
— | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | адрес8 | LDW X,( адрес8 ,SP) | X := операнд |
— | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | адрес8 | LDW ( адрес8 , SP),X | Операнд := Х |
72/90 | 0 | 0 | 0 | с | кусочек | v | операнды | Битовые операции | |||
72 | 0 | 0 | 0 | 0 | кусочек | 0 | адрес16 софф8 | BTJT addr16 , # бит , метка | Перейти к ПК + soff8, если исходный бит истинен (установлен) | ||
72 | 0 | 0 | 0 | 0 | кусочек | 1 | адрес16 софф8 | BTJF addr16 , # бит , метка | Перейти к ПК + soff8, если исходный бит ложный (сброс) | ||
72 | 0 | 0 | 0 | 1 | кусочек | 0 | адрес16 | BSET адрес16 , # бит | Установить указанный бит в 1 | ||
72 | 0 | 0 | 0 | 1 | кусочек | 1 | адрес16 | BRES адрес16 , # бит | Сбросить (очистить) указанный бит в 0 | ||
90 | 0 | 0 | 0 | 1 | кусочек | 0 | адрес16 | BCPL адрес16 , # бит | Дополнить (переключить) выбранный бит | ||
90 | 0 | 0 | 0 | 1 | кусочек | 1 | адрес16 | BCCM адрес16 , # бит | Записать флаг переноса в бит памяти | ||
—/90 | 0 | 0 | 1 | 0 | состояние | soff8 | Условные переходы (8-битное знаковое смещение) | ||||
— | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | soff8 | JRA Этикетки | Ветка всегда (истина) |
— | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | soff8 | JRF Этикетка | Ветка никогда (ложь) |
— | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | soff8 | JRUGT Этикетка | Переход, если беззнаковое число больше (C=0 и Z=0) |
— | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | soff8 | JRULE Ярлык | Переход, если беззнаковое число меньше или равно (C=1 или Z=1) |
— | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | soff8 | JRNC Этикетка | Переходить, если нет переноса (C=0) |
— | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | soff8 | JRC Этикетка | Ответвление при переносе (C=1) |
— | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | soff8 | JRNE Этикетка | Разветвление, если не равно (Z=0) |
— | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | soff8 | JREQ Метка | Разветвление при равенстве (Z=1) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | soff8 | JRNV Этикетка | Переходить, если нет переполнения (V=0) |
90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | soff8 | JRNH Этикетка | Переход, если не полуперенос (H=0) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | soff8 | JRV Этикетка | Переходить при переполнении (V=1) |
90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | soff8 | JRH Этикетка | Переход в случае полупереноса (H=1) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | soff8 | JRPL Лейбл | Переход, если плюс (N=0) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | soff8 | JRMI Этикетка | Переходить, если минус (N=1) |
— | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | soff8 | JRSGT Этикетка | Переход, если знак больше (S=0 и N=V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | soff8 | JRNM Этикетка | Переход по маске прерывания (I=0) |
— | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | JRSLE Этикетка | Переход, если знак меньше или равен (S=1 или N≠V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | JRM Этикетки | Переход, если прерывания замаскированы (I=1) |
— | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | soff8 | JRSGE Этикетка | Ветвь, если знак больше или равен (N=V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | soff8 | JRIL Этикетка | Переход, если линия прерывания имеет низкий уровень |
— | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | soff8 | JRSLT Этикетка | Ветвь, если знак меньше (N≠V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | soff8 | JRIH Этикетка | Переход, если линия прерывания имеет высокий уровень |
префикс | 0 | режим | код операции | операнд | Инструкции с одним операндом | ||||||
— | 0 | 0 | 0 | 0 | код операции | адрес8 | ОП ( адрес8 , ИП) | Указатель стека относительно | |||
0 | 0 | 0 | 1 | код операции | (переназначено на инструкции с двумя операндами со стеком; см. выше) | ||||||
0 | 0 | 1 | 0 | код операции | (переназначено на условные ветки; см. выше) | ||||||
— | 0 | 0 | 1 | 1 | код операции | адрес8 | ОП адрес8 | 8-битный абсолютный адрес | |||
72 | 0 | 0 | 1 | 1 | код операции | адрес16 | ОП [ адрес16 ] | 16-битный косвенный адрес | |||
92 | 0 | 0 | 1 | 1 | код операции | адрес8 | ОП [ адрес8 ] | 8-битный косвенный адрес 16-битного адреса | |||
— | 0 | 1 | 0 | 0 | код операции | — | ОП А | аккумулятор | |||
72/90 | 0 | 1 | 0 | 0 | код операции | адрес16 | ОП ( адрес16 , X/Y) | Индексировано с 16-битным смещением | |||
—/90 | 0 | 1 | 0 | 1 | код операции | — | ОПВ X/Y | Регистр X/Y (16-битная операция) | |||
72 | 0 | 1 | 0 | 1 | код операции | адрес16 | ОП адрес 16 | 16-битный адрес | |||
—/90 | 0 | 1 | 1 | 0 | код операции | адрес8 | ОП ( адрес8 , X/Y) | 8-битный адрес плюс X/Y | |||
72 | 0 | 1 | 1 | 0 | код операции | адрес16 | ОП ([ адрес16 ],X) | 16-битный косвенный адрес плюс X | |||
92/91 | 0 | 1 | 1 | 0 | код операции | адрес8 | ОП ([ адрес8 ],X/Y) | 8-битный косвенный адрес плюс X/Y | |||
—/90 | 0 | 1 | 1 | 1 | код операции | — | ВВЕРХ (X/Y) | Индексировано без смещения | |||
префикс | 0 | режим | 0 | 0 | 0 | 0 | операнд | ОБРАТНЫЙ операнд | Отрицание с дополнением до двух | ||
0 | режим | 0 | 0 | 0 | 1 | (переназначено на обменные операции; см. следующий раздел) | |||||
0 | режим | 0 | 0 | 1 | 0 | (переназначено на другие операции; см. следующий раздел) | |||||
префикс | 0 | режим | 0 | 0 | 1 | 1 | операнд | CPL- операнд | Дополнение единиц , логическое нет | ||
префикс | 0 | режим | 0 | 1 | 0 | 0 | операнд | SRL операнд | Логический сдвиг вправо, мсбит очищен, лсбит переносится: (операнд:C) := (0:операнд) | ||
0 | режим | 0 | 1 | 0 | 1 | (переназначено на другие операции; см. следующий раздел) | |||||
префикс | 0 | режим | 0 | 1 | 1 | 0 | операнд | RRC Операнд | Поворот вправо через перенос, (операнд:C) := (C:operand) | ||
префикс | 0 | режим | 0 | 1 | 1 | 1 | операнд | SRA Операнд | Сдвиг вправо в арифметике, мсбит сохраняется, лсбит переносится | ||
префикс | 0 | режим | 1 | 0 | 0 | 0 | операнд | SLL- операнд | Сдвиг влево, мбит для переноса: (C:operand) := (operand:0) | ||
префикс | 0 | режим | 1 | 0 | 0 | 1 | операнд | RLC- операнд | Поворот влево посредством переноса, (C:operand) := (operand,C) | ||
префикс | 0 | режим | 1 | 0 | 1 | 0 | операнд | декабря операнд | Декремент; N и Z установлены, перенос без изменений | ||
0 | режим | 1 | 0 | 1 | 1 | (переназначено на другие операции; см. следующий раздел) | |||||
префикс | 0 | режим | 1 | 1 | 0 | 0 | операнд | ВКЛ. операнд | Приращение; N и Z установлены, перенос без изменений | ||
префикс | 0 | режим | 1 | 1 | 0 | 1 | операнд | ТНЗ операнд | Проверьте ненулевое значение: установите N и Z на основе значения операнда | ||
префикс | 0 | режим | 1 | 1 | 1 | 0 | операнд | замены Операнд | Поменять местами половины операнда (4-битное вращение; 8-битное для SWAPW X и SWAPW Y) | ||
префикс | 0 | режим | 1 | 1 | 1 | 1 | операнд | CLR операнд | Установить операнд в 0, N очищено, Z установлено. | ||
префикс | 0 | режим | код операции | операнд | Переназначены оподы [03-7][125B] из диапазона с одним операндом. | ||||||
—/90 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | RRWA X/Y | Поворот слова вправо через A: 8-битный поворот вправо из 24-битной конкатенации X/Y и A; (Х:А) := (А:Х) |
— | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | адрес16 | EXG А, адрес 16 | Обмен A с памятью |
— | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | — | EXG А,XL | Обмен A на X (меньшая половина) |
— | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | — | ЭКГВ X,Y | Обмен X на Y (16 бит) |
— | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | — | EXG А,YL | Обмен A на Y (меньшая половина) |
— | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | — | (сдержанный) | |
—/90 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | — | РЛВА X/Y | Поворот слова влево через A: 8-битный поворот влево из 24-битной конкатенации X/Y и A; (А:Х) := (Х:А) |
— | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | адрес16 | POP- адрес 16 | Вытащить из стека |
—/90 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | — | МУЛ X/Y,А | X/Y := XL/YL × A |
— | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | imm8 | SUBW SP,#imm | СП := СП − imm8 |
—/90 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | — | РАЗДЕЛ X/Y,А | Разделите X/Y на A; 16-битное частное в X/Y, остаток в A |
— | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | — | ПРЕФИКС | Префикс инструкции 72 : изменить следующий код операции |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | — | (сдержанный) | ||
— | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | imm8 адрес16 | MOV адрес16 , # imm8 | Немедленное перемещение в память (флаги не затрагиваются) |
— | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | адрес8 адрес8 | MOV адрес8 , адрес8 | Переместить память в память (флаги не затронуты) |
— | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | адрес16 адрес16 | MOV адрес16 , адрес16 | Переместить память в память (флаги не затронуты) |
— | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | — | РАЗДЕЛ X,Y | Разделить X на Y (16 бит); частное по X, остаток по Y |
0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | — | (сдержанный) | ||
0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | (сдержанный) | ||
— | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | адрес16 | НАЖМИТЕ адрес 16 | Поместить в стек |
— | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | imm8 | НАЖМИТЕ #imm8 | Поместить в стек |
— | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | imm8 | ADDW SP,#imm8 | СП := СП + imm8 |
— | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | адрес8 | ЛД ( адрес8 , СП),А | Хранить относительно стека |
— | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | адрес8 | LD A,( адрес8 ,SP) | Загрузка относительно стека |
— | 1 | 0 | 0 | код операции | — | Разные инструкции. Ни один неявно не устанавливает коды условий. | |||||
— | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — | Он пойдет | Возврат из прерывания (pop CC, A, X, Y, PC) |
— | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | ВЕРНО | Извлечь 16-битный обратный адрес из стека на ПК |
— | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | адрес24 | ИНТ. | Специальный переход для таблицы векторов прерываний |
— | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | — | ЛОВУШКА | Принудительное прерывание ловушки |
— | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | — | ПОП А | Вытащить A из стека |
—/90 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | — | ПОПВ X/Y | Извлечение X/Y из стека (16 бит) |
— | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | — | ПОП СС | Извлечь коды условий из стека |
— | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | — | РЕТФ | Извлечь 24-битный обратный адрес из стека на ПК |
— | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | — | НАЖМИТЕ А | Поместите A в стек |
—/90 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | — | НАЖМИТЕ X/Y | Поместить X/Y в стек (16 бит) |
— | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | — | НАЖМИТЕ СС | Поместить коды условий в стек |
— | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | ПЕРЕРЫВ | Остановить отладчик, если он присутствует, или NOP. |
— | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | — | CCF | Дополнить (переключить) флаг переноса |
— | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | адрес24 | CALLF адрес 24 | Нажмите 24-битный ПК; ПК := адрес24 |
92 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | адрес16 | CALLF [ адрес 16 ] | Косвенный дальний звонок; адрес имеет 24-битный указатель |
— | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | — | ОСТАНОВКА | Остановить процессор и часы |
— | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | ВФИ | Дождитесь прерывания, останавливая процессор, но не часы. |
72 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | ВФЕ | Дождитесь события (сопроцессора), нормально обрабатывая прерывания во время ожидания |
— | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | — | ПДИ | Префикс инструкции 90 : поменять местами X и Y в следующей инструкции |
— | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | — | Толстый | Префикс инструкции 91 : PDY плюс PIX |
— | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | — | ПИКС | Префикс инструкции 92 : использовать косвенную 8-битную память для операнда |
—/90 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | — | ЛДВ X/Y,Y/X | X/Y := Y/X |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | — | ЛДВ СП,X/Y | СП := X/Y |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | — | ЛД XH/YH,A | XH/YH := А |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | — | ЛДВ X/Y,СП | X/Y := СП |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | — | ЛД XL/YL,А | XL/YL := А |
— | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | — | РШФ | Сбросить (очистить) флаг переноса |
— | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | — | СКФ | Установить флаг переноса |
— | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | — | РИМ | Сбросить маску прерываний (включить прерывания) |
— | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | — | Сим | Установить маску прерываний (отключить прерывания) |
— | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | — | РВФ | Сбросить (очистить) флаг переполнения |
— | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | — | НЕТ | Нет операции |
—/90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | — | ЛД А,XH/YH | А := XH/YH |
—/90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | — | ЛД А,XL/YL | А := XL/YL |
Префикс | 1 | режим | код операции | операнд | Инструкции с двумя операндами A := Оп операнд | ||||||
— | 0 | 0 | 0 | 0 | код операции | адрес8 | ОП А, ( адрес8 , СП) | (коды операций 6, 7, C, D различаются; см. выше) | |||
— | 1 | 0 | 0 | код операции | (переназначено на разные инструкции; см. выше) | ||||||
— | 1 | 0 | 1 | 0 | код операции | imm8 | ОП А, # imm8 | 8-битный непосредственный операнд (запрещен как пункт назначения) | |||
— | 1 | 0 | 1 | 1 | код операции | адрес8 | ОП А, адрес 8 | 8-битный абсолютный адрес (запрещен для перехода/вызова) | |||
— | 1 | 1 | 0 | 0 | код операции | адрес16 | ОП А, адрес 16 | 16-битный абсолютный адрес | |||
72 | 1 | 1 | 0 | 0 | код операции | адрес16 | ОП А, [ адрес16 ] | 16-битный косвенный адрес | |||
92 | 1 | 1 | 0 | 0 | код операции | адрес8 | ОП А, [ адрес8 ] | 8-битный косвенный адрес 16-битного адреса | |||
—/90 | 1 | 1 | 0 | 1 | код операции | адрес16 | ОП А, ( адрес16 , X/Y) | Индексировано с 16-битным смещением | |||
72 | 1 | 1 | 0 | 1 | код операции | адрес16 | ОП А,([ адрес16 ],X) | 16-битный косвенный + X | |||
92/91 | 1 | 1 | 0 | 1 | код операции | адрес16 | ОП А,([ адрес8 ],X/Y) | 8-битный косвенный + X/Y | |||
—/90 | 1 | 1 | 1 | 0 | код операции | адрес8 | ОП А, ( адрес8 , X/Y) | Индексировано с 8-битным смещением | |||
—/90 | 1 | 1 | 1 | 1 | код операции | — | НА А,(X/Y) | Индексировано без смещения | |||
префикс | 1 | режим | 0 | 0 | 0 | 0 | операнд | СУБ А, операнд | А := А - операнд | ||
префикс | 1 | режим | 0 | 0 | 0 | 1 | операнд | CP A, операнд | Сравните A — операнд | ||
префикс | 1 | режим | 0 | 0 | 1 | 0 | операнд | SBC A, операнд | A := A − операнд − C вычитание с заимствованием | ||
префикс | 1 | режим | 0 | 0 | 1 | 1 | операнд | CPW X/Y, операнд | Сравнить X/Y — операнд (16 бит); сравнить Y/X, если режим операнда индексируется X/Y (коды операций D3, E3, F3) | ||
префикс | 1 | режим | 0 | 1 | 0 | 0 | операнд | И А, операнд | A := A & операнд, поразрядно и | ||
префикс | 1 | режим | 0 | 1 | 0 | 1 | операнд | BCP A, операнд | Побитовый тест A и операнд | ||
префикс | 1 | режим | 0 | 1 | 1 | 0 | операнд | LD A, операнд | А := операнд | ||
префикс | 1 | режим | 0 | 1 | 1 | 1 | операнд | LD операнд ,A | режим 2 | ||
префикс | 1 | режим | 1 | 0 | 0 | 0 | операнд | Исключающее ИЛИ А, операнд | A := A ^ операнд, исключающее-или | ||
префикс | 1 | режим | 1 | 0 | 0 | 1 | операнд | АЦП А, операнд | A := A + операнд + C, добавить с переносом | ||
префикс | 1 | режим | 1 | 0 | 1 | 0 | операнд | ИЛИ А, операнд | А := А | операнд, включающий или | ||
префикс | 1 | режим | 1 | 0 | 1 | 1 | операнд | ДОБАВИТЬ А, операнд | А := А + операнд | ||
префикс | 1 | режим | 1 | 1 | 0 | 0 | операнд | JP операнд | Младшие 16 бит PC := операнда, безусловный переход (режимы 2 | ||
префикс | 1 | режим | 1 | 1 | 0 | 1 | операнд | ВЫЗОВ операнда | Нажмите 16-битный ПК, младшие 16 бит ПК := операнд (переназначены режимы 2 | ||
префикс | 1 | режим | 1 | 1 | 1 | 0 | операнд | LDW X/Y, операнд | Загрузить X/Y := операнд; используйте 16 вместо 90 1E для LDW Y,( addr8 ,SP) | ||
префикс | 1 | режим | 1 | 1 | 1 | 1 | операнд | LDW Операнд , X/Y | Операнд := X/Y (16 бит, режим 2 | ||
Префикс | 1 | режим | код операции | операнд | Переназначены коды операций A7, AC, BC, AD, BD, AF из диапазона двух операндов. | ||||||
—/90 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | адрес24 | ЛДФ ( адрес24 ,X/Y),A | Загрузка далеко (= |
92/91 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | адрес16 | ЛДФ ([ адрес16 ],X/Y),A | 16-битный адрес 24-битного указателя |
— | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | адрес24 | JPF адрес 24 | ПК:= addr24 (= |
92 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | адрес16 | JPF [ адрес 16 ] | Непрямой прыжок вдаль; адрес имеет 24-битный указатель |
— | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес24 | ЛДФ А, адрес 24 | Загрузить далеко (= |
92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес16 | ЛДФ А,[ адрес16 ] | Загрузить дальний 16-битный адрес 24-битного указателя |
— | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | CALLR Метка | Нажмите 16-битный ПК, ПК := ПК + операнд (= |
— | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес24 | ЛДФ адрес 24 ,А | Операнд:= A (= |
92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес16 | ЛДФ [ адрес16 ],А | Операнд: = A, 16-битный адрес 24-битного указателя. |
—/90 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | адрес24 | ЛДФ А,( адрес24 ,X/Y) | Загрузить далеко (= |
92/91 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | адрес16 | ЛДФ A,([ адрес16 ],X/Y) | 16-битный адрес 24-битного указателя |
72 | 1 | режим | код операции | операнд | Арифметика индексного регистра (16 бит) X/Y := X/Y ± операнд | ||||||
72 | 1 | 0 | 1 | 0 | код операции | имм16 | OPW X/Y,# imm16 | 16-битный немедленный | |||
72 | 1 | 0 | 1 | 1 | код операции | адрес16 | OPW X/Y, адрес 16 | 16-битный абсолютный | |||
72 | 1 | 1 | 1 | 1 | код операции | адрес8 | OPW X/Y, ( адрес8 , SP) | относительно стека | |||
72 | 1 | режим | 0 | 0 | 0 | 0 | операнд | SUBW X, операнд | X := X − операнд (предпочитайте код операции 1D для SUBW X,# imm16 ) | ||
72 | 1 | режим | 0 | 0 | 1 | 0 | операнд | SUBW Y, операнд | Y := Y - операнд | ||
72 | 1 | режим | 1 | 0 | 0 | 1 | операнд | ADDW Y, операнд | Y := Y + операнд | ||
72 | 1 | режим | 1 | 0 | 1 | 1 | операнд | ADDW X, операнд | X := X + операнд (предпочтительно использовать код операции 1C для ADDW X,# imm16 ) |
Для инструкций CPW и LDW, где режим адресации операнда индексируется X, STM8 по умолчанию использует регистр Y вместо X. Применение 90
префикс меняет местами X и Y, поэтому регистр равен X, а режим адресации индексируется Y.
Ссылки
[ редактировать ]- ^ Карлсон, Джей (15 сентября 2017 г.). «СТ СТМ8» . Проверено 12 июня 2018 г.
- ^ Перейти обратно: а б с «PM0044: Руководство по программированию процессора STM8» (PDF) . СТМикроэлектроника. Сентябрь 2011 г. Документ 13590 Ред. 3 . Проверено 10 июня 2018 г.
- ^ «COS-C-COMPILER — бесплатный компилятор C для всех STM8 от Cosmic» (пресс-релиз). СТМикроэлектроника . Проверено 24 марта 2016 г.
- ^ «STM8 eForth — удобный для пользователя Forth для простых микросхем с документацией» . Гитхаб . 18 ноября 2022 г.