Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование микроконтроллеров семейства CORTEX-M. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
41
ОП
LDSB Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
-
Загрузка байта знаком в регистр из ОП
LDR Rt, [Rn, Imm5]
Rt:= M[Rn+4xImm8]
-
Загрузка в регистр слова из ОП
LDRH Rt, [Rn, Imm5]
Rt:= M[Rn+2xImm8]
-
Загрузка в регистр полуслова из ОП
LDRB Rt, [Rn, Imm5]
Rt:= M[Rn+Imm8]
-
Загрузка в регистр байта из ОП
STR Rt, [Rn, Imm5]
M[Rn+4xImm8]:=Rt
-
Сохранение слова в ОП из регистра
STRH Rt, [Rn, Imm5]
M[Rn+2xImm8]:=Rt
-
Сохранение полуслова из регистра в ОП
STRB Rt, [Rn, Imm5]
M[Rn+Imm8]:=Rt
-
Сохранение байта из регистра в ОП
POP {reglist}
registers := M [SP]
-
Загрузка множества регистров из стека
POP {reglist, PC}
registers, PC := M [SP]
-
Загрузка множества регистров и PC из сте­ка
PUSH {reglist}
M [SP] := registers
-
Сохранение множества регистров в стеке
PUSH {reglist, LR}
M [SP] := registers, LR
-
Сохранение множества регистров и регит­стра LR в стеке
Арифметические команды
Мнемокод
Операции
Признаки
Описание
ADDS Rd, Rn, Rm
Rd:=Rn+Rm
N,Z,C,V
Сложение регистров
SUBS Rd, Rn, Rm
Rd:=Rn-Rm
N,Z,C,V
Вычитание регистров
ADDS Rd, Rn, Imm3
Rd:=Rn+Imm3
N,Z,C,V
Сложение регистра с константой
SUBS Rd, Rn, Imm3
Rd:=Rn-Imm3
N,Z,C,V
Вычитание константы из регистра
ADDS Rdn, Imm8
Rdn:=Rdn+Imm8
N,Z,C,V
Сложение регистра с константой
SUBS Rdn, Imm8
Rdn:=Rdn-Imm8
N,Z,C,V
Вычитание константы из регистра
ADCS Rdn, Rm
Rdn=Rdn+Rm+C
N,Z,C,V
Сложение регистров с переносом
SBCS Rdn, Rm
Rdn:=Rdn-Rm-C
N,Z,C,V
Вычитание регистров с переносом
RSBS Rd, Rn, #0
Rd:= #0-Rn
N,Z,C,V
Обратное вычитание регистров
ADR Rd, PC, Imm8
Rd:=PC+4xImm8
-
Сложение программного счетчика с кон­стантой
ADD Rd, SP, Imm8
Rd:=SP+4xImm8
N,Z,C,V
Сложение указателя стека с константой
ADD SP, SP, Imm7
SP:=SP+4xImm7
N,Z,C,V
Сложение указателя стека с константой
ADD SP, SP, - Imm7
SP:=SP-4xImm7
N,Z,C,V
Вычитание константы из указателя стека
ADD Rdn, Rm
Rdn:=Rdn+Rm
N,Z,C,V
Сложение регистров
MULS Rdm, Rn, Rdm
Rdm:=Rdm x Rn
N,Z,C,V
Умножение регистров
CMP Rn, #imm8
Rd - Imm8
N,Z,C,V
Сравнение регистра с константой
CMP Rn, Rm
Rn - Rm
N,Z,C,V
Сравнение регистров
CMN Rn, Rm
Rn + Rm
N,Z,C,V
Сравнение регистров с противоположным знаком
CMP Rn, Rm
Rn - Rm
N,Z,C,V
Сравнение регистров
Обмены с регистрами
42
Мнемокод
Операции
Признаки
Описание
MOVS Rd:, Imm8
Rd:=Imm8
N,Z,C
Загрузка константы 8 бит в регистр
MOV Rd, Rm
Rd:=Rm
N,Z,C,V
Пересылка регистров
MOV Rm, Rd
Rd:=Rm
N,Z,C
Пересылка регистров
SXTH Rd, Rm
Rd
0-31
:=Rm
0-16
-
Преобразовать полуслово со знаком в слово
SXTB Rd, Rm
Rd
0-31
:=Rm
0-7
-
Преобразовать байт со знаком в слово
UXTH Rd, Rm
Rd
0-31
:=Rm
0-16
-
Преобразовать полуслово без знака в слово
UXTB Rd, Rm
Rd
0-31
:=Rm
0-7
-
Преобразовать байт без знака в слово
REV Rd, Rm
Rd:=Rm с обрат­ным порядком байт в слове
-
Изменить на обратный порядок байтов в полусловах
REV16
Rd:=Rm с обрат­ным порядком байт в полусловах
-
Изменить на обратный порядок байтов в полусловах
REVSH Rd, Rm
Rd:=Rm с обрат­ным порядком байт в младшем полуслове
-
Изменить на обратный порядок байт в младшем полуслове, произвести рас­пространение знакового бита в старшее полуслово
Логические
операции
Мнемокод
Операции
Признаки
Описание
ANDS Rdn, Rm
Rdn := Rdn & Rm
N,Z,C
Логическое И
ORRS Rdn, Rm
Rdn := Rdn ˅ Rm
N,Z,C
Логическое ИЛИ
EORS Rdn, Rm
Rdn := Rdn mod2 Rm
N,Z,C
Исключающее ИЛИ (сумма по mod2)
BICS Rdn, Rm
Rdn := Rdn & not(Rm)
N,Z,C
Сброс бит по маске
TST Rn, Rm
Rm & Rn
N,Z,C
Проверка значения бит по маске
MVNS Rd, Rm
Rd := not Rm
N,Z,C
Побитовая инверсия регистра
Операции сдвига
Мнемокод
Операции
Признаки
Описание
LSLS Rd, Rm, #<imm5>
Rd:= лог. сдвиг Rm на Imm5 разрядов влево
N,Z,C
Логический сдвиг Rm влево на Imm5 ≤ 31 разрядов и запись в Rd
LSRS Rd, Rm, #<imm5>
Rd:= лог. сдвиг Rm на Imm5 разрядов вправо
N,Z,C
Логический сдвиг Rm вправо на Imm5 ≤ 31 разрядов и запись в Rd
ASRS Rd, Rm, #<imm5>
Rd:= ариф. сдвиг Rm на Imm5 разря- дов вправо
N,Z,C
Арифметический сдвиг Rm вправо на Imm5 ≤ 31 разрядов и запись в Rd
LSLS Rdn, Rm
Rdn:= лог. сдвиг Rdn на Rm{0-7} разрядов влево
N,Z,C
Логический сдвиг Rdn влево на число разрядов, заданное в Rm{0-7}
LSRS Rdn, Rm
Rdn:= лог. сдвиг Rdn на Rm{0-7} разрядов вправо
N,Z,C
Логический сдвиг Rdn вправо на число разрядов, заданное в Rm{0-7}
ASRS Rdn, Rm
Rdn:= ариф. сдвиг Rdn на Rm{0-7} разрядов вправо
N,Z,C
Арифметический сдвиг Rdn вправо на число разрядов, заданное в Rm{0-7}
43
RORS Rdn, Rm
Rdn:= цикл. сдвиг Rdn на Rm{0-7} разрядов вправо
N,Z,C
Циклический сдвиг Rdn вправо на чис­ло разрядов, заданное в Rm{0-7}
Условные и безусловные переходы
Мнемокод
Операции
Признаки
Описание
BX{C} Rm
PC:=Rm
-
Безусловный или условный {c}переход по косвенному адресу
BLX {C} Rm
LR:= PC, PC:=Rm
-
Безусловный или условный {c}переход к подпрограмме по косвенному адресу
CBZ Rn, label
При Rn=0 PC:=PC+4+2Imm
-
Проверка регистра на 0 и условный пе­реход относительно программного счётчика
CBNZ Rn, label
При Rn=0 PC:=PC+4+2Imm
-
Проверка регистра на 0 и условный пе­реход относительно программного счётчика
B cond label
При выполнении условия cond PC:=
PC:=PC+4+2Imm
-
Условный переход
B label
PC:=PC+4+2Imm
-
Безусловный переход
Системные команды
Мнемокод
Операции
Признаки
Описание
SVC Imm8
- Вызов супервизора
BKPT #imm8
Перевод процессора в режим отладки
-
Точка останова
CPS {i}{f}
Изменение состояния регистров PRIMASK,
FAULTMASK
-
Изменить состояние процессора, запрет/разрешение прерываний
NOP
- Нет операции
WFE
- Ожидать событие
WFI
- Ожидать прерывание
SEV
- Установить признак события
В таблицах используются следующие обозначения:
в фигурных скобках {} указываются необязательные операнды; большинство команд могут содержать суффикс кода условного выполнения
{с};
Rn, Rm, Rt, Rd – регистры, используемые в командах для задания исходных
операндов и результатов;
44
Rdn, Rdm – регистры источников и приемников операндов одновременно; N,Z,C,V - признаки в регистре состояния программы PSR в поле APSR [1];  ! – необязательный суффикс обратной записи значения базового регистра, в
случае, если он присутствует в команде (последний адрес, по которому осу­ществлялся доступ, будет записан обратно в регистр Rn.);
M [A] – содержимое памяти по адресу A; S - необязательный суффикс, если он указан, результат выполнения операции
приводит к установке соответствующих флагов;
ImmX – X-разрядные константы (непосредственные операнды).
Как видно из таблиц команд, большинство команд обработки данных в
зависимости от результата изменяют значения всех или части флагов в реги­стре состояния прикладной программы (APSR) [1]. Предусмотрена возмож­ность условного исполнения команд в зависимости от значения ранее сформи­рованных флагов путем добавления суффикса условия исполнения после мне­моники команды. Перечень таких суффиксов приведен в таблице:
При наличии одного из указанных суффиксов процессор проверяет зна­чение флагов на соответствие заданному условию. Если условие не выполняет­ся, то команда не исполняется и не вызывает изменения операндов, флагов и не генерирует прерываний.
45
Условные команды, за исключением условных переходов, должны распо­лагаться внутри блока условно исполняемых инструкций (IT-блок). Такой блок состоит и команды IT, за которой могут следовать до 4 условно исполняемых команд. Формат команды IT:
IT{x{y{z}}} cond
где:
cond определяет условие для первой инструкции в IT-блоке;
x - определяет выбор условия для второй инструкции в IT-блоке;
y определяет выбор условия для третьей инструкции в IT-блоке;
z определяет выбор условия для четвертой инструкции в IT-блоке.
Суффиксы выбора условия для второй, третьей и четвертой инструкций IT-блока могут принимать одно из следующих значений: T - Then. Инструкция выполняется, если условие cond истинно; E - Else. Инструкция выполняется, если условие cond ложно. Мнемокоды команд внутри IT-блока, в том числе и команд ветвления,
должны включать суффикс условного исполнения, который либо совпадает, либо логически противоположен условию {cond}. Пример:
ITTEE EQ ; следующие четыре инструкции - условные
MOVEQ R0, R1 ; условное копирование
ADDEQ R2, R2, #10 ; условное сложение
ANDNE R3, R3, #1 ; условное логическое И
BNE.W dloop ; условный переход. должен быть последним в блоке
4.1.5. Структура программы
Исходный текст программы ассемблера состоит из нескольких составных частей.
Начальная часть программы с перечисление входящих в программу сек-
ций и их параметров. Каждая из секций задается директивой AREA и
описывает выделяемые области памяти для хранения программного кода
и данных, в том числе стека. Обязательно наличие хотя бы одной секции
46
stack_top
AREA STACK, READWRITE EQU 0x400 PRESERVE8
; объявление секции стека, заполненного нулями ; начальное значение указателя стека
;выравнивание стека с кратностью 8 байт
AREA RESET, DATA, READONLY
DCD stack_top
; создание секции для размещения начальных адресов стека ;и прерывающих программ ;адрес начала обратного стека
const1
AREA Prog1, CODE, READONLY THUMB EQU 0xFF; EXPORT start
;создание секции для размещения программы пользователя ;указание на использование THUMB-команд ;формирование константы const1 = 0xFF ;для доступности метки start для остальной части программы
start
ENTRY
MOVS R0,#const1 MOVS R1,#20 ADDS R2, R0, R1 PUSH {R0,R1,R2} B . END
;точка входа в программу пользователя (начало кода) ;метка начала программы ;загрузка в регистр R0 константы const1 = 0xFF ;загрузка в регистр R1 константы 2010 ;сложение R1 и RO и загрузка суммы в регистр R2 ;загрузка R2, R1, R0 в стек ;зацикливание на команде B ;конец программы
с программным кодом. В состав начальной части могут входить одна или
несколько секций программного кода с опцией только для чтения (readon-
ly) и одна или несколько секций данных с опцией для чтения и записи
(readwhrite)
Точка входа в программу, определяемая директивой ENTRY. Директива
отмечает первую инструкцию, которую нужно выполнить. Код инициали-
зации и обработчики исключений также содержат точки входа.
Строки на языке ассемблера с командами программного кода.
Конец программы (определяется директивой END). Директива END ука-
зывает ассемблеру на завершение исходной программы. Любые строки,
следующие за директивой END, игнорируются ассемблером.
Пример оформления простейшей программы:
В программе первый фрагмент AREA предназначен для создания обрат-
ного стека STACK, заполненного нулями, в памяти данных с начальным зна­чением указателя стека Stack_Тop. Второй фрагмент AREA задает область программной памяти, начиная с адреса 0x08000000, для размещения директивами DCD начальных адресов сте­ка и прерывающих программ. Здесь же при использовании стандартной про­граммы начальной установки MDR32F9Qx.s размещаются первые исполняемые
47
команды для вызова программы Reset_Handler и пользовательской программы с меткой Start. Третий фрагмент AREA определяет секцию программной памяти для размещения пользовательской программы.
Директива ENTRY задает точку входа в программу пользователя с меткой start. В MDK Keil предусмотрена возможность использования стандартного
макета исходной программы MDR32F9Qx.s для микроконтроллеров серии 1986ВЕ9x. Его можно найти в окне менеджера проекта во вкладке project: pro- ject\target1\device\ startup MDR32F9Qx.s (Startup). В макете реализуется созда­ние стека, задание начальных адресов прерывающих программ, начальная установка контроллера и другие функции. Программа пользователя добавляется к макету. Ниже приведена исходная программа MDR32F9Qx.s и рисунок, по­ясняющий ее организацию (рис.4.1).
Макет исходной программы можно разделить на следующие фрагменты:
Задание секции стека (stack) Задание секции кучи (heap) Таблица векторов прерываний Код обработчика сброса (reset handler) и запуска программы пользователя Код остальных обработчиков прерываний Секция стека, строки 11-15
Стек организуется в памяти данных. Объем стека 400h байт задан дирек­тивой EQU. Директива AREA создает секцию с именем STACK, за которым следуют атрибуты:
NOINIT - данные в стеке обнуляются READWRITE - стек доступен для чтения и записи ALIGN=3 - выравнивание стека по границе 8 байт (2
3
)
48
49
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]