STM8 - STM8

В STM8 является 8 бит микроконтроллер семья STMicroelectronics. В микроконтроллерах STM8 используется расширенный вариант ST7 архитектура микроконтроллера. Микроконтроллеры STM8 особенно дешевы для полнофункционального 8-битного микроконтроллера.[1]

Архитектура

STM8 очень похож на более ранний ST7, но лучше подходит в качестве мишени для C из-за его 16-битных индексных регистров и указатель стека -режим относительной адресации. Хотя внутри Гарвардская архитектура он имеет унифицированное 24-битное адресное пространство, что позволяет коду выполняться вне ОЗУ (полезно для внутрисистемное программирование из прошить ROM ) и данные (например, таблицы поиска ) для доступа из ПЗУ. Доступ к данным выше 64 КБ ограничен специальными инструкциями «загрузить дальше»; операнды памяти большинства операций могут обращаться максимум к 128 КБ (16-битный базовый адрес плюс 16-битное смещение).

Очень немногие микроконтроллеры STM8 имеют более 64 КБ памяти данных.

Он имеет те же шесть регистров (A, X, Y, SP, PC, CC), что и ST7, но индексные регистры X и Y были расширены до 16 бит, а счетчик команд был расширен до 24 бит. В аккумулятор A и указатель стека остаются 8 и 16 битами соответственно.[2]

В регистр кода состояния имеет еще два определенных бита, всего семь. Существует флаг переполнения, и второй бит разрешения прерывания, позволяющий четыре уровни приоритета прерывания.

Подсемейства

  • Автомобиль СТМ8АФ
  • СТМ8АЛ автомобильный маломощный
  • STM8L маломощный
  • STM8S по выгодной цене
  • STM8T с сенсорным управлением
  • Управление освещением STLUX
  • STNRG Широтно-импульсная модуляция -контроллеры

Поддержка компилятора

STM8 поддерживается бесплатным Компилятор C для малых устройств, бесплатный компилятор Cosmic C с закрытым кодом,[3] и несвободные IAR Компиляторы C и Raisonance. Помимо C существует STM8 eForth, порт с открытым исходным кодом для языка программирования Forth.

Изменения по сравнению с 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 Пр., 91 6x, и 91 пр.) были удалены; все режимы косвенной адресации выбирают 16-битные адреса. Новый префиксный байт 72 был добавлен и использовался для косвенного кодирования, начиная с 16-битного адреса.

Инструкции по манипулированию битами были изменены, чтобы принимать 16-битный адрес и требовать 72 префиксный байт. Коды операций без префикса 0x и 1x они раньше заняты, вместо этого используются для относительной адресации указателя стека.

Для некоторых редко используемых инструкций ветвления были изменены коды операций, чтобы требовать 90 префикс, а коды операций без префикса переназначены для подписанных ветвей, которые зависят от флага V.

Инструкции загрузки и сравнения, нацеленные на регистр X, мало используются на ST7 с режимами адресации, индексируемыми регистром X. На STM8, когда такие операции определяют операнд памяти, индексированный регистром X, операнд регистра изменяется на Y. 90 префикса, регистры меняются местами, так что индексный регистр - Y, а регистр операнда - X.

Одно из основных различий в производительности заключается в том, что STM8 выбирает 32 бита из ПЗУ за цикл, а для типичных инструкций требуется один цикл плюс один цикл на каждый доступ к ОЗУ. ST7, напротив, выбирает 8 бит за цикл и берет один цикл на байт инструкции.

Набор инструкций

Инструкции STM8 состоят из необязательного префиксного байта (7216, 9016, 9116, или же 9216), байт кода операции и несколько (до четырех, но редко более двух) байтов операндов. Байты префикса в основном изменяют режим адресации, используемый для указания операнда памяти, но в некоторых случаях префиксы 72 и 90 выполнить совершенно другую операцию.

Префикс 90 меняет местами X и Y в следующей инструкции. В таблице ниже эти варианты объединены в одну строку путем записи «X / Y», что означает «X» или «Y». Префикс 90 также используется в двух местах для введения новых кодов операций: инструкций BCPL и BCCM и некоторых условий перехода.

Префикс 92 преобразует инструкции с операндом смещения (адрес16, X) на косвенную адресацию ([адрес 8],ИКС). Смещение заменяется 8-битным адресом 16-битного значения смещения в памяти. Он используется только для этой функции.

Префикс 91 имеет оба предыдущих эффекта, преобразовывая (адрес16, X) режимы адресации на ([адрес 8], Y).

