Стартовый бит. Итак, что из себя представляла установка. Задание к работе в лаборатории

3.1 Последовательный асинхронный интерфейс UART

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

Типичный представитель асинхронного последовательного интерфейса - UART (Universal Asynchronous Receiver-Transmitter - универсальный асинхронный приёмопередатчик).

При передаче по интерфейсу UART каждому байту данных предшествует СТАРТ-бит , сигнализирующий приемнику о начале посылки, за СТАРТ-битом следуют биты данных. Завершает посылку СТОП-бит , гарантирующий паузу между посылками. СТАРТ-бит следующего байта посылается в любой момент после СТОП-бита, то есть между передачами возможны паузы произвольной длительности. СТАРТ-бит, обеспечивает простой механизм синхронизации приемника по сигналу от передатчика. Внутренний генератор синхроимпульсов приемника использует счетчик-делитель опорной частоты, обнуляемый в момент приема начала СТАРТ-бита. Этот счетчик генерирует внутренние стробы, по которым приемник фиксирует последующие принимаемые биты.

3.2 Особенности работы UART микроконтроллера ADuC842

В микроконтроллере ADuC842 последовательный порт UART является полнодуплексным - позволяет передавать и принимать данные одновременно. В рассматриваемом микроконтроллере прием через последовательный порт буферизирован: порт может начать принимать байт данных еще до того как предыдущий байт будет считан из буферного регистра приемника. Однако, если до конца приема предыдущий байт не будет считан из буфера, он будет потерян: новый принятый байт перезапишет старый.

Принимаются и передаются данные по разным линиям, передача происходит через вывод TxD микроконтроллера (Transmitter Data - передатчик данных), прием - через RxD (Receiver Data - приемник данных). Физически выводы RxD и TxD совмещены с выводами третьего параллельного порта P3.0 и P3.1 соответственно.

Программное взаимодействие с последовательным портом UART осуществляется через регистры специальных функций (SFR) SBUF и SCON . Через SBUF (Serial buffer - последовательный буфер) осуществляется доступ к регистрам приемника и передатчика последовательного порта. Когда программно производится запись в SBUF , то данные загружаются в регистр передатчика, когда же программой происходит чтение SBUF , то осуществляется доступ к регистру приемника. Физически регистры приемника и передатчика разделены. SFR адрес - 0х99.

SCON - регистр конфигурации и управления последовательным портом микроконтроллера.
SFR адрес - 0x98 .
0x00 .
Регистр имеет побитовую адресацию.

Таблица 1 – Назначение бит регистра SCON

номер мнемоника описание
7 SM0 SM1 , SM0 биты определяют режим работы последовательного порта.
SM0 SM1 Выбранный режим
0 0 режим 0: синхронный режим с фиксированной скоростью f core/2 .
0 1 режим 1: 8-битный асинхронный режим с настраиваемой скоростью передачи данных.
1 0 режим 2: 9-битный асинхронный режим с фиксированной скоростью f core /32 или f core /16.
1 1 режим 3: 9-битный асинхронный режим с настраиваемой скоростью передачи данных.
6 SM1
5 SM2 Бит управления режимом приемопередатчика. Устанавливается программно для запрета приема сообщения, в котором девятый бит имеет значение “0”. Такой режим используется при реализации сетевого протокола в многопроцессорной системе.
4 REN Бит разрешения приема данных через последовательный порт. Устанавливается программно, для разрешения приема.
3 TB8 9-ый бит передатчика последовательного порта. Данные загруженные в TB8 передаются девятым битом. Это актуально для режима работы UART 2 и 3.
2 RB8 9-ый бит приемника последовательного порта. В режиме работы 2 и 3 в этот бит загружается принятый девятый бит данных. В режиме 1 в этом бите хранится СТОП-бит.
1 TI Флаг прерывания передатчика последовательного порта. Устанавливается аппаратно при окончании передачи байта. Флаг должен сбрасываться (запись “0”) программно.
0 RI Флаг прерывания приемника последовательного порта. Устанавливается аппаратно при окончании приема байта. Флаг должен сбрасываться (запись “0”) программно.

Режим работы 0: режим 8-битного сдвигового регистра. Для выбора этого режима работы следует в биты SM0 и SM1 записать логические нули (SM1 = 1 и SM0 = 0 ). В этом режиме данные последовательно передаются и принимаются через вывод RxD . Вывод TxD используется для подачи тактовых импульсов. Передача инициируется любой инструкцией, записывающей данные в регистр SBUF . Передача байта данных начинается с младшего значащего бита. Прием начинается, когда бит разрешения приема установлен в единицу (REN = 1 ), а флаг прерывания приемника сброшен в ноль (RI = 0 ). Таким образом, в данном случае последовательный порт работает в синхронном режиме, поэтому у некоторых семейств микроконтроллеров такой последовательный порт называется не UART, а USART (Universal Synchronous-Asynchronous Receiver-Transmitter - универсальный синхронный - асинхронный приемопередатчик).

Режим работы 1: асинхронный 8-битный режим с настраиваемой скоростью. Для выбора первого режима следует в бит SM0 записать единицу, а в бит SM1 - ноль (SM1 = 0 и SM0 = 1 ). Вывод микросхемы TxD используется для передачи информации, вывод RxD - для приема.

Передача байта информации начинается с посылки СТАРТ-бита, за ним идут восемь информационных бит, заканчивается передача СТОП-битом. Таким образом, для передачи каждого байта информации используется 10 бит. Формирование СТАРТ-бита и СТОП-бита происходит автоматически.

