NFLic

STM8 с нуля.

Адресное простанство и регистры STM8 (Статья 2)

Регистры - некие ячейки памяти, являющиеся частью ядра STM8, не имеющие адресов и имеющие специфичный для каждого регистра функционал. Содержимое регистров не сохраняется при исчезновении питания.

Самый часто используемый регистр - аккумулятор. 8-разрядный регистр общего пользования используемый как операнд и как приемник результата в арифметических и логических операциях (командах), командах пересылки данных со сложной адресацией, командах сравнения. Вообщем почти везде где нужно оперировать 8-разрядными данными.

Начальное (после сброса) содержимое регистра $00.

;     --- --- --- --- --- --- --- ---
;    | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |  A ACCUMULATOR
;     --- --- --- --- --- --- --- ---

 

16-разрядные индексные регистры X и Y. Основное назначение - участвуют в командах с косвенной адресацией. В индексных регисрах X и Y хранится адрес операнда участвующего в команде, а не сам операнд. Регистры X и Y выполняют также функцию аккумулятора в командах с манипуляцией 16-разрядными данными.

8-разрядные "половинки" регистров X и Y, соответственно XH, XL, YH, YL, участвуют в командах обмена данными с аккумулятором A (в том числе и циклического) и внутри самих регистров X, Y.

Команды с регистром Y имеют префикс [72] (prefix PWSP) и поэтому на 1-байт длиньше по сравнению с аналогичными командами с регистром X.

Начальное (после сброса) содержимое регистров $0000.

;      15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
;    |               XH              |               YL              |  X INDEX
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
;
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
;    |               YH              |               YL              |  Y INDEX
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

 

16-разрядный регист - указатель стека SP. Стек (stack кипа) - область старших адресов оперативной памяти RAM, которая дополнительно к обычной адресации с помощью специальных команд имеет доступ по принципу стопки бумаг - последним положил первым забрал. Регист указателя стека SP всегда хранит адрес первой не занятой стопкой ячейки для бумаги (так называемой вершины стека). Стек имеет ограниченную глубину (напр. STM8S103F3 имеет глубину 513 байт если указатель стека SP инициализировать величиной $03FF) и заполняется от старших адресов к младшим. Переполнение стека никак не контролирутся микроконтроллером и может привести к потере данных если этих данных будет напихано в стек более чем его глубина.

В STM8S103F3 при сбросе указатель стека SP аппартно инициализируется величиной $03FF (RAM END).

Стек используется для хранения адресов возврата из подпрограмм и из программ обработки прерываний, для сохранения содержимого описанных в этой статье регистов на время обработки прерывани с восстановлением содержимого при выходе из программы обработки прерывания. может испльзоваться для передачи переменных подпрограмме (процедуре), для организации буфера данных и пр.

Начальное (после сброса) содержимое регистра $03FF.

;      15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
;    |              SPH              |              SPL              |  SP STACK POINTER
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

 

24-разрядный регист - счетчик команд PC. Счетчик команд PC всегда содержит адрес следующей к выполнению команды. При сбросе STM8 счетчик команд PC загружается величиной $008000 (FLASH START). В STM8 имеющих встроенный загрузчик при сбросе счетчик команд PC может загружаться величиной $006000 (BOOT START).

Начальное (после сброса) содержимое регистра $008000.

;      23  22  21  20  19  18  17  16  15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
;    |              PCE              |              PCH              |              PCL              |  PC PROGRAM COUNTER
;     --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

 

