Что такое регистр в электронике
Регистры и их работа
Что такое регистр. Основой функциональной единицей построения регистров являются RS-триггеры или Д-триггеры.
В этой схеме цифровой код поступает на D-вход триггеров. Запись возможна при наличии логической единицы на вход С. Записанная числовая последовательность снимается с выходов Q. Параллельные регистры используются для хранения цифровых данных в виде параллельного двоичного кода, а также для преобразования прямого в обратный код или наоборот.
Последовательные регистры, кроме хранения, могут преобразовывать последовательный код в параллельный или наоборот. В последовательных регистрах триггеры соединины последовательно смотри рисунок ниже.
Внутри сдвигового регистра, как мы видим все триггеры соединены последовательно, то есть выход первого подключен ко входу второго и т.п.
При поступлении тактового импульса код, находящийся в регистре, сдвигается на один разряд. Т.е для нашей схемы, сдвиг кода идет вправо (в направлении младших разрядов).
При подаче следующего тактового импульса на входы синхронизации уровень, на входе второго триггера запоминается в нем и следует на вход третьего триггера. Одновременно следующий бит запоминается в первом триггере и т.д.
Рассмотрим, работу четырёх разрядного универсальный регистра на микросборке К155ИР1 (SN7495N), который может работать как со сдвигом вправо так и влево.
К155ИР1 несет в себе четыре D-триггера, связанные дополнительно между собой с помощью логических элементов И – ИЛИ, позволяюших расширить базовые функции:
Алгоритм работы следующий. Если на V2 подать низкий уровень, тактовые импульсы на первый вход синхронизации C1, а на V1 подавать биты информации, то регистр работает со сдвигом вправо и после приёма четырех разрядов на выходах Q1 – Q4 мы получим параллельный код.
Для обратного преобразования данных параллельный код записывается на D1 – D4, на V2 подают высокий уровень, а тактовых импульсы следуют уже на второй вход С2. Затем подавая на V2 низкий уровень, а синхроимпульсы на С1 мы сдвигаем записанный код, а с выхода последнего триггера идет последовательный код.
Условно-графическое обозначение параллельного, сдвигового и реверсивного регистров на схемах рассмотрено ниже:
Помимо уже перечисленных функций, регистры могут выполнять арифметические и логические операции, временную задержку и даже деление частоты. Сдвиговые регистры в отечественном варианте представлены микросборками: 133ИР1, К155ИР1, КМ155ИР1, 134ИР1
N | Q2 | Q1 | Q0 |
---|---|---|---|
1 | 0 | 0 | 1 |
2 | 0 | 1 | 1 |
3 | 1 | 1 | 1 |
4 | 1 | 1 | 0 |
5 | 1 | 0 | 0 |
6 | 0 | 0 | 0 |
Начинаем изучать 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 переключится в режим отладки. Мы можем управлять ходом программы с помощью данных кнопок:
И есть еще одна удобная функция работы с периферией в режиме отладки, она позволяет просматривать текущее состояние регистров и менять их состояние простым кликом мышкой.
Для того чтобы ей воспользоваться — нужно перейти в соответствующий периферийный блок и справа откроется окно с указанием регистров и их значением.
Если вы кликните по одному из пунктов данного меню, вы увидите адрес регистра и его краткое описание. Так же можно просмотреть описание к каждому отдельному параметру регистра:
Попробуйте самостоятельно пошагово выполнить программу, включить/выключить светодиоды не используя программу, а используя данный режим работы с микроконтроллером. Простор для фантазии тут обширный. Так же попробуйте поиграться с длительностями задержек, сделайте одновременное моргание обоими светодиодами. В общем экспериментируйте! )
Регистр принцип работы
Регистры. Устройство, принцип работы
Регистр — это последовательностное логическое устройство, используемое для хранения n-разрядных двоичных чисел и выполнения преобразований над ними. Регистр представляет собой упорядоченную последовательность триггеров, число которых соответствует числу разрядов в слове. С каждым регистром обычно связано комбинационное цифровое устройство, с помощью которого обеспечивается выполнение некоторых операций над словами.
Типичными являются следующие операции:
● прием слова в регистр;
● передача слова из регистра;
● поразрядные логические операции;
● сдвиг слова влево или вправо на заданное число разрядов;
● преобразование последовательного кода слова в параллельный и обратно;
● установка регистра в начальное состояние (сброс).
Фактически любое цифровое устройство можно представить в виде совокупности регистров, соединенных друг с другом при помощи комбинационных цифровых устройств.
Классификация
● накопительные (регистры памяти, хранения);
В свою очередь сдвигающие регистры делятся:
● по способу ввода-вывода информации на параллельные, последовательные, комбинированные;
● по направлению передачи информации на однонаправленные, реверсивные.
Для чего нужны регистры
Регистры процессора – это ячейки сверхбыстрой оперативной памяти, которые предназначены для временного хранения промежуточных данных. Различные регистры содержат информацию в различном виде: адреса и указатели сегментов памяти или системных таблиц, индексы элементов массива и пр.
В процессоре находится большое количество регистров, которые можно разделить на несколько основных групп: аккумуляторы, флаги, указатели, индексные, сегментные и регистры управления. Регистры процессора представляют собой ячейки памяти для приема, хранения и последующей передачи промежуточных результатов выполнения программ.
Любой регистр процессора – это цифровая электронная схема, содержащая последовательность двоичных чисел различной разрядности (16, 32 или 64) и результаты выполнения преобразований между ними. По типу приема и передачи информации могут быть последовательными (сдвиговыми) и параллельными.
Регистры-аккумуляторы универсальны, в них содержится большая часть промежуточных результатов выполнения различных команд (логических, арифметических, ввода/вывод и пр.). Процессор может содержать более одного аккумулятора. Разработчики программного обеспечения используют аккумуляторы для сокращения разрядности команд, упрощения программного кода.
Регистры-флаги известны также как регистры условий. Они показывают определенный результат выполнения операции, который может быть нулевым, положительным, отрицательным, или указывать на переполнение. Обычно коды условий объединяются в группы и образуют регистр другого типа – управляющий. Менять регистры-флаги возможно, но нежелательно, чтобы не исказить цельный результат.
Регистры, содержащие указатели на особые области памяти (стек, базу, команду), называются регистрами-указателями. Самый главный из них – указатель стека. Стек – это часть памяти, состоящая из ячеек, следующих друг за другом, т.е. взять из стека можно только ту ячейку, которая лежит сверху. Именно на эту вершину и указывает регистр стека.
Указатель базы обычно содержит адрес определенной ячейки стека, которая может быть любой. Как правило, регистр стека и регистр базы используют одновременно при работе в текущей процедуре для указания необходимого состояния стека.
Регистр-указатель команд иногда называют счетчиком команд, он содержит указатели на команды рабочего цикла. Когда команда выполняется, его значение увеличивается на 1 и цикл продолжается со следующей команды. Т.е. счетчик команд всегда указывает на команду, следующую за выполняемой в настоящий момент.
Индексных регистров два – это индекс источника и индекс приемника. Они используются для получения адреса данных стека в сочетании с регистрами-указателями.
Сегментные регистры используются при сегментной адресации памяти. При этом память делится на блоки (сегменты) различной длины. Адрес нужной ячейки памяти определяется адресом начала блока и величиной сдвига относительно него. Всего сегментных регистров четыре: для кодового сегмента, сегмента данных, сегмента стека и дополнительного сегмента.
Регистры управления контролируют работу процессора и недоступны пользователю. Их выполнение в основном, контролируют машинные программы. В них содержится информация о текущей выполняемой команде, состоянии процессора, а также они локализуют управляющие структуры при работе процессора в защищенном режиме.
- Что такое система управления менеджмент
- Что такое птк кратко