Префикс 72 используется в ряде мест гораздо менее регулярно. В некоторых случаях он вводит новые режимы адресации (в частности, ([адрес16], X) 16-битный непрямой режим), но он также вводит много совершенно новых операций.

Набор инструкций STM8[2]
Префикс76543210ОперандыМнемоническийОписание
0000код операцииадрес 8OP (адрес 8, ИП)Инструкции с одним операндом (см. Ниже)
0001код операцииадрес 8ОП А, (адрес 8, ИП)Двухоперандные инструкции со стековым операндом
00010000адрес 8SUB A, (адрес 8, ИП)A: = A - операнд
00010001адрес 8CP A, (адрес 8, ИП)Сравнить A - операнд
00010010адрес 8SBC A, (адрес 8, ИП)A: = A - операнд - C вычесть с заимствованием
—/9000010011адрес 8CPW X / Y, (адрес 8, ИП)Сравнить X / Y - операнд (16 бит)
00010100адрес 8И А, (адрес 8, ИП)A: = A & операнд, побитовое и
00010101адрес 8BCP A, (адрес 8, ИП)Побитовый тест A и операнд
00010110адрес 8LDW Y, (адрес 8, ИП)Y: = операнд (LD A, (адрес 8, ИП) назначен коду операции 7B)
00010111адрес 8LDW (адрес 8,ШПИОНОперанд: = Y (LD (адрес 8,СПА назначен коду операции 6B)
00011000адрес 8XOR A, (адрес 8, ИП)A: = A ^ операнд, исключающее ИЛИ
00011001адрес 8АЦП А, (адрес 8, ИП)A: = A + операнд + C, сложить с переносом
00011010адрес 8ИЛИ A, (адрес 8, ИП)A: = A | операнд, включительно или
00011011адрес 8ДОБАВИТЬ,(адрес 8, ИП)A: = A + операнд
00011100imm16ДОБАВИТЬ X, # imm16X: = X + немедленно (=JP (адрес 8, ИП))
00011101imm16SUBW X, # imm16X: = X - немедленно (=ВЫЗОВ (адрес 8, ИП))
00011110адрес 8LDW X, (адрес 8, ИП)X: = операнд
00011111адрес 8LDW (адрес 8, SP), XОперанд: = X
72/90000cкусочекvоперандыБитовые операции
720000кусочек0адрес16 soff8BTJTадрес16,#кусочек,меткаПерейти к ПК + soff8, если исходный бит истинен (установлен)
720000кусочек1адрес16 soff8BTJFадрес16,#кусочек,меткаПерейти к ПК + soff8, если исходный бит ложный (очистить)
720001кусочек0адрес16BSET адрес16,#кусочекУстановить указанный бит в 1
720001кусочек1адрес16BRES адрес16,#кусочекСбросить (сбросить) указанный бит на 0
900001кусочек0адрес16BCPL адрес16,#кусочекДополнить (переключить) выбранный бит
900001кусочек1адрес16BCCM адрес16,#кусочекЗапись флага переноса в бит памяти
—/900010условиеsoff8Условные переходы (8-битное смещение со знаком)
00100000soff8JRA меткаВсегда переходить (истина)
00100001soff8JRF меткаВетвь никогда (ложь)
00100010soff8JRUGT меткаПерейти, если без знака больше, чем (C = 0 и Z = 0)
00100011soff8JRULE меткаПереход, если без знака меньше или равно (C = 1 или Z = 1)
00100100soff8JRNC меткаПереход, если нет переноса (C = 0)
00100101soff8JRC меткаПереход при переносе (C = 1)
00100110soff8JRNE меткаПерейти, если не равно (Z = 0)
00100111soff8JREQ меткаПерейти, если равно (Z = 1)
00101000soff8JRNV меткаПерейти, если не переполнение (V = 0)
9000101000soff8JRNH меткаВетвь, если не полуперенос (H = 0)
00101001soff8JRV меткаПереход при переполнении (V = 1)
9000101001soff8JRH меткаРазветвляется, если переносится частично (H = 1)
00101010soff8JRPL меткаПерейти, если плюс (N = 0)
00101011soff8JRMI меткаПереход, если минус (N = 1)
00101100soff8JRSGT меткаПереходить, если знак больше (S = 0 и N = V)
9000101100soff8JRNM меткаПерейти, если нет маски прерывания (I = 0)
00101101soff8JRSLE меткаПереход, если знак меньше или равен (S = 1 или N ≠ V)
9000101101soff8JRM меткаПереход, если прерывания замаскированы (I = 1)
00101110soff8JRSGE меткаПереход, если знак больше или равен (N = V)
9000101110soff8JRIL меткаПереход, если линия прерывания низкая
00101111soff8JRSLT меткаПереходить, если подписано меньше (N ≠ V)
9000101111soff8JRIH меткаПереход, если линия прерывания высока
префикс0Режимкод операцииоперандИнструкции с одним операндом
0000код операцииадрес 8OP (адрес 8, ИП)Относительный указатель стека
0011код операцииадрес 8OP адрес 88-битный абсолютный адрес
720011код операцииадрес16OP [адрес16]16-битный косвенный адрес
920011код операцииадрес 8OP [адрес 8]8-битный косвенный адрес 16-битного адреса
0100код операцииOP AАккумулятор
72/900100код операцииадрес16OP (адрес16, X / Y)Индексируется с 16-битным смещением
—/900101код операцииOPW X / YРегистр X / Y (16-битная операция)
720101код операцииадрес16OP addr1616-битный адрес
—/900110код операцииадрес 8OP (адрес 8, X / Y)8-битный адрес плюс X / Y
720110код операцииадрес16OP ([адрес16],ИКС)16-битный косвенный адрес плюс X
92/910110код операцииадрес 8OP ([адрес 8], X / Y)8-битный косвенный адрес плюс X / Y
—/900111код операцииOP (X / Y)Проиндексировано без смещения
префикс0Режим0000операндNEG операндОтрицание с дополнением до двух
0Режим0001(переназначен для обменных операций; см. следующий раздел)
0Режим0010(переназначен для других операций; см. следующий раздел)
префикс0Режим0011операндCPL операндДополнение, логическое не
префикс0Режим0100операндSRL операндСдвиг вправо логический, msbit очищен, lsbit для переноса: (операнд: C): = (0: операнд)
0Режим0101(переназначен для других операций; см. следующий раздел)
префикс0Режим0110операндRRC операндПовернуть вправо через перенос, (операнд: C): = (C: операнд)
префикс0Режим0111операндSRA операндСдвиг вправо арифметика, msbit сохраняется, lsbit для переноса
префикс0Режим1000операндSLL операндСдвиг влево, msbit для переноса: (C: операнд): = (операнд: 0)
префикс0Режим1001операндRLC операндПовернуть влево через перенос, (C: операнд): = (операнд, C)
префикс0Режим1010операндDEC операндДекремент; N и Z установлены, переносить без изменений
0Режим1011(переназначен для других операций; см. следующий раздел)
префикс0Режим1100операндINC операндПриращение; N и Z установлены, переносить без изменений
префикс0Режим1101операндTNZ операндТест ненулевой: установите N и Z на основе значения операнда
префикс0Режим1110операндЗАМЕНА операндПоменять местами половины операнда (4-битный поворот; 8-битный для SWAPW X и SWAPW Y)
префикс0Режим1111операндCLR операндУстановить операнд на 0, N очищено, Z установлено
префикс0Режимкод операцииоперандПереназначены оподы [03-7] [125B] из диапазона с одним операндом
—/9000000001RRWA X / YПовернуть слово вправо через A: 8-битный поворот вправо 24-битной конкатенации X / Y и A; (X: A): = (A: X)
00110001адрес16EXG A,адрес16Обменять A с памятью
01000001EXG A, XLОбменять A на X (нижняя половина)
01010001EXGW X, YЗаменить X на Y (16 бит)
01100001EXG A, YLОбменять A на Y (нижняя половина)
01110001(зарезервированный)
—/9000000010RLWA X / YПовернуть слово влево через A: 8-битный поворот влево 24-битной конкатенации X / Y и A; (А: Х): = (Х: А)
00110010адрес16Поп адрес16Вытащить из стопки
—/9001000010MUL X / Y, АX / Y: = XL / YL × А
01010010imm8SUBW SP, # immSP: = SP - imm8
—/9001100010DIV X / Y, AРазделите X / Y на A; 16-битное частное по X / Y, остаток по A
01110010ПРЕФИКСПрефикс инструкции 72: изменить следующий код операции
00000101(зарезервированный)
00110101imm8 адрес16MOV адрес16,#imm8Немедленно переместить в память (флажки не изменяются)
01000101адрес8 адрес8MOV адрес 8,адрес 8Переместить память в память (флаги не изменяются)
01010101адрес16 адрес16MOV адрес16,адрес16Переместить память в память (флаги не изменяются)
01100101DIVW X, YРазделите X на Y (16 бит); частное по X, остаток по Y
01110101(зарезервированный)
00001011(зарезервированный)
00111011адрес16ТОЛКАТЬ адрес16Вставить в стек
01001011imm8НАЖАТЬ # imm8Вставить в стек
01011011imm8ДОБАВИТЬ SP, # imm8SP: = SP + imm8
01101011адрес 8LD (адрес 8,СПАХранить относительно стека
01111011адрес 8LD A, (адрес 8, ИП)Загрузить относительно стека
100код операцииРазные инструкции. Ни один из них не устанавливает коды условий неявно.
10000000IRETВозврат из прерывания (pop CC, A, X, Y, PC)
10000001RETИзвлечь 16-битный адрес возврата из стека на ПК
10000010адрес24INTСпециальный переход для таблицы векторов прерываний
10000011ЛОВУШКАПрерывание с прерыванием
10000100POP AИзвлечь из стека
—/9010000101POPW X / YИзвлечь X / Y из стека (16 бит)
10000110POP CCИзвлечь коды условий из стека
10000111RETFИзвлечь 24-битный адрес возврата из стека в ПК
10001000НАЖАТЬ АПоместить A в стек
—/9010001001PUSHW X / YВставить X / Y в стек (16 бит)
10001010НАЖАТЬ CCПомещать коды условий в стек
10001011ПЕРЕМЕНАОстановить для отладчика, если он есть, или NOP
10001100CCFДополнение (переключение) флаг переноса
10001101адрес24CALLF адрес24Нажать 24-битный ПК; ПК: = адрес24
9210001101адрес16CALLF [адрес16]Косвенный дальний вызов; адрес 24-битный указатель
10001110HALTОстановить процессор и часы
10001111WFIДождитесь прерывания, останавливая процессор, но не часы
7210001111WFEОжидание события (сопроцессор), обработка прерываний во время ожидания
10010000PDYПрефикс инструкции 90: поменять местами X и Y в следующей инструкции
10010001PIYПрефикс инструкции 91: PDY плюс PIX
10010010PIXПрефикс инструкции 92: использовать 8-битную косвенную память для операнда
—/9010010011LDW X / Y, Y / XX / Y: = Y / X
—/9010010100LDW SP, X / YSP: = X / Y
—/9010010101LD XH / YH, АXH / YH: = А
—/9010010110LDW X / Y, SPX / Y: = SP
—/9010010111LD XL / YL, АXL / YL: = А
10011000RCFСбросить (сбросить) флаг переноса
10011001SCFУстановить флаг переноса
10011010RIMСбросить маску прерывания (разрешить прерывания)
10011011SIMУстановить маску прерывания (отключить прерывания)
10011100RVFСбросить (сбросить) флаг переполнения
10011101NOPНет операции
—/9010011110LD A, XH / YHА: = XH / YH
—/9010011111LD A, XL / YLА: = XL / YL
Префикс1Режимкод операцииоперандИнструкции с двумя операндами A: = операнд операции
0001код операцииадрес 8OP (адрес 8, ИП)Операнд относительно стека (см. Выше; коды операций 16, 17, 1C, 1D не соответствуют шаблону)
1010код операцииimm8OP #imm88-битный непосредственный операнд (запрещено как пункт назначения)
1011код операцииадрес 8OP адрес 88-битный абсолютный адрес (запрещено прыгать / звонить)
1100код операцииадрес16OP адрес1616-битный абсолютный адрес
721100код операцииадрес16OP [адрес16]16-битный косвенный адрес
921100код операцииадрес 8OP [адрес 8]8-битный косвенный адрес 16-битного адреса
—/901101код операцииадрес16OP (адрес16, X / Y)Индексируется с 16-битным смещением
721101код операцииадрес16OP ([адрес16],ИКС)16-битный косвенный + X
92/911101код операцииадрес16OP ([адрес 8], X / Y)8-битный косвенный + X / Y
—/901110код операцииадрес 8OP (адрес 8, X / Y)Индексируется с 8-битным смещением
—/901111код операцииOP (X / Y)Проиндексировано без смещения
префикс1Режим0000операндSUB A,операндA: = A - операнд
префикс1Режим0001операндCP A,операндСравнить A - операнд
префикс1Режим0010операндSBC A,операндA: = A - операнд - C вычесть с заимствованием
префикс1Режим0011операндCPW X / Y,операндСравнить X / Y - операнд (16 бит); сравнить Y / X, если режим операнда проиндексирован X / Y (коды операций D3, E3, F3)
префикс1Режим0100операндИ А,операндA: = A & операнд, побитовое и
префикс1Режим0101операндBCP A,операндПобитовый тест A и операнд
префикс1Режим0110операндLD A,операндA: = операнд
префикс1Режим0111операндLD операнд, АОперанд: = A (режим 2 LD # imm8, A переназначен, см. ниже)
префикс1Режим1000операндXOR A,операндA: = A ^ операнд, исключающее ИЛИ
префикс1Режим1001операндАЦП А,операндA: = A + операнд + C, сложить с переносом
префикс1Режим1010операндИЛИ А,операндA: = A | операнд, включительно или
префикс1Режим1011операндДОБАВИТЬ,операндA: = A + операнд
префикс1Режим1100операндJP операндМладшие 16 бит ПК: = операнд, безусловный переход (режимы 2 JP # imm8 и 3 JP адрес 8 переназначен, см. ниже)
префикс1Режим1101операндВЫЗОВ операндНажмите 16-битный ПК, младшие 16 бит ПК: = операнд (режимы 2 ЗВОНИТЕ # imm8 и 3 ЗВОНИТЕ по адресу 8 переназначен, см. ниже)
префикс1Режим1110операндLDW X / Y,операндЗагрузить X / Y: = операнд; используйте 16 вместо 90 1E для LDW Y, (адрес 8, ИП)
префикс1Режим1111операндLDW операнд, X / YОперанд: = X / Y (16 бит, режим 2 LD # imm8, X переназначен, см. ниже); сохранить Y / X, если режим операнда проиндексирован X / Y (коды операций DF, EF, FF); используйте 17 вместо 90 1F для LDW (адрес 8,ШПИОН
Префикс1Режимкод операцииоперандПереназначенные коды операций A7, AC, BC, AD, BD, AF из диапазона с двумя операндами
—/9010100111адрес24ЛДФ (адрес24, X / Y), АЗагрузить далеко (=LD # imm8, A)
92/9110100111адрес16LDF ([адрес16], X / Y), A16-битный адрес 24-битного указателя
10101100адрес24JPF адрес24ПК: = адрес24 (=JP # imm8)
9210101100адрес16JPF [адрес16]Косвенный дальний прыжок; адрес 24-битный указатель
10111100адрес24ЛДФ А,адрес24Загрузить далеко (=JP адрес 8)
9210111100адрес16LDF A, [адрес16]Загрузить дальний, 16-битный адрес 24-битного указателя
10101101soff8CALLR меткаНажмите 16-битный ПК, ПК: = ПК + операнд (=ЗВОНИТЕ # imm8)
10111101адрес24LDF адрес24, АОперанд: = A (=ЗВОНИТЕ по адресу 8)
9210111101адрес16LDF [адрес16], АОперанд: = A, 16-битный адрес 24-битного указателя
—/9010101111адрес24ЛДФ А, (адрес24, X / Y)Загрузить далеко (=LDW # imm8, X)
92/9110101111адрес16LDF A, ([адрес16], X / Y)16-битный адрес 24-битного указателя
721Режимкод операцииоперандАрифметические операции с индексным регистром (16 бит) X / Y: = X / Y ± операнд
721010код операцииimm16OPW X / Y, #imm1616-битный немедленный
721011код операцииадрес16OPW X / Y,адрес1616-битный абсолютный
721111код операцииадрес 8OPW X / Y, (адрес 8, ИП)Относительный стек
721Режим0000операндSUBW X,операндX: = X - операнд (предпочтительно код операции 1D для SUBW X, #imm16)
721Режим0010операндSUBW Y,операндY: = Y - операнд
721Режим1001операндДОБАВИТЬ Y,операндY: = Y + операнд
721Режим1011операндДОБАВИТЬ X,операндX: = X + операнд (предпочитайте код операции 1C для ADDW X, #imm16)

Для инструкций CPW и LDW, в которых режим адресации операндов индексируется X, STM8 по умолчанию использует регистр Y вместо X. Применение 90 префикс меняет местами X и Y, поэтому регистр - X, а режим адресации индексируется Y.

Рекомендации

  1. ^ Карлсон, Джей (15 сентября 2017 г.). «СТ СТМ8». Получено 2018-06-12.
  2. ^ а б "PM0044: Руководство по программированию процессора STM8" (PDF). STMicroelectronics. Сентябрь 2011 г. Документ 13590 Ред. 3. Получено 2018-06-10.
  3. ^ "COS-C-COMPILER - Бесплатный компилятор C для всех STM8 от Cosmic" (Пресс-релиз). STMicroelectronics. Получено 24 марта 2016.

внешняя ссылка