Скорость передачи может устанавливаться Таймером 1 или Таймером 2 , или комбинацией их обоих: один - для передачи, другой - для приема. Использование таймеров 1 и 2 характерно для всего семейства MCS-51/52, правда Таймер 2 есть только в старших моделях, но в микроконтроллере ADuC842 возможна синхронизация приемопередатчика UART от специального Таймера 3, что позволяет освободить таймеры общего назначения для выполнения других функций.

Передача данных начинается, когда в регистр SBUF программно записывается передаваемое число. Данные передаются до тех пор, пока на TxD не поступит СТОП-бит, после чего флаг прерывания передатчика (TI ) установится в единицу, как это показано на рисунке ниже:

Рисунок 1 – Диаграмма передачи байта

Для разрешения приема данных через последовательный порт в бит REN следует записать логическую единицу. Прием байта данных начинается с приходом на линию RxD СТАРТ-бита: перехода линии из высокого логического уровня в низкий. По окончанию приема всего байта флаг прерывания приемника RI устанавливается в единицу, и принятый байт может быть программно считан из буферного регистра SBUF .

Режим работы 2: асинхронный 9-битный режим с фиксированной скоростью. Скорость передачи данных по умолчанию f core /32, но если записать в бит SMOD регистра PCON логическую единицу, то скорость передачи будет удвоена: f core /16. Для выбора второго режима следует в бит SM0 записать логический ноль, а в бит SM1 - единицу (SM1 = 1 и SM0 = 0 ).

В этом режиме каждая передаваемая или принимаемая посылка состоит из одиннадцати бит: СТАРТ-бит, восемь информационных бит, девятый программируемый бит и СТОП-бит. Девятый бит часто используют в качестве бита паритета при контроле четности, хотя он может быть использован для любых других целей.

Прием и передача во втором режиме осуществляется аналогично первому режиму. Девятый бит при передаче программно записывается в бит TB8 регистра SCON , при приеме девятый бит находится в RB8 регистра SCON .

Режим работы 3: асинхронный 9-битный режим с настраиваемой скоростью. Для выбора третьего режима следует в биты SM0 и SM1 записать логические единицы (SM1 = 1 и SM0 = 1 ). В этом режиме последовательный порт UART работает также как в режиме 2, только скорость задается таймерами 1, 2 или 3, так же, как и в режиме 1.

Во всех четырех режимах передача данных начинается любой инструкцией, записывающей в регистр SBUF число. В режиме 0 прием начинается при условии RI = 0 и REN = 1 . Во всех остальных режимах прием начинается с приходом СТАРТ-бита при условии, что в бит REN записана логическая единица (REN = 1 ).

3.3 Расчет параметров синхронизации UART

По умолчанию последовательный порт микроконтроллера ADuC842 настроен на синхронизацию от Таймера 1. Скорость передачи UART определяется временем переполнения таймера:

где T T – время срабатывания таймера.

Таймер должен быть сконфигурирован для работы в режиме с автоперезагрузкой (режим 2). Для установки такого режима в старшие 4 бита регистра TMOD следует записать бинарную комбинацию 0010b. В этом случае скорость передачи данных будет определяться по формуле:

где: f core – частота ядра микропроцессора, TH1 – содержимое регистра данных TH1 .

Из формулы 2 легко найти значение регистра TH1 , обеспечивающего требуемую скорость:

Результат вычисления должен быть округлен до ближайшего целого.

Используя Таймер 1 для синхронизации UART не всегда возможно получить требуемую частоту с достаточной точностью. Например, пусть при тактовой частоте ядра микропроцессора 2097кГц (значение для ADuC842 по умолчанию), требуется получить скорость передачи 19.2 кбит/с. По формуле 3 найдем значение TH1:

Используя полученное значение TH1, рассчитаем реальную скорость передачи UART:

Реальная скорость на 14% меньше требуемой, а это значит, что передача данных невозможна. Проблема была решена добавлением специального таймера 3, специализированного для высокоточной синхронизации UART в широком диапазоне частот. Кроме того, использование специализированного таймера высвобождает таймеры общего назначения для решения других различных задач.

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


Рисунок 2 – Структурная схема Таймера 3

Для управления Таймером 3 предназначены два регистра специальных функций - T3CON и T3FD . Регистр T3CON содержит бит T3EN , при записи в него логической единицы синхронизация UART будет происходить от Таймера 3, в противном случае - от Таймера 1. Младшие три бита регистра T3CON определяют двоичный делитель DIV . Дробный коэффициент деления настраивается регистром T3FD .

T3CON – регистр конфигурации Таймером 3.
SFR адрес - 0x9E .
Значение после подачи питания 0x00 .

Таблица 2 – Назначение битов регистра T3CON

номер мнемоника описание
7 T3EN Разрешение Таймера 3.
Когда бит установлен (T3EN = 1 ) синхронизация приемника и передатчика последовательного порта происходит от Таймера 3.
Когда бит сброшен (T3EN = 0 ) - синхронизация от Таймера 1.
6 Не используются
5
4
3
2 DIV2 Биты целочисленного делителя DIV .
DIV2 DIV1 DIV0 DIV
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
1 DIV1
0 DIV0

T3FD – регистр Таймера 3.
SFR адрес - 0x9D .
Значение после подачи питания 0x00 .
Регистр не имеет побитовой адресации.

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

где f core - частота ядра микроконтроллера.

Значение делителя DIV можно определить по формуле 5, полученное значение следует округлить до целого вниз.

Дробный делитель T3FD можно найти по формуле 6, полученное значение следует округлить до ближайшего целого.