8-разрядный регист состояния CC. Содержит флаги-признаки результата выполненной команды. Флаги могут быть использованы в арифметических командах, командах условных переходов. Команды воздействуют только на свои флаги и не меняют состояние признаков на которые команды не воздействуют. Например команда "TNZ A" изменит состояние флагов Т и Z и не повлияет на состояние других флагов (в том числе и резервного бита #6). Для записи (чтения) регитра CC можно использовать цепочку из команд "push A; pop CC" ("push CC; pop A").

Начальное (после сброса) содержимое регистра $28 (%00101000) означает, что прерывания запрещены.

;       7    6    5    4    3    2    1    0
;     ---- ---- ---- ---- ---- ---- ---- ---- 
;    |  V |  - | I1 |  H | I0 |  N |  Z |  C |  CC CODE CONDITION
;     ---- ---- ---- ---- ---- ---- ---- ---- 

V - признак знакового переполнения. Устанавливается в "1" если результат больше плюс 127 (32767) или мньше минус 128 (32768), иначе сбрасывается в "0".

Флаг V может быть сброшен в "0" командой RVF.

    - резервный бит #6 имеет физическое воплощение, т.е может быть установлен (сброшен), но ни на что не влияет.

I1, I0 - признаки уровня (приоритета) прерывания:

  1   1 - прерывание запрещено. Начальное после сброса состояние. (высший приоритет)

  0   0 - прерывание имеет уровень 2

  0   1 - прерывание имеет уровень 1

  1   0 - прерывание имеет обычный уровень (низший приоритет)

Признаки I1, I0 могут быть программно установлены либо сброшены командами RIM, SIM, HALT, WFI, IRET, TRAP и POP. На время программы обработки прерывания признаки I1, I0 содержат уровень(приоритет) текущего прерывания из соответствующего вектора в соответствующем регистре ITC_SPR ($7F70...$7F7F). После сброса регистры ITC_SPR содержат $FF (прерывания запрещены по всем векторам).

H - признак полупереноса. Устанавливается в "1" если был перенос из 3(7)-го разряда 8(16)-разрядного результата или заем в 3(7)-й разряд 8(16)-разрядного результата, иначе сбрасывается в "0".

N - признак отрицательного результата. Устанавливается в "1" если устанавливается старший бит результата, иначе сбрасывается в "0".

Z - признак нулевого результата. Устанавливается в "1" если результат равен нулю, иначе сбрасывается в "0".

С - признак переноса/заема (беззнакоавое переполнение). Устанавливается в "1" если был перенос из старшего разряда результата или заем в старший разряд результата, иначе сбрасывается в "0".

В командах DIV, DIVW станавливается в "1" при делении на ноль, иначе сбрасывается в "0".

Флаг C может быть напрямую установлен в "1", сброшен в "0", инвертирован, скопирован командами SCF, RCF CCF, BCCM lmem, #n.

Флаг C участвует в командах сдвига SLA, SLAW, SLL, SLLW, SRA, SRAW, SRL, SRLW, RLC, RLCW, RRC, RRCW.

Флаг C принимает значение проверяемого бита в командах BTJF lmem, #n, ssoff и BTJT lmem, #n, ssoff.

Адресное простанство

Вся память в STM8 находится в едином адресном пространстве $000000...$FFFFFF.

Память в STM8 делится на 256 секций (Section) по 65536 байт, каждая секция делится на 256 страниц (Page) по 256 байт. Соответственну существует короткая адресация (short memory) в пределах страницы, длинная адресация (long memory) в пределах секции и расширенная адресация (extended memory) в пределах всего адресного пространства STM8 (команды JPF, CALLF, RETF, LDF).

 

Все доступное адресное пространство $0000...$9FFF в STM8S103F3 умещается в секции 0 :

$0000...$03FF - память RAM - оперативная память. Из этой области могут выполняться команды. Память пишется и читается произвольно без задержек. Содержимое памяти не сохраняется при выключении/включении питания. Сброс микроконтроллера не связанный с питанием не влияет на содержимое памяти.

$01FF...$03FF - область памяти RAM в которой дополнительно может быть организован стек.

$4000...$427F - память EEPROM - энергонезависимая память данных с большим ресурсом циклов записи/стирания (до ~300000). Из этой области не могут выполняться команды. Запись в EEPROM требует разблокирования после каждого сброса STM8 последовательной записью значений $AE и $56 в регистр FLASH_DUKR ($5064). На запись/стирание байта, слова(4 байта) или блока(64 байта) требуется время порядка единиц миллисекунд. У некоторых моделей (в том числе у STM8S103F3) на время/записи стирания останавливается выполнение команд.

$4800...$483F - OPTION Registers - энергонезависимые конфигурационные данные: защита от чтения, размер области для загрузчика, настройки сторожевого таймера, настройки времени для стабилизации частоты тактового генератора, переопределение альтернативных функций портов ввода/вывода. Содержимое этой области сохраняется при пропадании питания. Запись в эту область требует разблокирования. В резервных ячейках этой области мы храним образ кода начального загрузчика и для версии $25 адрес передачи управления прикладной программе.

$4865...$4870 - Unique ID - доступная только для чтения область памяти содержащая информацию уникальную для любого экземпляра STM8;

$5000...$540F - HW Registers - регистры ввода/вывода. Содержимое не сохраняется при выключении/включении питания. Сброс микроконтроллера инициализирует содержимое начальными значениями. Через эту область происходит управление и ощение с аппаратной периферией STM8.

$7F60...$7F60 - Global configuration register и Interrupt Software priority registers

$8000...$9FFF - память FLASH - энергонезависимая память программ со средним ресурсом циклов записи/стирания (до ~10000). Из этой области могут выполняться команды и храниться данные. Содержимое памяти сохраняется при пропадании питания. Запись во FLASH требует разблокирования после каждого сброса STM8 последовательной записью значений $56 и $AE в регистр FLASH_PUKR ($5062).

$8000...$807F - область памяти FLASH содержащая таблицу векторов прерывания. Может также использоваться для обычных команд и данных. На запись/стирание байта, слова(4 байта) или блока(64 байта) требуется время порядка единиц миллисекунд. Команды записи/стирания должны выполняться из памяти RAM. На время/записи стирания останавливается выполнение команд

 

Машинные коды STM8 и команды ассемблера здесь. Адресное пространство STM8S103F3 тут.

 

[Инструменты. Первая программа (Статья 1][Оглавление.] [UART (Статья 3)]