Что такое регистр команд

Регистр команд

Текущая команда находится в специально для нее отведенном регистре команд. В процессе работы с текущей командой увеличивается значение так называемого счётчика команд, который теперь указывает на следующую команду (если, конечно, не было команды перехода или останова).

Часто команду представляют как структуру, состоящую из записи операции (которую требуется выполнить) и адресов ячеек исходных данных и результата. По адресам указанным в команде берутся данные и помещаются в обычные регистры (в смысле не в регистр команды), получившийся результат тоже сначала оказывается в регистре, а уж потом перемещается по своему адресу, указанному в команде.

Связанные понятия

Сопрограммы (англ. coroutines) — методика связи программных модулей друг с другом по принципу кооперативной многозадачности: модуль приостанавливается в определённой точке, сохраняя полное состояние (включая стек вызовов и счётчик команд), и передаёт управление другому. Тот, в свою очередь, выполняет задачу и передаёт управление обратно, сохраняя свои стек и счётчик.

ПИН (англ. Personal Identification Number — персональный идентификационный номер) — аналог пароля. В ходе авторизации операции используется одновременно как пароль доступа держателя карты к терминалу (банкомату) и как секретный ключ для цифровой подписи запроса. ПИН предусматривается для кредитных и подобных карт (например, сим-карт); с его помощью производится авторизация держателя карты. ПИН должен знать только держатель карты. Обычно предусмотрено ограничение попыток правильного ввода (в основном.

Источник

регистр команд

Смотреть что такое «регистр команд» в других словарях:

регистр команд — Регистр, содержащий команду, исполняемую в данный момент процессором [Источник] Тематики информационные технологии в целом EN instruction register … Справочник технического переводчика

регистр команд — komandos registras statusas T sritis automatika atitikmenys: angl. command register; control register; instruction register; order register; program register vok. Befehlscoderegister, n; Befehlsregister, n; Programmregister, n rus. регистр команд … Automatikos terminų žodynas

Регистр (вычислительная техника) — Регистр процессора сверхбыстрая память внутри процессора, предназначенная прежде всего для хранения промежуточных результатов вычисления (регистр общего назначения/регистр данных) или содержащая данные, необходимые для работы процессора … … Википедия

Регистр процессора — Эта статья включает описание термина «IP»; см. также другие значения. Регистр процессора блок ячеек памяти, образующий сверхбыструю оперативную память (СОЗУ) внутри процессора; используется самим процессором и большой частью недоступен… … Википедия

Регистр (в вычислит. технике) — Регистр ЦВМ, часть памяти вычислительной машины обычно ёмкостью в одно машинное слово, предназначенная для запоминания (а иногда также и для преобразования) кодов. В каждой ЦВМ имеются наборы Р. различного назначения, например Р. центрального… … Большая советская энциклопедия

Регистр флагов — Регистр флагов регистр процессора, отражающий текущее состояние процессора. Содержание 1 Архитектура x86 1.1 Флаги состояния 1.2 Управляющий флаг … Википедия

регистр результата — регистр выхода Регистр арифметико логического устройства, в котором размещается результат операции выполняемой машинной команды или последовательной серией команд [Источник] Тематики информационные технологии в целом Синонимы регистр выхода EN… … Справочник технического переводчика

РЕГИСТР КОМПЬЮТЕРА — Специализированная ячейка памяти, входящая в состав процессора. Регистры выполняют функции кратковременного хранения и преобразования данных или команд. На физическом уровне регистр представляет собой совокупность триггеров, способных хранить… … Словарь бизнес-терминов

РЕГИСТР — РЕГИСТР, а, муж. (спец.). 1. Список, указатель чего н., книга для записей. 2. Степень высоты голоса, музыкального инструмента. Бас голос низкого регистра. 3. В нек рых музыкальных инструментах: группа труб или группа язычковых одинакового тембра … Толковый словарь Ожегова

регистр процессора — Память процессора, предназначенная для хранения основных или промежуточных данных либо их частей и используемая для выполнения машинных команд [Источник] Тематики информационные технологии в целом EN processor register … Справочник технического переводчика

Источник

Регистры общего назначения (ARM)

Содержание

Общие сведения

С точки зрения прикладного программиста, процессор располагает 16-ю 32-разрядными регистрами общего назначения (РОН, GPR), из которых три на деле имеют специальные функции:

Первые 13 регистров с точки зрения архитектуры являются абсолютно равноправными, за исключением двух моментов:

Остальные три регистра имеют специальное назначение. Счётчик команд как РОН использоваться не может, а в командах применяется для достижения специальных целей, причём возможности его использования зависят от вида команды и от используемой системы команд. LR может использоваться как РОН в тех случаях, когда он не применяется по своему прямому назначению. Возможность такого использования для SP определяется версией архитектуры и используемой системой команд. В частности, в архитектуре ARMv7-M при записи в SP младшие два бита принудительно устанавливаются в 0, что ограничивает возможности его применения как обычного РОНа, а документация на ARMv6-M рекомендует всегда записывать в эти два бита нули во избежание проблем с совместимостью. Подробнее об использовании этих регистров сказано ниже.

Как уже отмечалось, в системе команд Thumb свободно могут использоваться лишь регистры R0–R7, называемые также младшими регистрами. Явный доступ к старшим регистрам в Thumb крайне ограничен и возможен лишь в некоторых командах. Система команд Thumb-2 преодолела это ограничение, однако для доступа к старшим регистрам в ней применяются новые 32-разрядные команды. Таким образом, при оптимизации кода, написанного для системы команд Thumb-2, надо избегать использования старших регистров, чтобы по возможности использовались 16-разрядные команды набора Thumb. Система команд ARM ограничений на доступ к регистрам не имеет.

С точки зрения системного программиста, процессор имеет большее число регистров общего назначения, хотя в каждый конкретный момент времени доступны лишь 16 из них. В процессорах A- и R-профилей их имеется либо 31, либо 33 в зависимости от того, реализован режим монитора или нет. Это число получается следующим образом:

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

В процессорах M-профиля имеется 17 или 19 регистров, причём R0–R12, LR и PC всегда существуют в одном экземпляре, и лишь SP имеет несколько экземпляров:

Особые случаи использования регистров

Счётчик команд PC (R15)

Регистр PC (Program Counter) используется для хранения адресов выполняющихся команд. При последовательном выполнении команд он последовательно увеличивается, при переходах и прерываниях в него загружается новое значение.

Многие команды запрещают программисту явно использовать PC или налагают на это определённые ограничения, что всегда оговаривается в описаниях конкретных команд. Нарушение этих правил обычно ведёт к непредсказуемым результатам.

В тех случаях, когда описание команды не налагает ограничений на использование PC, применяются изложенные ниже правила.

Считывание счётчика команд

При использовании системы команд ARM считанное значение счётчика команд будет на 8 превышать адрес текущей команды (в которой осуществляется это считывание; значение 8 обусловлено особенностями конвейера, использовавшегося в ранних версиях архитектуры, и сейчас сохраняется для совместимости). Два младших бита PC всегда будут равны нулю, поскольку команды ARM всегда выровнены на границу слова.

Исключением из этого правила является сохранение PC с помощью команд STR и STM : сохранённое в памяти значение счётчика команд будет превышать адрес команды записи либо на 8, либо на 12 в зависимости от реализации. Если одна из них сохраняет значение PC, увеличенное на 8 или 12, то и другая будет сохранять значение, увеличенное на такую же величину. Заметим, что использование в команде STR счётчика команд в роли источника адреса, по которому будет производиться сохранение, подчиняется общему правилу: его содержимое на момент вычисления адреса записи будет на 8 больше адреса самой команды.

При считывании регистра PC в командах набора Thumb его значение само по себе будет превышать адрес текущей команды на 4, при этом младший бит будет равен нулю. Однако если PC используется в 16-разрядном варианте команды ADD Rd, PC, #const, предназначенной для вычисления адреса относительно текущего значения счётчика команд, у складываемого с константой значения PC принудительно обнуляется разряд 1. В результате значение PC, выровненное на границу слова, будет на 2 или 4 превышать адрес этой команды ADD в зависимости от её собственного адреса. Аналогичному принудительному выравниванию подвергается значение PC, используемое в качестве базового адреса в 16-разрядной команде LDR Rd, [PC, #imm8 * 4], что необходимо для корректной загрузки слова (из-за необходимости выравнивания его на границу слова).

Запись в счётчик команд

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

В арифметико-логических командах набора ARM использование PC в качестве приёмника вызывает переход на соответствующий адрес. В ранних версиях (все варианты ARMv5 и раньше) записываемое в PC значение должно иметь нули в двух младших разрядах, иначе последствия будут непредсказуемыми. В версии ARMv6 два младших бита записываемого значения игнорируются и принудительно устанавливаются в 0. Наконец, в версии ARMv7 младший бит используется в качестве индикатора системы команд, активизируемой после перехода: если он равен нулю, по-прежнему будет использоваться система команд ARM (при этом бит 1 должен быть равен нулю), а если равен единице — система команд Thumb (тогда бит 1 является частью адреса перехода).

Специальным случаем является использование регистра PC в качестве приёмника в S-разновидностях команд обработки данных (т. е. в командах, меняющих по результатам своего выполнения состояние флагов регистра текущего состояния программы CPSR): в такой ситуации происходит возврат из прерывания, для чего в PC заносится результат операции, а в CPSR — содержимое регистра сохранённого состояния SPSR, при этом система команд устанавливается в соответствии со значением, загружаемым из SPSR. Подробнее об этом говорится в разделе « Обработка прерываний в A- и R-профилях ». Заметим, что этот вариант загрузки PC может использоваться только при нахождении процессора в одном из режимов обработки прерываний, но не в режимах пользователя или системы, не имеющих SPSR.

В системе команд Thumb-2 возможность загрузки PC появилась и в команде LDR. Младший бит загружаемого значения рассматривается как индикатор системы команды. В отличие от системы команд ARM, в целом аналогичных командах обработки данных Thumb-2 использование PC как приёмника результата невозможно.

Указатель стека SP (R13)

Регистр SP предназначен для использования в качестве указателя стека.

Использование SP в 16-разрядных командах обработки данных очень ограничено. В 32-разрядных командах во многих случаях применение SP в качестве приёмника результата запрещено (в аналогичных командах набора ARM он может использоваться свободно).

Когда SP используется по прямому назначению, он должен содержать значение, кратное 4, поскольку обращение к стеку выполняется словами. В некоторых версиях архитектуры, например, в ARMv7-M, при записи в SP два младших разряда принудительно сбрасываются. Однако, если нужна переносимость кода между разными версиями архитектуры, программист должен убедиться, что помещаемые в SP значения никогда не будут содержать единиц в двух младших битах.

Регистр связи LR (R14)

Регистр LR (Link Register) используется в следующих случаях:

Перечисленные выше команды применяются для вызова подпрограмм, при этом в LR помещается адрес команды, следующей за BL или BLX, либо код возврата из функции (FNC_RETURN) для команды BLXNS.

В случае возникновения прерывания в процессорах A- и R-профилей в LR заносится значение PC, на 4 или 8 превосходящее адрес команды, выполняемой непосредственно перед прерыванием; подробнее об этом говорится в разделе «Обработка прерываний в A- и R-профилях». В процессоре M-профиля при прерывании в LR заносится специальный код, называемый в документации EXC_RETURN и определяющий, как необходимо выполнять возврат из обработчика данного прерывания (см. раздел «Обработка прерываний в M-профиле)».

Стандартные соглашения о связях

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

Указатель стека сам по себе всегда должен быть выровнен на границу слова. Тем не менее, в некоторых случаях требуется его выравнивание на границу двойного слова. Для контроля за соблюдением выравнивания на границу двойного слова объектные модули могут снабжаться специальными атрибутами, которые контролируются компоновщиком. Последний, в частности, не должен допускать вызова подпрограмм, расположенных в модуле, требующем выравнивания стека на границу двойного слова, из подпрограмм, относящихся к модулю, обеспечивающему выравнивание лишь на границу слова. Компиляторы языков высокого уровня обычно снабжают свои файлы соответствующими атрибутами сами; при программировании на языке ассемблера это является задачей программиста. Например, транслятор ассемблера фирмы KEIL имеет для этого директивы PRESERVE8 (модуль обеспечивает выравнивание стека на границу двойного слова, если он уже был на неё выровнен) и REQUIRE8 (модуль требует выравнивания стека на границу двойного слова).

Источник

Ассемблер. Сегменты памяти и регистры

Обновл. 27 Сен 2021 |

Результат выполнения программы:

Сегменты памяти

Модель сегментированной памяти разбивает системную память на группы независимых сегментов, на которые указывают указатели, расположенные в регистрах сегментов. Каждый сегмент используется для хранения данных определенного типа. Первый сегмент используется для хранения кода инструкций, второй — для хранения элементов данных, а третий — для программного стека.

Сегменты памяти:

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

Сегмент кода (code segment) — представлен секцией .text. Он определяет область в памяти, в которой хранятся коды инструкций. Это также фиксированная область.

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

Регистры

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

Чтобы ускорить свою работу, процессор подключает определенные внутренние места хранения памяти, которые называются регистрами. Регистры хранят элементы данных для обработки без необходимости получать доступ к памяти. Ограниченное количество регистров встроено в чип процессора.

Регистры процессора

В архитектуре IA-32 есть десять 32-битных и шесть 16-битных процессорных регистров. Регистры делятся на три категории:

Общие регистры (General Registers);

Регистры управления (Control Registers);

Сегментные регистры (Segment Registers).

В свою очередь, общие регистры делятся на следующие:

Регистры данных (Data Registers);

Регистры-указатели (Pointer Registers);

Индексные регистры (Index Registers).

Регистры данных

Регистры данных — это четыре 32-битных регистра, которые используются для арифметических, логических и других операций. Эти 32-битные регистры могут быть использованы следующими тремя способами:

как полные 32-битные регистры данных: EAX, EBX, ECX, EDX;

нижние половины 32-битных регистров могут использоваться как четыре 16-битных регистра данных: AX, BX, CX и DX;

нижняя и верхняя половины вышеупомянутых четырех 16-битных регистров могут использоваться как восемь 8-битных регистров данных: AH, AL, BH, BL, CH, CL, DH и DL.

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Некоторые из этих регистров данных имеют специфическое применение в арифметических операциях:

AX (primary accumulator) — используется для ввода/вывода и в большинстве арифметических операций. Например, в операции умножения один операнд сохраняется в регистре EAX/AX/AL в соответствии с размером операнда.

BX (base register) — используется при индексированной адресации.

CX (count register) — хранит количество циклов в повторяющихся операциях (также, как и регистры ECX и CX).

DX (data register) — используется в операциях ввода/вывода, а также с регистрами AX и DX для выполнения операций умножения и деления, связанных с большими значениями.

Регистры-указатели

Регистрами-указателями являются 32-битные регистры EIP, ESP и EBP и соответствующие им 16-битные регистры IP, SP и BP. Есть три категории регистров-указателей:

Указатель на инструкцию или команду (Instruction Pointer или IP) — 16-битный регистр IP хранит смещение адреса следующей команды, которая должна быть выполнена. IP в сочетании с регистром CS (как CS:IP) предоставляет полный адрес текущей инструкции в сегменте кода.

Указатель на стек (Stack Pointer или SP) — 16-битный регистр SP обеспечивает значение смещения в программном стеке. SP в сочетании с регистром SS (SS:SP) означает текущее положение данных или адреса в программном стеке.

Базовый указатель (Base Pointer или BP) — 16-битный регистр BP используется в основном при передаче параметров в подпрограммы. Адрес в регистре SS объединяется со смещением в BP, чтобы получить местоположение параметра. BP также можно комбинировать с DI и SI в качестве базового регистра для специальной адресации.

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Индексные регистры

В процессоре существуют 32-битные индексные регистры ESI и EDI и их 16-битные версии: SI и DI. Все они используются в индексированной адресации, и, иногда, в операциях сложения/вычитания. Есть два типа индексных указателей:

Исходный индекс (Source Index или SI) — используется в качестве исходного индекса в строковых операциях.

Индекс назначения (Destination Index или DI) — используется в качестве индекса назначения в строковых операциях.

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Регистры управления

Регистром управления является объединенный 32-битный регистр инструкций и 32-битный регистр флагов (регистр процессора, отражающий его текущее состояние). Многие инструкции включают в себя операции сравнения и математические вычисления, которые способны изменить состояния флагов, а некоторые другие условные инструкции проверяют значения флагов состояния, чтобы перенести поток управления в другое место.

Распространенные битовые флаги:

Флаг переполнения (Overflow Flag или OF) — указывает на переполнение старшего бита данных (крайнего левого бита) после signed арифметической операции.

Флаг ловушка (Trap Flag или TF) — позволяет настроить работу процессора в одношаговом режиме.

Вспомогательный флаг переноса (Auxiliary Carry Flag или AF) — после выполнения арифметической операции содержит перенос от бита 3 до бита 4. Используется для специализированной арифметики. AF устанавливается, когда 1-байтовая арифметическая операция вызывает перенос из бита 3 в бит 4.

Флаг переноса (Carry Flag или CF) — после выполнения арифметической операции содержит перенос 0 или 1 из старшего бита (крайнего слева). Кроме того, хранит содержимое последнего бита операции сдвига или поворота.

В следующей таблице указано положение битовых флагов в 16-битном регистре флагов:

Флаг:ODITSZAPC
Бит №:1514131211109876543210

Сегментные регистры

Сегменты — это специфические части программы, которые содержат данные, код и стек. Есть три основных сегмента:

Сегмент кода (Code Segment или CS) — содержит все команды и инструкции, которые должны быть выполнены. 16-битный регистр сегмента кода или регистр CS хранит начальный адрес сегмента кода.

Сегмент данных (Data Segment или DS) — содержит данные, константы и рабочие области. 16-битный регистр сегмента данных или регистр DS хранит начальный адрес сегмента данных.

Сегмент стека (Stack Segment или SS) — содержит данные и возвращаемые адреса процедур или подпрограмм. Он представлен в виде структуры данных «Стек». Регистр сегмента стека или регистр SS хранит начальный адрес стека.

Кроме регистров CS, DS и SS существуют и другие регистры дополнительных сегментов — ES (Extra Segment), FS и GS, которые предоставляют дополнительные сегменты для хранения данных.

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

Пример на практике

Посмотрите на следующую простую программу, чтобы понять, как используются регистры в программировании на ассемблере. Эта программа выводит 9 звёздочек с простым сообщением:

Источник

Начинаем изучать STM32: Что такое регистры? Как с ними работать?

Продолжаем рассмотрение базовых вопросов

В предыдущем уроке мы рассмотрели работу с битовыми операциями и двоичными числами, тем самым заложив основу для рассмотрения новой темы. В этом уроке мы с Вами рассмотрим очередной вопрос: что такое регистры и как с ними работать?

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Память и регистры

Одним из самых важных навыков необходимых при работе с микроконтроллерами является умение взаимодействовать с регистрами. Давайте для себя разберемся, что же это такое?

В целом, регистр — это особый вид памяти внутри микроконтроллера, который используется для управления процессором и периферийными устройствами. Каждый регистр в архитектуре ARM представляет собой ячейку памяти и имеет длину в 32 бита, где каждый бит можно представить в виде крошечного выключателя с помощью которого осуществляется управление тем или иным параметром микроконтроллера.

Каждый из регистров имеет свой порядковый номер – адрес. Адрес регистра обозначается 32-битным числом представленным в шестнадцатеричной системе счисления. Путём записи по адресу регистра определённой комбинации единиц и нулей, которые обычно представлены в шестнадцатеричном виде, осуществляется настройка и управление тем или иным узлом в МК. Вспомним, что в программе для работы с битовыми операциями, мы могли представить в виде шестнадцатеричного числа произвольный набор единиц и нулей. В целом стоит отметить, что существует два вида регистров: регистры общего назначения и специальные регистры. Первые расположены внутри ядра МК, а вторые являются частью RAM-памяти.

Так же стоит отметить, что Reference Manual, который мы скачивали в первом уроке, это один большой справочник по регистрам, содержащимся в целевом микроконтроллере, а библиотека CMSIS позволяет нам оперировать символьными именами регистров вместо числовых адресов. Например, к регистру 0x40011018 мы можем обратиться просто, используя символьное имя GPIOC_BSSR. Конкретные примеры конфигурирования мы рассмотрим в ходе разбора нашей программы из первого занятия.

Итак, обычно структура регистра описывается в виде небольшой таблицы с указанием:

Разбор кода из первого занятия

Итак, давайте вспомним задачу, которую мы решили на первом уроке используя готовый код примера: нам было необходимо написать программу, которая бы обеспечила попеременное включение двух светодиодов на плате Discovery (возможно и не двух, если у вас другая версия платы Discovery) с временным интервалом.

Давайте еще разок взглянем на код программы, которую мы использовали для того, чтобы заставить наш МК дрыгать двумя ногами на которых расположены наши светодиоды:

Первым делом, при работе с STM32, даже для такой простой задачи как включение и выключение светодиода нам необходимо предварительно ответить на ряд вопросов:

Куда подключены наши светодиоды? К какому выводу микроконтроллера?

Для того, чтобы посмотреть где что находится на плате Discovery, а в частности, нужные нам светодиоды — нужно открыть Schematic-файл, либо тот который мы скачали с сайта ST, либо прямо из Keil:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Открыв Schematic мы увидим схему всего того, что есть на плате — схему ST-Link, обвязку всей периферии и многое другое. На текущий момент нас интересуют два светодиода, ищем их обозначение:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Как мы видим, наши светодиоды подключены к порту GPIOC на 8 и 9 пин.

Как включить тактирование на нужный порт GPIO?

В целом, любая работа с периферией в микроконтроллерах STM32 сводится к стандартной последовательности действий:

Внимание! Вопрос касательно системы тактирования, её настройки и использования мы подробно рассмотрим в отдельной статье.

Найти к какой шине подключен наш порт GPIOC можно найти в Datasheet’е на наш МК в разделе Memory Mapping в Таблице 16. STM32F051xx peripheral register boundary addresses.

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Как вы уже успели заметить, необходимая нам шина именуется как AHB2. Для того чтобы подробнее ознакомиться с регистром, в котором включается тактирование на нужный нам порт GPIO на шине AHB, надо перейти в соответствующий раздел в Reference Manual. По названию регистров мы можем определить тот, который нужен нам:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Переходим в этот пункт, и мы видим наш 32-битный регистр, его адрес смещения, значение по умолчанию, способ доступа к регистру и перечисление того, за что отвечает каждый бит в регистре.

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Смотрим на таблицу и видим нечто напоминающее опции включения тактирования на портах GPIO. Переходим к описанию и находим нужную нам опцию:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Соответственно если мы установим 19 бит в значение «1» то это обеспечит включение тактирования на порт I/O C – то есть на наш GPIOC. К тому же — нам нужно включить отдельно один бит из группы, не затрагивая остальные т.к. мы не должны мешать и изменять без надобности другие настройки.

Основываясь на материалах прошлого урока, мы знаем что для того чтобы выставить определенный бит нужно используя логическую операцию «ИЛИ» сложить текущее значение регистра с маской которая содержит те биты которые необходимо включить. Например, сложим значение регистра RCC->AHBENR по умолчанию, т.е. 0x14 и число 0x80000 тем самым включим тактирование GPIOC путем установки 19 бита:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Каким образом мы можем это сделать из программы? Всё достаточно просто. В данном случае у нас два варианта:

То есть, мы могли бы обращаться к адресам регистров напрямую по адресу и написать так:

Второй вариант мне кажется наиболее привлекательным, т.к. библиотека CMSIS организована таким способом, что регистру можно обращаться, используя только его название. Препроцессор в ходе обработки текста программы перед компиляцией подставит все цифровые значения адреса регистра автоматически. Давайте разберем этот вопрос чуть подробнее.

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

Наш код будет выглядеть следующим образом:

Давайте для ознакомления копнём вглубь библиотеки CMSIS.

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

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

И мы переносимся в глубины библиотеки CMSIS, в которой увидим, что все регистры доступные для управления программным способом имеют вид TypeDef-структур, в том числе и наш RCC:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Провалившись подобным образом в RCC_TypeDef мы увидим структуру в которой описаны все поля нашего регистра:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Соответственно, мы можем спокойно обращаться к нужному нам регистру записью вида PERIPH_MODULE->REGISTER и присваивать ему определенное значение.

Помимо мнемонического обозначения регистров есть так же обозначения конкретных битов. Если мы провалимся к объявлению параметра RCC_AHBENR_GPIOCEN из нашей программы, то так же увидим объявление всех параметров:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Таким образом, используя библиотеку CMSIS у нас получается лаконичная читаемая запись нужного нам параметра в регистр, через установку которого мы запускаем тактирование на нужный нам порт:

В качестве задания: определите используя возможности Keil, каким образом получился адрес регистра RCC->AHBENR как 0x40021014.

Как настроить нужные нам пины GPIO для того чтобы можно было включить светодиод?

Итак, мы знаем что нужные нам светодиоды подключены к порту GPIOC к пинам PC8 и PC9. Нам нужно настроить их в такой режим, чтобы загорался светодиод. Хотелось бы сразу же сделать оговорку, что порты GPIO мы рассмотрим подробнее в другой статье и тут мы сконцентрируемся именно на работе с регистрами.

Первым делом нам нужно перевести режим работы пинов PC8 и PC9 в режим Output. Остальные параметры порта можно оставить по умолчанию. Переходим в Reference Manual в раздел 9. General-purpose I/Os (GPIO) и открываем пункт отвечающий за режим работы пинов порта GPIO и видим что за этот параметр отвечает регистр MODER:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Судя по описанию, для установки пинов PC8 и PC9 в режим Output мы должны записать 01 в соответствующие поля регистра GPIOC.

Это можно сделать через прямую установку с помощью числовых значений:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Или через использование определений из библиотеки:

После данной инструкции наши пины PC8 и PC9 перейдут в режим Output.

Как включить светодиод?

Если мы обратим внимание на список доступных регистров для управления портом GPIO то можем увидеть регистр ODR:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Каждый из соответствующих битов отвечает за один из пинов порта. Его структуру вы можете увидеть ниже:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Для того, чтобы обеспечить попеременную смену состояний светодиодов надо с определенным временным интервалом включать/выключать 8 и 9 биты. То есть попеременно присваивать регистру значение 0x100 и 0x200.

Сделать это мы можем через прямое присвоение значений регистру:

Можем через использование определений из библиотеки:

Но так как микроконтроллер работает очень быстро — мы не будем замечать смены состояний светодиодов и визуально будет казаться что они оба горят постоянно. Для того чтобы они действительно моргали попеременно мы внесем искусственную задержку в виде цикла который займет МК бесполезными вычислениями на некоторое время. Получится следующий код:

На этом первоначальное знакомство с регистрами и методами работы с ними мы можем закончить.

Проверка результатов работы нашего кода

Небольшое приятное дополнение в конце статьи: в Keil имеется отличный Debug-инструмент с помощью которого мы можем пошагово выполнить нашу программу и просмотреть текущее состояние любого периферийного блока. Для этого после загрузки прошивки после компиляции мы можем нажать кнопку Start Debug Session:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Рабочая среда Keil переключится в режим отладки. Мы можем управлять ходом программы с помощью данных кнопок:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

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

Для того чтобы ей воспользоваться — нужно перейти в соответствующий периферийный блок и справа откроется окно с указанием регистров и их значением.

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Если вы кликните по одному из пунктов данного меню, вы увидите адрес регистра и его краткое описание. Так же можно просмотреть описание к каждому отдельному параметру регистра:

Что такое регистр команд. Смотреть фото Что такое регистр команд. Смотреть картинку Что такое регистр команд. Картинка про Что такое регистр команд. Фото Что такое регистр команд

Попробуйте самостоятельно пошагово выполнить программу, включить/выключить светодиоды не используя программу, а используя данный режим работы с микроконтроллером. Простор для фантазии тут обширный. Так же попробуйте поиграться с длительностями задержек, сделайте одновременное моргание обоими светодиодами. В общем экспериментируйте! )

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *