что такое регистр в тексте

Регистр

Регистр, перекочевавший от “машинки”.

Что такое регистр? Регистр – это набор символов, только и всего. Различие регистров на «верхний» (с прописными буквами) и «нижний» (со строчными буквами) пошло со времён печатных машин. Для печатной машины регистр – ряд литер (символов), расположенных на одной высоте в общем ряду печатных колодок (досочек), соединённых рычажным механизмом с клавишами клавиатуры.

Регистр “верхний” и “нижний”

В печатной машинке на одной колодке нанесены две литеры: одна – сверху, другая – снизу. У колодок с литерами в виде букв вверху находились прописные буквы, снизу – строчные; переключиться на верхний регистр можно зажав клавишу верхнего регистра (аналогично клавише Shift), или нажав на клавишу замка верхнего регистра (аналогично клавише Caps Lock). При переходе на верхний регистр все литеры вместе с колодками и рычажками опускались, и тогда при нажатии клавиши по бумаге ударялась верхняя литера колодки.

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

Регистр электронный

С переходом на электронную клавиатуру понятие «верхнего» и «нижнего» регистра потеряло свой первоначальный смысл. Теперь верхний регистр – это совокупность кодов символов, соответствующих прописным буквам, а нижний регистр – кодов, соответствующих строчным буквам. Когда вы нажимаете клавишу, клавиатура формирует «скэн-код» нажатой клавиши и отправляет её в компьютер; если вы зажимаете при этом клавишу Shift или включили клавишу Caps Lock, то сигнализируется и об их активности. Сам компьютер по полученным «скэн-кодам» формирует «код символа».

Регистр чувствительный

При зажатии клавиши Shift (или включённой Caps Lock) изменяется код символа только для тех букв и чисел, у которых “включена” чувствительность к регистру. На самом деле, можно сказать, что почти все символы на клавиатуре чувствительны к регистру, потому что при зажатой клавише Shift они печатают второй набор символов. Однако, говоря о регистре, имеют в виду только те символы, значение которых меняется при включённом Caps Lock. Так, можно говорить, что клавиша с буквой “о” (или сама буква) чувствительна к регистру, тогда как говорить о чувствительности клавиши “1” (или самой цифры) неверно.

Источник

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

На конференции North Bay Python в 2018 году я делал доклад об именах пользователей. Информация из доклада по большей части была собрана мною за 12 лет поддержки django-registration. Этот опыт дал мне гораздо больше знаний, чем я планировал получить, о том, насколько сложными могут быть «простые» вещи.

В начале доклада я, правда, упомянул, что это не будет очередное разоблачение из серии «заблуждения по поводу Х, в которые верят программисты». Таких разоблачений можно найти сколько угодно. Однако мне подобные статьи не нравятся. В них перечисляются разные вещи, якобы являющиеся ложными, однако очень редко объясняется – почему это так, и что нужно делать вместо этого. Подозреваю, что люди просто прочтут такие статьи, поздравят себя с этим достижением, и потом пойдут находить новые интересные способы делать ошибки, не упомянутые в этих статьях. Всё потому, что они на самом деле не поняли проблем, порождающих этих ошибки.

Поэтому в своём докладе я постарался как можно лучше объяснить некоторые проблемы и пояснить, как их решать – такой подход мне нравится гораздо больше. Одна из тем, которой я коснулся лишь вскользь (это был всего один слайд и пара упоминаний на других слайдах) – это сложности, которые могут быть связаны с регистром символов. Для задачи, которую я обсуждал – сравнение идентификаторов без учёта регистра – есть официальный Правильный Ответ™, и в докладе я дал лучшее из известных мне решений, использующее только стандартную библиотеку Python.

Однако я кратко упомянул о более глубоких сложностях с регистром символов в Unicode, и хочу посвятить некоторое время описанию подробностей. Это интересно, и понимание этого может помочь вам принимать решения при проектировании и написании кода, обрабатывающего текст. Поэтому предлагаю вам нечто противоположное статьям «заблуждения по поводу Х, в которые верят программисты» – «правда, которую должны знать программисты».

И ещё одно: в Unicode полно терминологии. В данной статье я буду использовать в основном определения «верхний регистр» и «нижний регистр», поскольку стандарт Unicode использует эти термины. Если вам нравятся другие термины, вроде строчная/прописная буквы – всё нормально. Также я часто буду использовать термин «символ», который некоторые могут счесть некорректным. Да, в Unicode концепция «символа» не всегда совпадает с ожиданиями людей, поэтому часто лучше избегать её, используя другие термины. Однако в данной статье я буду использовать этот термин так, как он используется в Unicode – для описания абстрактной сущности, о которой можно делать заявления. Когда это важно, для уточнения я буду использовать более конкретные термины типа «кодовой позиции» [code point].

Регистров бывает больше двух

Носители европейских языков привыкли к тому, что в их языках регистр символов используется для обозначения конкретных вещей. К примеру, в английском [и русском] языках мы обычно начинаем предложения с буквы в верхнем регистре, а продолжаем чаще всего буквами в нижнем регистре. Также имена собственные начинаются с букв в верхнем регистре, и многие акронимы и аббревиатуры записываются в верхнем регистре.

И мы обычно считаем, что регистров существует всего два. Есть буква «А», и есть буква «а». Одна в верхнем, другая в нижнем регистре – не правда ли?

Однако в Unicode есть три регистра. Есть верхний, есть нижний, и есть титульный регистр [titlecase]. В английском языке так записываются названия. Например, «Avengers: Infinity War». Обычно для этого первая буква каждого слова просто пишется в верхнем регистре (и в зависимости от разных правил и стилей, некоторые слова, например, артикли, не пишутся с заглавных букв).

В стандарте Unicode дан такой пример символа в титульном регистре: U+01F2 LATIN CAPITAL LETTER D WITH SMALL Z. Выглядит он так: Dz.

Подобные символы иногда требуются для обработки негативных последствий одного из ранних решений разработки стандарта Unicode: совместимости с существующими текстовыми кодировками в обе стороны. Для Unicode было бы удобнее составлять последовательности при помощи имеющихся у стандарта возможностей по комбинированию символов. Однако во многих уже существующих системах уже были отведены места для готовых последовательностей. К примеру, в стандарте ISO-8859-1 («latin-1») у символа «é» есть готовая форма, имеющая номер 0xe9. В Unicode предпочтительнее было бы писать эту букву при помощи отдельной «е» и знака ударения. Но для обеспечения полной совместимости в обе стороны с такими существующими кодировками, как latin-1, в Unicode также назначены кодовые позиции для готовых символов. К примеру, U+00E9 LATIN SMALL LETTER E WITH ACUTE.

Хотя кодовая позиция этого символа совпадает с его байтовым значением из latin-1, полагаться на это не стоит. Вряд ли кодирование символов в Unicode сохранит эти позиции. К примеру, в UTF-8 кодовая позиция U+00E9 записана в виде байтовой последовательности 0xc3 0xa9.

И, конечно, в уже существующих кодировках есть символы, которым требовалось особое обхождение при использовании титульного регистра, из-за чего они были включены в Unicode «как есть». Если хотите посмотреть на них, поищите в своей любимой базе Unicode символы из категории Lt («Letter, titlecase»).

Есть несколько способов определить регистр

Если вы работаете с ограниченным подмножеством символов (конкретно, с буквами), то вам может хватить и 1-го определения. Если ваш репертуар шире – в него входят похожие на буквы символы, не являющиеся буквами, вам может подойти 2-е определение. Его рекомендует и стандарт Unicode, §4.2:

Программистам, манипулирующим строками в Unicode, стоит работать с такими строковыми функциями, как isLowerCase (и её функциональным родственником toLowerCase), если они не работают со свойствами символов напрямую.

Упомянутая здесь функция определяется в §3.13 стандарта Unicode. Формально в 3-м определении используются функции isLowerCase и isUpperCase из §3.13, определяемые в терминах фиксированных позиций в toLowerCase и toUpperCase соответственно.

Если в вашем языке программирования есть функции для проверки или преобразования регистра строк или отдельных символов, стоит изучить, какие из упомянутых определений используются в реализации. Если вам интересно, то методы isupper() и islower() в Python используют 2-е определение.

Нельзя понять регистр символа по его внешнему виду или названию

По внешнему виду многих символов можно понять, в каком они регистре. К примеру, «А» находится в верхнем регистре. Это понятно и по названию символа: «LATIN CAPITAL LETTER A». Однако иногда такой метод не работает. Возьмём кодовую позицию U+1D34. Выглядит она так: ᴴ. В Unicode ей назначено имя: MODIFIER LETTER CAPITAL H. Значит, она в верхнем регистре, так?

На самом же деле она наследует свойство Lowercase, поэтому по определению №2 она находится в нижнем регистре, несмотря на то, что визуально напоминает заглавную Н, а в названии есть слово «CAPITAL».

У некоторых символов вообще нет регистра

Символ С имеет регистр тогда и только тогда, когда у С есть свойство Lowercase или Uppercase, или значение параметра General_Category равно Titlecase_Letter.

Значит, очень много символов из Unicode – на самом деле, большая их часть – регистра не имеет. Не имеют смысла вопросы об их регистре, а изменения регистра на них не действуют. Однако мы можем получить ответ на этот вопрос по определению №3.

Некоторые символы ведут себя так, будто у них несколько регистров

Из этого следует, что если вы используете определение №3, и задаёте вопрос, находится ли символ без регистра в верхнем или нижнем регистре, вы получите ответ «да».

В стандарте Unicode даётся пример (таблица 4-1, строка 7) символа U+02BD MODIFIER LETTER REVERSED COMMA (который выглядит так: ʽ). У него нет унаследованных свойств Lowercase или Uppercase, он не принадлежит к категории Lt, поэтому регистра у него нет. При этом преобразование в верхний регистр его не меняет, и преобразование в нижний регистр его не меняет, поэтому по 3-му определению он отвечает «да» на оба вопроса: «принадлежишь ли ты к верхнему регистру?» и «принадлежишь ли ты к нижнему регистру?»

Кажется, что из-за этого может возникнуть никому не нужная путаница, однако смысл в том, что определение №3 работает с любой последовательностью символов Unicode, и позволяет упростить алгоритмы преобразования регистра (символы без регистра просто превращаются сами в себя).

Регистр зависит от контекста

Можно подумать, что если таблицы преобразования регистра в Unicode покрывают все символы, то это преобразование заключается просто в поиске нужного места в таблице. К примеру, в базе данных Unicode записано, что для символа U+0041 LATIN CAPITAL LETTER A нижним регистром будет U+0061 LATIN SMALL LETTER A. Просто, не так ли?

Один из примеров, в котором этот подход не работает – греческий язык. Символ Σ — то есть, U+03A3 GREEK CAPITAL LETTER SIGMA — сопоставлен двум разным символам при преобразовании в нижний регистр, в зависимости от того, где он находится в слове. Если он стоит на конце слова, тогда в нижнем регистре он будет ς (U+03C2 GREEK SMALL LETTER FINAL SIGMA). В любом другом месте это будет σ (U+03C3 GREEK SMALL LETTER SIGMA).

Регистр зависит от локали

В разных языках правила преобразования регистра разные. Самый популярный пример: i (U+0069 LATIN SMALL LETTER I) и I (U+0049 LATIN CAPITAL LETTER I) в большинстве локалей преобразовываются друг в друга – в большинстве, но не во всех. В локалях az и tr (тюркские языки), i в верхнем регистре будет İ (U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE), а I в нижнем регистре будет ı (U+0131 LATIN SMALL LETTER DOTLESS I). Иногда правильная запись реально означает разницу между жизнью и смертью.

Сам Unicode не обрабатывает все возможные правила преобразования регистра для всех локалей. В базе данных Unicode есть только общие правила преобразования всех символов, не зависящие от локали. Также там есть особые правила для некоторых языков и составных форм – литовского языка, тюркских языков, некоторых особенностей греческого. Всего остального там нет. §3.13 стандарта упоминает это и рекомендует при необходимости вводить правила преобразования, зависящие от локали.

Один пример будет знаком англоговорящим – это титульный регистр определённых имён. «o’brian» нужно преобразовывать в «O’Brian» (а не в «O’brian»). Однако при этом «it’s» нужно преобразовывать в «It’s», а не в «It’S». Ещё один пример, который не обрабатывается в Unicode – это голландское буквосочетание «ij», которое при преобразовании в титульный регистр должно переходить в верхний регистр целиком, если стоит в начале слова. Таким образом, большой залив в Нидерландах в титульном регистре будет «IJsselmeer», а не «Ijsselmeer». В Unicode есть символы IJ U+0132 LATIN CAPITAL LIGATURE IJ и ij U+0133 LATIN SMALL LIGATURE IJ, если они вам нужны. По умолчанию преобразование регистра преобразует их друг в друга (хотя формы нормализации Unicode, использующие эквивалентность совместимости, разделят их на два отдельных символа).

Сравнение без учёта регистра требует приведения к сложенному регистру

Возвращаясь к материалу, представленному в докладе. Сложность работы с регистром в Unicode означает, что регистронезависимое сравнение нельзя проводить при помощи стандартных функций приведения к нижнему или верхнему регистру, имеющихся во многих языках программирования. Для таких сравнений в Unicode есть концепция приведения к сложенному регистру [case folding], а в §3.13 стандарта определяются функции toCaseFold и isCaseFolded.

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