Рассчитаем параметры конфигурации Таймера 3, для предыдущего примера: при тактовой частоте ядра микропроцессора 2097кГц, требуется получить скорость передачи 19.2 кбит/с.

Таким образом, ошибка установления скорости составляет всего 0.2%.

3.4 Особенности представления текстовой информации

В различных операционных системах для представления текстовой информации используют специальные наборы символов. Как правило, такой набор представляют в виде таблице, где каждому символу соответствует бинарная последовательность длиною в один или несколько байт. В литературе подобную таблицу символов часто называют «кодировкой». На сегодняшний день наиболее распространенным является код ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией), который используется для внутреннего представления символьной информации в операционной системе MS DOS, в Блокноте операционной системы Windows, а также для кодирования текстовых файлов в Интернет.

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

Таблица 3 – Таблица ASCII

.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
0. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2. ! " # $ % & " ( ) * + , - . /
3. 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4. @ A B C D E F G H I J K L M N O
5. P Q R S T U V W X Y Z [ \ ] ^ _
6. ` a b c d e f g h i j k l m n o
7. p q r s t u v w x y z { | } ~ ...

Таблица кодов содержит 8 столбцов и 16 строк, каждая строка и столбец пронумерованы в шестнадцатеричной системе счисления. Шестнадцатеричное представление ASCII-кода складывается из номера столбца и номера строки, в которых располагается символ, при этом номер строки образуют первую цифру (старшие четыре бита), а номер столбца вторую цифру (младшие 4 бита). Так, например, ASCII-код символа “E” есть число 0x45, а символа “\“ - 0x5C.

Легко заметить, что в приведенной таблице представлено 128 символов, притом, что один символ кодируется байтом - восьмью битами. Дело в том, что верхние значения (128-255) могут занимать различные дополнительные символы, например, набор русского алфавита, это зависит от конкретного типа кодировки.

3.5 Способы программной реализации работы UART

Перед первым обращением к приемо-передатчику UART последовательный порт должен быть настроен: определен режим работы, выбран и настроен источник синхронизации. Режим работы UART устанавливается битами SM0 и SM1 регистра SCON . Так как регистр имеет как байтовую, так и битовую адресацию, выполнить настройку можно разными способами: записать в регистр SCON требуемое число или установить каждый бит отдельно. Источник синхронизации определяется битом T3EN регистра T3CON : если в этот бит записать логическую единицу, то синхронизация будет происходить от Таймера 3, если ничего не записывать (по умолчанию T3EN = 0 ), то синхронизация от Таймера 1.

При использовании Таймера 1 необходимо сконфигурировать его для работы в режиме 2 (свободнобегущий таймер с автоперезагрузкой), для этого в старшие четыре бита регистра SMOD следует записать двоичную комбинацию 0010b. Регистр счетчика TH1 определяет скорость передачи информации по UART, его значение следует рассчитать по формуле 3. После записи TH1 таймер нужно запустить, делается это записью в бит TR1 регистра TMOD логической единицы.

При синхронизации от Таймера 3, по формулам 5 и 6 рассчитываются делители DIV и T3FD . Если запись делителя T3FD делается непосредственно в регистр T3FD , то делитель DIV определяется младшими тремя битами регистра T3CON , при этом в старший бит этого регистра (T3EN ) должна быть записана логическая единица. Запуск таймера происходит автоматически.

Отправление данных по UART начинается любой командой, результат выполнения которой записывается в регистр SBUF :

SBUF =0x45; // отправить символ “E”

Можно каждый раз не пользоваться таблицей ASCII для определения кода символа, в языке «Си» для этого есть удобный инструмент: достаточно взять требуемый символ в апострофы, компилятором это будет интерпретировано как код символа.

SBUF ="E"; // отправить символ “E”

Если же требуется отправить не один символ, то прежде чем следующий код будет записан в SBUF , следует подождать, пока предыдущий символ будет отправлен. О конце передачи сигнализирует флаг TI регистра TCON , когда передача завершена, в бит TI аппаратно записывается логическая единица. Можно программно организовать в цикле проверку TI на равенство нулю, а следующий байт отправлять только тогда, когда TI окажется равен единице:

SBUF = 0x45 ; // отправить символ “E” while (! TI) ; // пока TI равен нулю, выполнять пустой цикл TI = 0 ; // сбросить флаг для следующей передачи

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

while (! RI) ; // ждем завершение приема байта cmd = SBUF; // считываем принятый байт в переменную cmd RI = 0 ; // сброс флага приема

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

while (! TI) ; // подождать, пока буфер передачи не освободится (если занят) SBUF = 0x45 ; // заполнить буфер и начать передачу TI = 0 ; // сбросить флаг передачи в нуль

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

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


Рисунок 3 – Адреса регистров специальных функций

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

3.6 Взаимодействие микроконтроллера с персональным компьютером

Учебный лабораторный стенд LESO1 подключается к персональному компьютеру через микросхему преобразователя интерфейсов USB-UART. Для связи с микроконтроллером в программе загрузчика nwFlash реализован терминал. Терминал позволяет посылать через последовательный порт в микроконтроллер информацию, принимать и отображать принятую из микроконтроллера информацию. Настройка терминала осуществляется в пункте главного меню «Опции терминала». Опции терминала позволяют:

  1. выбрать режим отображения данных: текстовый или шестнадцатеричный, при этом изменяется также тип посылаемых данных;
  2. выбрать кодировку ANSI (Windows-1251) или ASCII (DOS-866);
  3. включать и выключать режим автоматической прокрутки текста;
  4. очистить окно терминала;
  5. сохранять принятую от микроконтроллера информацию в файл:
    • в том виде, как она пришла - пункт меню «Сохранить»;
    • в том виде, как она отображается в терминале - пункт меню «Сохранить как текст».

На рисунке 4 показана вкладка главного меню «Опции терминала».


Рисунок 4 – Настройка опций терминала Рисунок 5 – Настройка скорости UART

При обмене данными с учебным стендом необходимо установить требуемую скорость подключения. Сделать это можно в меню «подключение», как это показано на рисунке 5.

4 Задание к работе в лаборатории

4.1 Вывод информации через последовательный порт

  1. Разработайте алгоритм программы, передающей через последовательный порт UART данные в персональный компьютер - фамилию студента. Скорость передачи данных должна соответствовать варианту (таблица 5). Источник синхронизации UART (Таймер 1 или Таймер 3) согласовывается с преподавателем. Взаимодействие микроконтроллера с компьютером осуществляется через терминал программы загрузчика - nwFlash.
  2. По таблице регистров специальных функций (SFR) определите адреса регистров управления и настройки последовательного порта.
  3. Определите значение регистров настройки последовательного порта и таймера, используемого для синхронизации.
  4. Рассчитайте значения регистров таймера, используемого для синхронизации.
  5. Войдите в интегрированную среду программирования Keil-C. Создайте и настройте должным образом проект.
  6. Разработайте и введите текст программы в соответствии с созданным алгоритмом.
  7. Оттранслируйте программу, и исправьте синтаксические ошибки.
  8. Настройте скорость UART терминала программы nwFlash соответственно заданию.
  9. Загрузите полученный *.hex файл в лабораторный стенд LESO1 .
  10. Убедитесь, что в окне терминала вывелась фамилия студента.

4.2 Управление микроконтроллером через последовательный порт (дополнительно)

  1. Измените программу таким образом, чтобы данные из микроконтроллера отсылались только по команде, переданной с компьютера. Передача команды осуществляется через терминал nwFlash.
  2. Загрузите полученный *.hex файл в лабораторный стенд LESO1 .
  3. Убедитесь, что программа работает должным образом.

Таблица 5 – Варианты заданий

номер вариант скорость UART
1 300 бит/с
2 600 бит/с
3 1200 бит/с
4 1800 бит/с
5 2400 бит/с
6 4800 бит/с
7 7200 бит/с
8 9600 бит/с
9 600 бит/с
10 1200 бит/с
11 1800 бит/с
12 2400 бит/с
13 4800 бит/с
14 7200 бит/с
15 9600 бит/с

5 Указания к составлению отчета

Отчет должен содержать:

  1. Цель работы.
  2. Диаграмму передачи данных по последовательному порту.
  3. Расчет параметров синхронизации (настройки таймеров).
  4. Графическую схему алгоритма работы программы.
  5. Исходный текст программы.
  6. Содержимое файла листинга программного проекта.
  7. Выводы по выполненной лабораторной работе.

Схемы, а также отчет в целом, выполняются согласно нормам ЕСКД.

Universal Asynchronous Receiver-Transmitter, UART — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. Преобразует передаваемые данные в последовательный вид так, чтобы было возможно передать их по цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применялся в компьютерной технике.

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

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

Последовательный порт

serial port , COM-порт , communications port ) — сленговое название интерфейса стандарта RS-232 , которым массово оснащались персональные компьютеры . Порт называется «последовательным», так как информация через него передаётся по одному биту , последовательно бит за битом (в отличие от параллельного порта). Несмотря на то, что некоторые интерфейсы компьютера (например, Ethernet , FireWire и USB) тоже используют последовательный способ обмена информацией, название «последовательный порт» закрепилось за портом стандарта RS-232 .

В настоящее время в IBM PC-совместимых компьютерах практически вытеснен интерфейсом USB .

Существуют стандарты на эмуляцию последовательного порта над USB и над Bluetooth (эта технология в значительной степени и проектировалась как «беспроводной последовательный порт»).

Метод передачи и приёма

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

Существует общепринятый ряд стандартных скоростей: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 бод.

Скорость (, бод) и длительность бита (, секунд) связаны соотношением

Скорость в бодах иногда называют сленговым словом битрейт .

Помимо собственно информационного потока, UART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты . При приёме эти лишние биты удаляются из потока. Обычно стартовый и стоповый биты обрамляют один байт информации (8 бит), однако встречаются реализации UART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит.

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

Принято соглашение, что пассивным (в отсутствие потока данных) состоянием входа и выхода UART является логическая 1.

Стартовый бит всегда логический 0, поэтому приёмник UART ждёт перепада из 1 в 0 и отсчитывает от него временной промежуток в половину длительности бита (середина передачи стартового бита). Если в этот момент на входе всё ещё 0, то запускается процесс приёма минимальной посылки. Для этого приёмник отсчитывает 9 битовых длительностей подряд (для 8-битных данных) и в каждый момент фиксирует состояние входа. Первые 8 значений являются принятыми данными, последнее значение проверочное (стоп-бит).

Значение стоп-бита всегда 1 , если реально принятое значение иное, UART фиксирует ошибку.

Для формирования временных интервалов передающий и приёмный UART имеют источник точного времени (тактирования). Точность этого источника должна быть такой, чтобы сумма погрешностей (приёмника и передатчика) установки временного интервала от начала стартового импульса до середины стопового импульса не превышала половины (а лучше хотя бы четверти) битового интервала. Для 8-битной посылки 0,5/9,5 = 5 % (в реальности не более 3 %). Поскольку эта сумма ошибок приёмника и передатчика плюс возможные искажения сигнала в линии, то рекомендуемый допуск на точность тактирования UART — не более 1,5 %.

Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например, для 8-битных посылок формата 8-N-1 синхронизирующие биты занимают 20 % потока, что для физической скорости 115 200 бод даёт битовую скорость данных 92 160 бит/с или 11 520 байт/с.

Контроль чётности

Основная статья: Бит чётности

Многие реализации UART имеют возможность автоматически контролировать целостность данных методом контроля битовой чётности. Когда эта функция включена, последний бит данных в минимальной посылке («бит чётности») контролируется логикой UART и содержит информацию о чётности количества единичных бит в этой минимальной посылке. Различают контроль на четность (англ. Even parity ), когда сумма количества единичных бит в посылке является четным числом , и контроль на нечетность (англ. Odd parity ), когда эта сумма нечетна. При приеме такой посылки UART может автоматически контролировать бит четности и выставлять соответствующие признаки правильного или ошибочного приема.

Короткая запись параметров

Был выработан и прижился короткий способ записи параметров UART, таких, как

количество бит данных - наличие и тип бита четности - количество стоп-бит .

Выглядит как запись вида цифра-буква-цифра , где:

  • Первая цифра обозначает количество бит данных, например, 8.
  • Буква обозначает наличие и тип бита четности.

N (No parity) — без бита четности;

E (Even parity) — с битом проверки на четность,

O (Odd parity) — с битом проверки на нечетность;

  • Последняя цифра обозначает длительность стоп-бита.

Встречаются значения 1, 1.5 и 2 для длительности стоп-бита в 1, 1.5 и 2 битовых интервала соответственно.

Например, запись 8-N-1 обозначает, что UART настроен на 8 бит данных без бита четности и один стоповый бит. Для полноты параметров эту запись снабжают указанием.

Break

Специальная посылка - состоит из

непрерывного нулевого состояния линии длительностью заведомо больше минимальной посылки, обычно 1,5 минимальных посылки (для 8N1 это 15 битовых интервалов). Некоторые коммуникационные протоколы используют это свойство, например, протокол LIN использует Break для обозначения нового кадра.

Управление потоком

Ранние устройства с UART могли быть настолько медлительными, что не успевали обрабатывать поток принимаемых данных.

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

Позже управление потоком возложили на коммуникационные протоколы (например, методом XOn/XOff), и надобность в отдельных линиях управления потоком постепенно исчезла.

Физический уровень

Логическая схема UART имеет входы-выходы с логическими уровнями, соответствующими полупроводниковой технологии схемы: КМОП , ТТЛ и т. д. Такой физический уровень может быть использован в пределах одного устройства, однако непригоден для коммутируемых длинных соединений по причине низкой защищённости от электрического разрушения и помехоустойчивости.

Помните, когда у принтеров, мышей и модемов были толстые кабели с этими огромными неуклюжими разъемами? Те, которые буквально должны были ввинчиваться в компьютер? Мало кто знает, что эти UART-компоненты использовались для связи с вашим компьютером. Почти полностью заменила эти старые кабели и разъемы технология USB. UART-интерфейсы, описание которых найдете в этой статье, не ушли в прошлое. Их используют во многих проектах электроники DIY для подключения GPS, Bluetooth и модулей считывания карт RFID к Pi, Arduino или другим микроконтроллерам.

UART-интерфейс: описание

UART означает универсальный асинхронный приемник/передатчик. Это не коммуникационный протокол, такой как SPI и I2C, а физическая схема в микроконтроллере. Основной целью является передача и получение информации. Одно из лучших достижений технологии заключается в том, что он использует только два провода.

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

Введение в коммуникацию UART

UART RS485 передае т данные асинхронно, что означает отсутствие сигнала для синхронизации выхода битов от передающего устройства к принимающему. Вместо тактового сигнала передающий UART добавляет биты начала и окончания передаваемого пакета. Эти параметры определяют начало и конец документа.

Когда принимающий UART обнаруживает стартовый бит, он начинает считывать входящие биты с определенной частотой, известной как скорость передачи. Скорость передачи данных является мерой скорости, выраженной в единице измерения, — бит/с. Оба устройства должны работать примерно с одинаковой скоростью передачи. Скорость передачи между передающим и принимающим устройствами может отличаться на 10%.

Оба прибора также должны быть сконфигурированы для передачи и получения той же структуры пакета.

UART — что это и как это работает?

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

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

Технические особенности

Базовая система UART обеспечивает надежную, умеренную скорость, полнодуплексную связь с тремя сигналами: Tx (переданные последовательные данные), Rx (полученные последовательные данные) и земля. В отличие от других протоколов, таких как SPI и I2C, никакого тактового сигнала не требуется, поскольку пользователь предоставляет аппаратному обеспечению UART необходимую информацию о времени.

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

Ключевые термины

Начальный бит - первый бит однобайтовой передачи. Это указывает на то, что линия данных выходит из состояния бездействия. Состояние бездействия обычно имеет логическую высоту, поэтому стартовый бит является логически низким.

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

Стоповый бит - последний бит однобайтовой передачи. Его логический уровень такой же, как состояние простоя сигнала, то есть логический максимум.

Пошаговая процедура

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

Описание интерфейса UART:

    Передающий UART принимает данные параллельно от шины данных и добавляет начальный бит, бит четности и стоп-бит(-ы) в кадр данных.

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

    Принимающий UART отбрасывает начальный бит, бит четности и стоповый бит из кадра данных, преобразует последовательные данные обратно в параллель, передает их на шину данных на принимающей стороне.

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

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

    Добавляет бит четности (если он был выбран) исходящих передач, проверяет четность входящих байтов (если выбрано), отбрасывает бит четности.

    Добавляет разделители начала и окончания исходящих, удаляет их из входящих передач.

Преимущества и недостатки

Не является совершенным, но UART довольно хороши в том, что они делают. Вот некоторые плюсы и минусы, которые помогут решить, соответствуют ли они потребностям вашего проекта:

Преимущества:

    Используется только два провода.

    Нет сигнала синхронизации.

    Имеет бит четности для проверки ошибок.

    Структура пакета данных может быть изменена, если для нее настроены обе стороны.

    Хорошо документированный и широко используемый метод.

Недостатки:

    Размер кадра данных ограничен максимумом в 9 бит.

    Не поддерживает нескольких подчиненных или нескольких мастер-систем.

Кроме того, скорость передачи данных каждого UART-интерфейса Arduino должна находиться в пределах 10% друг от друга.

Раз уж я буду использовать UART для связки устройств блога с Вашими проектами немного расскажу как он устроен и как им пользоваться.

Универсальный асинхронный приемопередатчик (UART) довольно старый и распространенный интерфейс. До недавнего времени разъем COM порта (тот-же UART только уровни напряжения другие) был обязательным атрибутом каждого компьютера. Теперь COM порт постепенно «отмирает» и если на «башнях» он еще не редкость, то на ноутбуках его уже нет и в помине. Но в виду простоты и популярности интерфейса подавляющее большинство микроконтроллеров имеет UART в составе своей периферии. И если персональный компьютер UART перестает удовлетворять из-за низкой скорости и невозможности расширения, то для микроконтроллеров интерфейс удобен и использование его будет продолжаться.
Раз UART есть во многих микроконтроллерах, значит мы его будем использовать как один из интерфейсов связи устройств блога с Вашими электронными устройствами.
Для начала немного теории работы интерфейса (без лишних подробностей). Для связи по интерфейсу UART используется две ножки контроллера RXD – для приема сообщений (Receiver) и TXD – для передачи сообщений (Transmitter). UART — полнодуплексный интерфейс. Это значит, что приемник и передатчик работают независимо друг от друга. Более того, передатчик или приемник можно отдельно отключить, освободив ножку контроллера для других нужд. Передача (соответственно и прием) сообщений осуществляется фиксированными пакетами битов (такой пакет называют кадром). Кадр состоит из старт-бита (с него начинается каждый кадр), битов данных (может быть от 5 до 9 бит), бита проверки четности (проверка правильности передачи данных) и одного или двух стоп-битов (сигнал об окончании кадра).

где:
IDLE — ожидание обмена — должна быть 1 ;
St — Старт-бит — всегда 0 ;
(n) — Биты данных — может быть от 5 до 9 бит;
P — Бит четности;
Sp — Стоп бит — всегда 1.

Если посылка содержит более одного байта, каждый следующий байт передается отдельным кадром. Передача (и прием) данных ведется на определенных фиксированных частотах (измеряется в Бод=бит/сек) от 600 до 128 000 Бод. Условием правильной работы порта есть задание одинаковых параметров, как для приемника, так и для передатчика (скорость, количество бит данных, бит четности, количество стоп битов).

Договоримся о формате кадра (настройках UART) для устройств блога:
Скорость передачи – 9600 (это в пределах килобайта в секунду);
Количество бит данных – 8 (наиболее удобно работать);
Бит четности – Even (производится проверка на четность);
Количество стоп-бит – 1;
В сокращенном варианте это выглядит так:
Baud Rate: 9600, 8 Data, 1 Stop, Even Parity

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

Если нужны дополнительные возможности, то полное описание UART есть в datasheet на микроконтроллер – обращайтесь к нему.

Для того чтобы устройство с блога начало работать с Вашим проектом через интерфейс UART нужно:
1 Подключить устройство блога к соответствующим ножкам микроконтроллера.
2 Настроить приемо-передатчик UART Вашего контроллера. Для этого в соответствующие порта ввода/вывода записать определенные значения.
3 Иметь (написать) процедуры приема/передачи сообщений по UART в Вашей программе.

Теперь рассмотрим подробно каждый пункт:


1 СОЕДИНЕНИЕ УСТРОЙСТВ ПОСРЕДСТВОМ UART.

Тут все просто:
— если планируется и прием и передача — устройства соединяются по двум линиям — TX_устройства с RX_проекта и TX _проекта с RX_устройства (здесь и далее под «устройством» я буду понимать устройство с блога, а под «проектом» — Ваш электронный проект);
— если нужен только прием (например принимаются данные с клавиатуры) — TX_устройства с RX_проекта;
— если нужна только передача (например передаются данные на устройство отображения) — TX _проекта с RX_устройства.


2 НАСТРОЙКА ПРИЕМО-ПЕРЕДАТЧИКА UART.

Как мы договорились выше, формат кадра для наших устройств:
Baud Rate: 9600, 8 Data, 1 Stop, Even Parity
Для работы в с этим форматом кадра нужно в разделе инициализации устройств в Вашей программе, записать соответствующие значения в нужные порта ввода/вывода контроллера. Для этого нужно открыть раздел USART datasheet’а на Ваш микроконтроллер и выбрать/вычислить необходимые значения. Но можно сделать все гораздо проще – использовать автоматические настройщики периферии – CodeWisard’ы.
Возьмем для примера микроконтроллер Attiny2313 (по аналогии можно настроить любой микроконтроллер) и настроим UART в разных языках программирования.

Для начала — Algorithm Builder .
Тут все предельно просто – создаем проект (Файл/Новый ). Выбираем микроконтроллер и частоту задающего генератора в Опции/Опции проекта… (ATtiny2313, внутренний задающий генератор на 8МГц). В панели инструментов жмем кнопочку «S» — настройщик управляющих регистров» выбираем USART и в открывшемся окошке заполняем все как на картинке. Там все подписано и понятно.


Жмем «ОК» . Готово – UART проинициализирован и готов к работе.
Если нужен только приемник или только передатчик ставим только нужную галочку – незадействованную ножку можно использовать как порт ввода-вывода.

Так как в программе будут разрешены прерывания, нужно перед инициализацией USART установить указатель стека на конец памяти («S» /Stack Pointer SP ) и озаглавить вершину блока ключевым словом «Reset ».


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

Переводим в ассемблерные команды.

;USART initialization ;Communication Parameters: 8 Data, 1 Stop, Even Parity ;USART Receiver: On ;USART Transmitter: On ;USART Mode: Asynchronous ;USART Baud Rate: 9600 uart_init: LDI R16, $ 00 OUT UBRRH, R16 LDI R16, $ 33 OUT UBRRL, R16 LDI R16, $ 26 OUT UCSRC, R16 LDI R16, $ 00 OUT UCSRA, R16 LDI R16, $ 98 OUT UCSRB, R16

;USART initialization ;Communication Parameters: 8 Data, 1 Stop, Even Parity ;USART Receiver: On ;USART Transmitter: On ;USART Mode: Asynchronous ;USART Baud Rate: 9600 uart_init: LDI R16, $00 OUT UBRRH,R16 LDI R16, $33 OUT UBRRL,R16 LDI R16,$26 OUT UCSRC, R16 LDI R16,$00 OUT UCSRA, R16 LDI R16,$98 OUT UCSRB, R16

CodeVision содержит свой настройщик периферии (CodeWisard), еще похлеще чем у Algorithm Builder’а. Для генерации настроек UART, нажимаем на значок шестеренку (CodeWisardAVR ) на панели инструментов. В открывшемся окошке сначала выбираем вкладку Chip в ней выбираем микроконтроллер и устанавливаем частоту, с которой будет работать задающий генератор. Далее выбираем и заполняем вкладку USART в соответствии с нужными характеристиками (если нужен только приемник или только передатчик ставим соответствующую галочку).

// USART initialization // Communication Parameters: // 8 Data, 1 Stop, Even Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA= 0x00 ; UCSRB= 0x98 ; UCSRC= 0x26 ; UBRRH= 0x00 ; UBRRL= 0x33 ;

// USART initialization // Communication Parameters: // 8 Data, 1 Stop, Even Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x26; UBRRH=0x00; UBRRL=0x33;

Сохраняем сгенерированный проект (File\Generate, Save and Exit ) — готово. Создан проект со всеми нужными установками для UART. В проекте инициализируется и другая периферия (зачастую не нужная). После создания проекта его можно подкорректировать – удалить все не нужное.


3 СОЗДАНИЕ ПРОЦЕДУР ОБРАБОТКИ СООБЩЕНИЙ UART.

Небольшое отступление.
Работу с UART можно организовать различными способами. Например:
— просто ожидать в теле программы когда придет сообщение, постоянно проверяя бит приема сообщения;
— разрешить прерывание и в теле прерывания обрабатывать сообщение;
— создать буфер куда по прерываниям будут загоняться сообщения, а уже в теле программы, «по свободе», считывать из буфера значения;
— еще куча вариантов – выбор за Вами.
Но , исходя из того, что сообщения от устройств, в большинстве своем, единичные (один байт) и не слишком часты (взять, к примеру, клавиатуру – пару нажатий в секунду, не больше), наилучшим вариантом, в плане экономии памяти и скорости обработки, будет обработка сообщения UART в теле прерывания. Под обработкой я понимаю чтение регистров, проверка на правильность приема и сохранение принятого байта в глобальной переменной (своего рода буфер в один байт). Если предполагаются несложные манипуляции с принятым байтом можно их тоже организовать в теле прерывания.

В дальнейшем я буду ориентироваться на такой алгоритм работы, если другой не будет более оправданным.

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

Если работа с принятым значением несложна можно это сделать прямо в теле обработки прерывания.
Передача данных производиться без использования прерываний и буфера (аппаратно у UART передатчика существует буфер на 2 байта). Это значит, что комфортно будут передаваться только единичные байты (что мы и планируем делать). Если зарядить сразу строку данных, то микроконтроллер будет заниматься только этой строкой.

Ассемблер.
Прием байта осуществляется в прерывании, результат остается в регистре r17 (если нужно сохраните в SRAM).

;Обработка прерывания по окончании приема байта PUSH R16 IN R16, SREG PUSH R16 IN R16, UCSRA ;Читаем статус из UCSRA IN R17, UDR ;Читаем данные из UDR ANDI R16, $ 1C BREQ _END ;Проверяем на ошибки CLR R17 _END: ;в R17 находится принятый байт POP R16 OUT SREG, R16 POP R16 RETI

;Обработка прерывания по окончании приема байта PUSH R16 IN R16,SREG PUSH R16 IN R16,UCSRA ;Читаем статус из UCSRA IN R17,UDR ;Читаем данные из UDR ANDI R16,$1C BREQ _END ;Проверяем на ошибки CLR R17 _END: ;в R17 находится принятый байт POP R16 OUT SREG,R16 POP R16 RETI

Передача байта

LDI R16,значение SBIS UCSRA,UDRE RJMP PC-1 ; ждем готовности принять байт OUT UDR, R16 ; шлем байт


С — в программе CodeVisionAVR .
Тут все просто CodeWizard вместе с инициализацией UART создает и процедуры для приема-передачи. Единственно что можно тут поковырять так это выкинуть буфер для приема (если разрешить прерывания по приему или передаче автоматически создается буфер). Если этот буфер не нужен процедура обработки прерывания приема байта и процедура передачи могут выглядеть так:

// Глобальная переменная - полученные даные от устройства // Эсли FromGCnDevice==0 - ничего не получено char FromGCnDevice; // Обработка прерывания окончания приема байта interrupt [ USART_RXC] void usart_rx_isr(void ) { char status; // Получаем байт статуса и данных status= UCSRA; FromGCnDevice= UDR; // Если произошла ошибка при приеме байта то FromGCnDevice=0 if ((status & amp; (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN) ) != 0 ) FromGCnDevice= 0 ; } // Процедура передачи байта void ToGCnDevice (char c) { // Ждем окончания передачи предідущего байта while ((UCSRA & amp; DATA_REGISTER_EMPTY) == 0 ) ; // Передаем байт UDR= c; }

// Глобальная переменная - полученные даные от устройства // Эсли FromGCnDevice==0 - ничего не получено char FromGCnDevice; // Обработка прерывания окончания приема байта interrupt void usart_rx_isr(void) { char status; // Получаем байт статуса и данных status=UCSRA; FromGCnDevice=UDR; // Если произошла ошибка при приеме байта то FromGCnDevice=0 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))!=0)FromGCnDevice=0; } // Процедура передачи байта void ToGCnDevice (char c) { // Ждем окончания передачи предідущего байта while ((UCSRA & DATA_REGISTER_EMPTY)==0); // Передаем байт UDR=c; }


Во и все про UART. Этого должно хватить для того чтобы подключить устройство к Вашему проекту. По анологии приведенных примеров легко все можно проделать и для других микроконтроллеров АВР.
Ниже оставляю архивы программ с примерами работы UART для ATtiny2313.
- Пример проекта созданного автоматически CodeWisionsAVR
- Пример программы для работы с UART в Algorithm Builder


P.S. Я слабо знаю С и Asm, поэтому пинать и кидать тапками — разрешается! Мы все учимся.


Инициализируется

(Visited 10 796 times, 2 visits today)

Большинство разработчиков встраиваемых систем знают, что такое UART: Universal Asynchronous Receiver/Transmitter (универсальный асинхронный приемник/передатчик). Это периферийное устройство микроконтроллера, преобразующее входящие и исходящие байты в последовательный поток данных. Стартовый бит инициирует начало передачи потока битов, а стоповый бит (или два) завершает слово данных. Кроме того, для выявления ошибок при передаче данных UART может вставлять в поток контрольный бит. На Рисунке 1 показан стандартный пример того, что ожидают увидеть инженеры при передаче данных через UART.

USART - Universal Synchronous/Asynchronous Receiver/Transmitter (универсальный синхронный /асинхронный приемник/передатчик) - ‘это периферийное устройство микроконтроллера, преобразующее входящие и исходящие байты в последовательный поток данных. Хм. Определение USART ничем не отличается от UART, за исключением одного добавленного слова «синхронный». Но должны же быть какие-то более значимые различия? Иначе USART был бы известен просто как UART.

Да, различия есть, причем весьма существенные. Первое отличие USART от UART определяется тем, каким образом могут синхронизироваться последовательные данные. Сигналы тактирования UART генерируются внутри микроконтроллера и синхронизируются с потоком данных по переходу стартового бита. Каких-либо входящих синхросигналов, связанных с данными, здесь нет, поэтому для правильной обработки принимаемых данных приемник должен заранее знать, какой будет скорость передачи.

Напротив, USART может быть настроен для работы в синхронном режиме. В этом режиме отправляющая данные периферия генерирует сигнал синхронизации, который периферией приемной стороны может быть извлечен из потока данных без априорной информации о скорости передачи. Возможен и другой вариант, когда для сигнала синхронизации выделяется отдельная линия. Использование внешнего сигнала синхронизации позволяет USART работать на скоростях до 4 Мбит/с - недостижимых для стандартных UART.

Другое важное отличие USART от UART заключается в количестве поддерживаемых периферийных протоколов. UART прост, и может предложить лишь небольшие вариации базового формата - количество стоповых бит и способ контроля ошибок (по четности или нечетности). USART намного сложнее и способен формировать потоки данных, совместимые со многими стандартными протоколами; IrDA, LIN, Smart Card, Driver Enable для RS-485 и Modbus - лишь несколько из них. При этом USART может, как и UART, работать в асинхронном режиме, что позволяет ему генерировать точно такие же типы последовательных данных, какие показаны на Рисунке 1.

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

Так можно ли говорить, что USART и UART - это одно и тоже? Технически правильный ответ - «нет». USART, как правило, имеет набор функций, расширенный по сравнению с UART, и способен обрабатывать синхронизированные потоки данных на скоростях, во много раз превышающих скорости UART. Действительно, USART может выполнять все функции UART, и, возможно, поэтому во многих приложениях разработчики, имея в руках всю мощь USART, используют их как простые UART, игнорируя преимущества синхронного тактирования. Неудивительно, что очень многие используют эти термины так, будто они являются синонимами.