На одном из слайдов моего доклада рекомендации Unicode Technical Report #36 реализуются на Python настолько полно, насколько это возможно. Проводится нормализация NFKC и потом для полученной строки вызывается метод casefold() (доступный только в Python 3+). И даже при этом некоторые крайние случаи выпадают, и это не совсем то, что рекомендуется для сравнения идентификаторов. Сначала плохие новости: Python не выдаёт наружу достаточно свойств Unicode для того, чтобы отфильтровать символы, которых нет в XID_Start или XID_Continue или символы, имеющие свойство Default_Ignorable_Code_Point. Насколько мне известно, он не поддерживает отображение NFKC_Casefold. Также в нём нет простого способа использовать модифицированный NFKC UAX #31§5.1.

Хорошие новости: большинство этих крайних случаев не связано с какими-либо реальными рисками безопасности, создаваемыми рассматриваемыми символами. И складывание регистра в принципе не определяется как операция, сохраняющая нормализацию (отсюда и отображение NFKC_Casefold, которое повторно нормализуется до NFC после складывания регистра). Как правило, при сравнении вас не волнует, будут ли обе строки нормализованы после предварительной обработки. Вас заботит, не противоречива ли предварительная обработка, и гарантирует ли она, что только строки, которые «должны» отличаться впоследствии, будут отличаться впоследствии. Если вас это беспокоит, вы можете вручную выполнить повторную нормализацию после сложения регистра.

Пока достаточно

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

Не будет ли наивной моя надежда на то, что другие люди перестанут писать разоблачения из серии «заблуждения по поводу Х, в которые верят программисты», и начнут уже писать статьи типа «правда, которую должны знать программисты»?

Источник

Где находится верхний регистр на клавиатуре

что такое регистр в тексте. Смотреть фото что такое регистр в тексте. Смотреть картинку что такое регистр в тексте. Картинка про что такое регистр в тексте. Фото что такое регистр в текстеПервое, что попадает в руки пользователя компьютерной техникой – это клавиатура и мышка. Умение использовать различные функции с помощью этих атрибутов, позволяют быстро решать поставленные задачи. Если спросить новичка о том, что такое верхний регистр, то он, возможно, укажет на клавиши, расположенные вверху. На самом деле – это далеко не так.

Что такое верхний и нижний регистр на клавиатуре

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

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

С помощью кнопки функционального перевода «Shift» из одного режима в другой, пользователь ПК может переходить на прописные или заглавные буквы при написании текстов, в зависимости от требований к содержанию. Цифры при этом обозначают знаки препинания или другую символику, которую используют при распечатке документов. Иными словами, верхний регистр – это такой режим печати, в котором буквы становятся заглавными, а цифры меняются на символы. Нижний – это обычное изображение цифровых и буквенных обозначений.

Где находится верхний регистр

Две клавиши перевода из одного режима печати в другой расположены на клавиатуре: одна слева внизу, а другая справа – тоже в нижней части. Это сделано для удобства быстрого набора текстов. Если буква, которую нужно написать заглавной находится справа, то используют левую сторону. При переходе нажимают одновременно, сначала «Shift», а затем требуемый знак. А при расположении нужного символа слева – наоборот. Если пользователю удобно одной рукой нажимать обе клавиши, то он делает именно так, например, чтобы отобразить запятую!

ВНИМАНИЕ! Клавиатура некоторых мобильных устройств может иметь только одну клавишу «Shift». Это связано с компактностью размеров оргтехники.

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

Удобство применения верхнего режима позволяет быстро переключить функцию нужного символа из одного положения – в другое. Кроме того, слева, над кнопкой «Shift» расположена клавиша с надписью «Caps Lock», которая имеет такое же функциональное назначение, но другой принцип работы.

Способы переключения регистра на клавиатуре

При наборе текстов используют два режима переключения:

Первый из перечисленных способов переключает клавиатуру только в момент нажатия на клавишу «Shift». Как только пользователь её отпускает, печать продолжается в обычном режиме – прописными буквами.

Второй способ позволяет, после нажатия кнопки «Caps Lock», перейти в верхний регистр и печатать заглавные буквы до тех пор, пока не отпадёт необходимость в использовании таковых. Отдельный индикатор клавиатуры загорается при включении такого режима и гаснет только при повторном нажатии указанной клавиши, что подтверждает переход на прописные обозначения.

ВАЖНО! При включении «Caps Lock», использование кнопки «Shift» будет иметь противоположное действие: при нажатии – обычные символы, а после отпускания – заглавные буквы.

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

Наличие навыков быстрого перехода из одного регистра в другой, позволяет пользователям ПК с удобством набирать требуемые тексты, быстро вставляя необходимые символы и заглавные буквы.

Источник

Начинаем изучать 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 не будет опубликован. Обязательные поля помечены *