UART и USART. COM-порт. Часть 1
[Home] [< Prev: Семисегментный индикатор. Динамическая индикация] [Next: UART и USART. COM-порт. Часть 2 >]

UART и USART. COM-порт. Часть 1

UART и USART: введение
Варианты подключения UART
Формат передачи данных UART
Управление потоком данных
COM-порт (интерфейс стандарта RS-232)
Гальваническая развязка для COM-порта
USART в STM32 (STM32F100xx)
Регистры USART в микроконтроллерах STM32F100xx
   USART_SR (Status register): регистр состояния
   USART_DR (Data register): регистр данных
   USART_BRR (Baud rate register): регистр скорости передачи
   USART_CR1 (Control register 1): регистр управления 1
   USART_CR2 (Control register 2): регистр управления 2
   USART_CR3 (Control register 3): регистр управления 3
   USART_GTPR (Guard time and prescaler register): регистр защитного интервала и прескалера



UART и USART: введение

UART (Universal Asynchronous Receiver/Transmitter) - универсальный асинхронный приёмопередатчик, интерфейс для связи цифровых устройств, предназначенный для передачи данных в последовательной форме. Очень распространён и весьма востребован, имеет аппаратную реализацию во многих микроконтроллерах. Например, микроконтроллеры STM32 из семейства STM32F100xx, в зависимости от варианта исполнения, содержат 2 или 3 USART.

USART (Universal Synchronous-Asynchronous Receiver/Transmitter) - универсальный синхронно-асинхронный приёмопередатчик - аналогичный UART интерфейс, но дополнительно к возможностям UART, поддерживает режим синхронной передачи данных - с использованием дополнительной линии тактового сигнала. Впрочем, синхронная передача используется гораздо реже асинхронной.

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

Варианты подключения UART

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

Выход обозначают TD или TX (transmitted data), вход - RD или RX (received data). Для подключения двух устройств выход одного подключают ко входу другого и вход первого - к выходу второго.

Связь двух UART

Возможен вариант использования UART для полудуплексной двунаправленной связи по одному проводу. В этом случае выводы TX и RX каждого устройства соединяют вместе. Всё время, пока устройства не передаёт данных, оно держит выход в отключённом состоянии (переводит в Z-состояние, состояние с высоким сопротивлением; можно использовать режим работы с открытым стоком - во время паузы в передаче на выходе UART формируется лог. 1, что равносильно переходу в Z-состояние). Устройство может иметь аппаратную поддержку полудуплексного обмена данными, тогда требуется лишь выбрать нужный режим работы. Если аппаратной поддержки нет, полудуплексный режим легко реализуется программно. Для этого нужно отключать передатчик, когда устройство не передаёт данных, чтобы освободить линию для осуществления передачи другими устройствами и отключать приёмник во время работы своего передатчика, чтобы не принимать собственную передачу (либо программно отбрасывать данные, передаваемые своим передатчиком).

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

Однопроводная сеть UART

Как видим, объединять устройства с помощью UART очень просто. Для двунаправленного подключения требуются только три проводника (с учётом общего провода), а для однонаправленного или двунаправленного полудуплексного - всего два.

Формат передачи данных UART

В отсутствии передачи на выходе UART присутствует уровень лог. 1.

Данные передаются в виде посылок (фреймов), каждая из которых состоит из стартового бита, битов данных и одного или нескольких стоп-битов. Длительность всех битов одинакова, связана со скоростью передачи соотношением T=1/S. Существует ряд стандартных скоростей передачи: 110, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 бод. Если внутри одного устройства связь можно осуществлять на произвольной скорости, то для связи с внешними устройствами следует придерживаться стандартных величин.

Формат передачи данных UART

Посылка начинается со стартового бита, он всегда имеет значение лог. 0. После стартового бита передаются биты данных. Количество битов данных может составлять 5-9 в зависимости от настроек UART. Обычно передаётся 8 бит данных или 9 бит (8 бит собственно данных и один бит чётности). Завершается посылка стоп-битами, их значение - всегда лог. 1, количество обычно составляет 1, 1.5 или 2. Под количеством стоп-битов понимается длительность соответствующего им единичного импульса по отношению к длительности битов данных и старт-бита. Этим объясняется возможность выражать количество битов дробным числом. Сразу же после стоп-битов может начинаться передача следующей посылки или может быть пауза произвольной длительности, во время которой на выходе также формируется уровень лог. 1.

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

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

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

Согласование скоростей передатчика и приёмника UART

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

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

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

Аппаратное управление потоком данных UART

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

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

COM-порт (интерфейс стандарта RS-232)

COM-порт - интерфейс компьютера, соответствующий стандарту RS-232. Раньше компьютеры, как правило, имели два COM-порта. Затем COM-порт начал вытесняться USB-интерфейсом и сейчас у компьютера может быть всего один COM-порт или вообще ни одного. Если в компьютере отсутствует COM-порт, то можно использовать переходник USB-COM.

Хотя он и считается устаревшим для использования в компьютерах, тем не менее, интерфейс стандарта RS-232 ещё не утратил полностью своего значения и существует оборудование, где он используется. Интерфейс не обеспечивает высокой скорости передачи данных (максимум 115200 бод), но зато прост и дёшев в реализации, надёжен.

RS-232 является стандартом физического уровня для интерфейса UART. Он определяет набор используемых сигнальных линий и уровни для сигналов. Используемые уровни сильно отличаются от традиционных ТТЛ или КМОП-уровней. Во-первых, используются двухполярные сигналы, во-вторых - сигнал положительной полярности соответствует логическому нулю. Для согласования уровней сигналов интерфейса RS-232 и остальной части схемы на обычной логике, используются специализированные микросхемы для преобразования уровней.

Для сигналов используются следующие уровни.

Для драйвера (выход):
+5..+15 В - лог. 0 (SPACE);
-5..-15 В - лог. 1 (MARK).

Вход должен иметь сопротивление в пределах 3..7 кОм и должен быть рассчитан на сигналы:
+3..+25 В - лог. 0;
-3..-25 В - лог. 1.

Требуется, чтобы любой вывод интерфейса выдерживал замыкание на любой другой вывод и на источник напряжения 5 В.

Сигналы интерфейса RS-232
COM RS-232 DB-9P DB-25P I/O Назначение
PG AA 5 1 - Protective Ground - защитная земля, соединяется с корпусом прибора.
SG AB 5 7 - Signal Ground - общий провод для сигнальных линий.
TD BA 3 2 O Transmitted data - передача данных из порта.
RD BB 2 3 I Received Data - приём данных в порт.
RTS CA 7 4 O Request to send - запрос COM-порта на передачу данных (сигнал COM-порта о готовности принимать данные).
CTS CB 8 5 I Clear to send - вход для разрешения COM-порту передавать данные.
DSR CC 6 6 I Data set ready - вход сигнала готовности от подключённого к порту устройства.
DTR CD 4 20 O Data terminal ready - сигнал готовности COM-порта к обмену данными.
CD CF 1 8 I Carrier Detected - сигнал обнаружения несущей (от модема).
RI CE 9 22 I Ring indicator - сигнал от модема о получении звонка.

В таблице указаны обозначения для сигналов принятые для COM-порта, обозначения в соответствии с RS-232, номера выводов в разъёмах и краткое описание назначения сигналов.

Для подключения к интерфейсу используются 25-контактные или 9-контактные разъёмы (DB25, DB9). Первоначально применялись 25-контактные разъёмы, но многие сигналы не использовались устройствами. В связи с этим произошёл переход к 9-контактным разъёмам. В оконечном оборудовании используются разъёмы типа вилка (Pin): DB-9P. В аппаратуре передачи данных (модемы, например) используются разъёмы типа розетка (Socket): DB-9S.

Гальваническая развязка для COM-порта

Схема гальванической развязки для интерфейса RS-232

Для преобразования сигналов между уровнями ТТЛ/КМОП логики и уровнями RS-232 существуют специализированные микросхемы.

Также есть варианты очень простых схем на оптронах, которые обеспечивают не только согласование уровней, но и гальваническую развязку между подключаемыми устройствами - очень ценное свойство схемы. Выше приведён пример такой схемы. С указанными номиналами элементов обеспечивает скорость передачи до 2400 бод. Уменьшая сопротивление резистора R5, можно увеличить быстродействие (скорость 9600 бод достижима практически на любых оптронах).

Аппаратный контроль потоком данных по линиям CTS/RTS здесь не используется. Питание схемы со стороны COM-порта осуществляется от сигнальных линий самого COM-порта, но для её работы требуется программная конфигурация COM-порта: на выходе RTS должен быть установлен уровень лог. 1 (-5..-15 В), а на выходе DTR - уровень лог. 0 (+5..+15 В). Это существенный недостаток схемы, требующий учёта в программе для компьютера, обычные программы-терминалы не будут правильно работать. Недостаток устраним, но тогда схема станет менее простой.

Работает предложенная схема гальванической развязки для COM-порта следующим образом. Когда на TD выходе UART установлен уровень лог. 0 (обычные КМОП-уровни для микроконтроллеров), ток через светодиод оптрона U1 отсутствует, транзистор оптрона заперт, за счёт резистора R1 от выхода DTR(+) COM-порта на входе RD устанавливается положительный относительно общего провода потенциал, что соответствует уровню лог. 0 для RS-232. Если на выходе TD устройства UART установлена лог. 1, транзистор оптрона U1 открывается и RD вход COM-порта подключается к выходу RTS (-), за счёт чего на входе RD формируется отрицательный потенциал (лог. 1 для RS-232).

Оптрон U2 отвечает за передачу данных в обратном направлении. Когда на TD выходе COM-порта установлен уровень лог. 0 (положительный потенциал), транзистор оптрона U2 открывается, формируя лог. 0 на входе UART. Если на выходе TD COM-порта устанавливается лог. 1 (отрицательный потенциал), транзистор оптрона U2 закрывается и за счёт подтягивающего к высокому уровню резистора на входе RD устройства UART формируется логическая 1.

Если разъём P1 отключён от COM-порта, или компьютер выключен, то это будет восприниматься как "линия свободна" (отсутствие передачи данных), на вход USART микроконтроллера при этом будет подаваться лог. 1. Допускается подключение разъёма P1 к COM-порту работающего компьютера, это не приведёт к повреждению оборудования, но в некоторых случаях, в момент подключения, компьютер может получить какое-то количество случайных байтов.

D1, D2 - защищают светодиоды оптронов от обратного напряжения.
R1 - формирует смещение на входе RD COM-порта при закрытом транзисторе оптрона U1.
R2, R3 - ограничивают ток через светодиоды оптронов.
R4 - защищает вывод микроконтроллера от неправильного подключения или неправильного конфигурирования его режима работы, можно заменить перемычкой.
R5 - внешний подтягивающий резистор. Сопротивление внутреннего подтягивающего резистора микроконтроллера довольно велико и подключение внешнего улучшает скоростные характеристики канала передачи от COM-порта к UART микроконтроллера (уменьшает время переключения из состояния лог. 0 в лог. 1 на входе RD устройства UART). Может быть исключён.

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

USART в STM32 (STM32F100xx)

USART в микроконтроллерах STM32 предоставляет гибкие средства для полнодуплексного обмена данными с внешними устройствами в последовательном формате с возможностью поддержки сигналов CTS/RTS; поддерживает полудуплексный обмен по однопроводной линии; может работать в широком диапазоне скоростей передачи. В мультибуферном режиме DMA достигается высокая скорость передачи данных, максимальное значение составляет 3 Мбит/с. Также поддерживается однонаправленная передача в синхронном режиме; мультипроцессорная связь; LIN (local interconnection network) - сеть для локальной связи; smartcard протокол; инфракрасный протокол в соответствии со спецификацией IrDA (infrared data association) SIR ENDEC.

Основные возможности:

Функциональная схема USART в микроконтроллерах STM32.

Функциональная схема USART в микроконтроллерах STM32

SW: Single Wire - вывод для однопроводного подключения устройств.

В обычном двунаправленном полнодуплексном режиме требуется как минимум два вывода для подключения USART: RX (Receive Data In) и TX (Transmit Data Out).

RX: вход для последовательных данных. Для извлечения данных используется техника оверсэмплинга (супердискретизации), когда чтение входа осуществляется с частотой, в несколько раз превышающей скорость передачи данных (в данном случае в 8 или 16 раз). Сопоставление считанной последовательности с предопределёнными шаблонами позволяет выделить фронт сигнала, определить значение принимаемого бита и обнаружить шум при его наличии в принимаемом сигнале.

TX: выход для передачи данных в последовательной форме. Когда передатчик отключён, вывод возвращается в состояние, заданное конфигурацией порта ввода-вывода. Когда передатчик включён, но никаких данных не передаётся, на выходе TX устанавливается высокий уровень (паузе в передаче данных, или свободной линии соответствует наличие лог. 1 в линии). В однопроводном режиме или режиме смарт-карты этот вывод используется как для передачи, так и для приёма данных (поэтому на схеме он обозначен как TX/SW).

SCLK: выход для тактового сигнала при синхронной передаче данных, соответствует мастер-режиму SPI. Тактовые импульсы не формируются во время старт и стоп-битов. Наличие импульса во время передачи последнего бита данных определяется программно. Параллельно может происходить синхронный приём данных на входе RX. Фаза и полярность импульсов задаются программно. В режиме смарт-карты вывод SCLK может формировать тактовый сигнал для смарт-карты.

IrDA_RDI: Receive Data Input - вход для получаемых данных в IrDA режиме.

IrDA_TDO: Transmit Data Output - выход для передаваемых данных в IrDA режиме.

nCTS: Clear To Send - высокий уровень на входе приостанавливает передачу данных после завершения текущей посылки.

nRTS: Request to send - низкий уровень на этом выходе сигнализирует о готовности USART принимать данные.

Программно приём и передача данных через интерфейс USART осуществляется путём чтения и записи регистра данных DR. Записываемые в регистр данные помещаются в регистр передаваемых данных TDR, а затем, когда завершится текущая передача, копируются в передающий сдвигающий* регистр. Если в данный момент ничего не передаётся, данные сразу помещаются в сдвигающий регистр. Сдвигающий регистр преобразует данные из параллельной формы представления в последовательную: схема управления с заданной тактовой частотой сдвигает содержимое регистра на 1 бит вправо. Сдвигаемые биты, начиная с младшего, подаются на выход USART. Кроме того, схема управления формирует стартовый бит, бит чётности (если используется) и стоп-биты.
* Сдвигающий регистр также называют регистром сдвига или сдвиговым регистром.

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

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

Регистры USART в микроконтроллерах STM32F100xx

USART_SR (Status register): регистр состояния
USART_DR (Data register): регистр данных
USART_BRR (Baud rate register): регистр скорости передачи
USART_CR1 (Control register 1): регистр управления 1
USART_CR2 (Control register 2): регистр управления 2
USART_CR3 (Control register 3): регистр управления 3
USART_GTPR (Guard time and prescaler register): регистр защитного интервала и прескалера

USART_SR (Status register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved CTS LBD TXE TC RXNE IDLE ORE NF FE PE  
rc_w0 rc_w0 r rc_w0 rc_w0 r r r r r  

Значение после сброса: 0x00C0.
Примечание. После сброса установлены флаги TXE (регистр передаваемых данных пуст) и TC (передача завершена).

CTS: CTS flag - флаг изменения состояния nCTS. Устанавливается аппаратно, когда происходит переключение сигнала на входе nCTS. Если установлен бит CTSIE (USART_CR3.CTSIE==1), то при установке флага генерируется прерывание. Флаг сбрасывается программно записью 0.

LBD: LIN break detection flag - флаг приёма посылки Break. Устанавливается аппаратно при обнаружении посылки Break на входе; если установлен бит LBDIE (USART_CR3.LBDIE==1), то генерируется прерывание. Флаг сбрасывается программно записью 0.

TXE: Transmit data register empty - флаг устанавливается аппаратно, когда содержимое регистра передаваемых данных TDR пересылается в сдвигающий регистр (доступ к TDR осуществляется путём записи в регистр USART_DR). Если установлен бит TXEIE (USART_CR1.TXEIE==1), генерируется прерывание. Флаг сбрасывается путём записи в регистр USART_DR.
Примечание.
1. Этот бит используется в процессе однобуферной передачи.
2. После сброса этот бит установлен.

TC: Transmission complete - флаг завершения передачи, устанавливается аппаратно, если передача фрейма завершена, и флаг TXE установлен (т.е. регистр передаваемых данных пуст, больше нет данных для передачи). Если USART_CR1.TCIE==1, то при установке флага генерируется прерывание. Флаг сбрасывается программно последовательностью действий: чтение регистра USART_SR, затем запись в USART_DR. Также бит может быть сброшен записью в него 0.
Примечание. После сброса этот бит установлен.

RXNE: Read data register not empty - регистр данных для чтения не пуст. Флаг устанавливается аппаратно, когда содержимое принимающего сдвигающего регистра передаётся в регистр принимаемых данных RDR. Если USART_CR1.RXNEIE==1, при этом генерируется прерывание. Флаг сбрасывается чтением из регистра USART_DR. Также бит может быть сброшен записью в него 0.

IDLE: IDLE line detected - линия свободна. Флаг устанавливается аппаратно, если обнаружено что линия свободна. Это происходит, если получен целый фрейм единиц (лог. 1 на входе в течение целого фрейма). При этом генерируется прерывание, если USART_CR1.IDLEIE==1. Флаг сбрасывается программно последовательностью действий: чтение регистра USART_SR с последующим чтением из регистра USART_DR.
Примечание. IDLE бит не будет установлен снова до тех пор, пока не произойдёт установка флага RXNE (т.е. следующее освобождение линии будет обнаружено только после приёма данных).

ORE: Overrun error - ошибка переполнения. Флаг устанавливается аппаратно, когда слово, полученное в сдвигающей регистр готово к перемещению в регистр принимаемых данных RDR, но RXNE==1 (регистр RDR не пуст, содержит ещё не прочитанные из него принятые USART данные). Если USART_CR1.RXNEIE==1, то при установке флага генерируется исключение. Флаг сбрасывается программно последовательностью действий: чтение из регистра USART_SR с последующим чтением из USART_DR.
Примечание. Когда флаг устанавливается, содержимое регистра RDR не теряется, но сдвигающий регистр будет перезаписан следующими принимаемыми данными. В случае мультибуферной связи, прерывание генерируется при установке флага ORE, если установлен бит USART_CR3.EIE.

NF: Noise detected flag - флаг устанавливается аппаратно при обнаружении шума в полученном фрейме. Сбрасывается программно последовательностью действий: чтение из регистра USART_SR, затем чтение из регистра USART_DR.
Примечание.
1. Этот бит не генерирует прерывание, но если он устанавливается, это происходит в тот же момент, что и установка флага RXNE (регистр данных для чтения не пуст), а этот флаг сам генерирует прерывание. В случае мультибуферной связи прерывание генерируется при установке флага NF, если установлен в 1 бит EIE (USART_CR3.EIE==1).
2. В заведомо свободных от шума линиях, флаг NF может быть отключён установкой в 1 бита USART_CR3.ONEBITE, что увеличивает устойчивость USART к отклонениям тактовой частоты приёмника (к рассогласованию скоростей передатчика и приёмника).

FE: Framing error - ошибка фрейма. Флаг устанавливается аппаратно в случае нарушения синхронизации, чрезмерного шума в линии, при обнаружении символа Break. Флаг сбрасывается программно последовательностью действий: чтение из регистра USART_SR, затем чтение из регистра USART_DR.
Примечание. В отношении генерации прерывания этот флаг полностью аналогичен флагу NF.

PE: Parity error - ошибка чётности. Флаг устанавливается аппаратно, когда в принятом фрейме обнаружена ошибка чётности (если контроль чётности включён). Если USART_CR1.PEIE==1, то генерируется прерывание. Флаг сбрасывается программно последовательностью действий: чтение из регистра USART_SR, затем чтение либо запись регистра USART_DR. Перед сбросом флага, программа должна дождаться установки флага RXNE (регистр данных для чтения не пуст).

USART_DR (Data register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved DR[8:0]  
rw rw rw rw rw rw rw rw rw  

Значение после сброса: неопределённое.

DR[8:0]: Data value - регистр данных. Содержит полученный или передаваемый символ, в зависимости от того, производится чтение из него или запись в регистр. Регистр выполняет двойную функцию за счёт того, что он является составным, он объединяет в себе два регистра: один для передачи (TDR) и один для приёма (RDR). TDR обеспечивает загрузку данных в выходной сдвигающий регистр, сдвигающий регистр преобразует загруженное в него слово в последовательную форму. Получаемые в последовательной форме данные накапливаются в приёмном сдвигающем регистре, когда фрейм получен полностью, данные из сдвигающего регистра передаются в регистр RDR, который реализует параллельный интерфейс между внутренней шиной микроконтроллера и входным сдвигающим регистром.

Когда осуществляется передача данных с включённым контролем чётности (USART_CR1.PCE==1), старший бит, записываемый в регистр USART_DR (бит [7] или [8], в зависимости от выбранной длины слова, см. USART_CR1.M), не учитывается. Он замещается вычисленным битом чётности.

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

USART_BRR (Baud rate register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
DIV_Mantissa[11:0] DIV_Fraction[3:0]  
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw  

Значение после сброса: 0x0000.

DIV_Mantissa[11:0]: mantissa of USARTDIV - целая часть коэффициента деления делителя частоты.

DIV_Fraction[3:0]: fraction of USARTDIV - дробная часть коэффициента деления. В режиме с OVER8==1 в битовом поле DIV_Fraction[3:0] старший бит [3] не используется и должен быть сброшен.

С помощью регистра USART_BRR задаётся скорость передачи - одновременно как для приёмника USART, так и для передатчика.

Система тактирования USART

USART получает тактовый сигнал с шины APB2 (USART1) или с шины APB1 (USART2, USART3). По умолчанию, и в том, и в другом случае частота тактового сигнала равна тактовой частоте ядра, которая, в свою очередь, по умолчанию для устройств STM32F100xx обычно составляет 24 МГц. Тактовый сигнал поступает на вход делителя, который управляется регистром USART_BRR. Коэффициент деления зависит от значения в регистре USART_BRR, обозначим коэффициент как USARTDIV. С выхода делителя сигнал подаётся на схему управления приёмником, а на схему управления передатчиком тактовый сигнал подаётся через ещё один делитель с коэффициентом 16 или 8, в зависимости от бита USART_CR1.OVER8. В общем виде его коэффициент деления выражается соотношением 8*(2-OVER8), т.е. 16 при OVER=0 и 8 при OVER=1. Скорость передачи равна частоте тактового сигнала, который получает передатчик. Приёмник получает тактовый сигнал с частотой в 8 или 16 раз больше - это требуется для реализации метода оверсэмрлинга.

Таким образом, скорость передачи S в k раз меньше частоты f тактового сигнала USART: S=f/k. Коэффициент k - общий коэффициент деления двух названных выше делителей частоты, k=USARTDIV*8*(2-OVER8). Величина k выражается целым числом, начиная с 16 или 8 (если OVER8=0 или 1) с точностью до 1. Соответственно, USARTDIV выражается дробным числом (с фиксированной точкой, 4 бита или 3 бита после точки). С этим связано разделение регистра USART_BRR на целую и дробную части: DIV_Mantissa[11:0] и DIV_Fraction[3:0].

В руководстве указано, что
USARTDIV=DIV_Mantissa+DIV_Fraction/(8*(2-OVER8)).

Соотношения между USART_BRR, DIV_Mantissa и DIV_Fraction:
DIV_Mantissa=USART_BRR>>4;
DIV_Fraction=USART_BRR&0xF;

Следовательно, в режиме с OVER==0 получаем, что S=f/USART_BRR, т.е. общий коэффициент деления просто равен содержимому регистра USART_BRR, если рассматривать его как целое число. Соответственно, USART_BRR=round(f/S).

В режиме с OVER==1 получается несколько более сложное соотношение из-за того, что бит [3] регистра не используется и должен быть равен 0. В этом случае
USART_BRR=k&0x7|(k<<1)&0xFFF0; где k=round(f/S). В обратную сторону:
k=((USART_BRR&0xFFF0)>>1)|USART_BRR&0x7.

USART_CR1 (Control register 1)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
OVER8 Res. UE M WAKE PCE PS PEIE TXEIE TCIE RXNEIE IDLEIE TE RE RWU SBK  
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw  

Значение после сброса: 0x0000

OVER8: Oversampling mode - выбор метода оверсэмплинга.
0: 16-кратный;
1: 8-кратный (недоступен в режимах Smartcard, IrDA и LIN; в этих режимах бит сбрасывается аппаратно).

UE: USART enable - включить USART (включается установкой бита в 1). Когда бит программно сбрасывается, в конце передачи текущего байта прекращается работа прескалеров и выходов для уменьшения потребления тока.

M: Word length - длина слова, задаёт количество бит данных в одном фрейме. Бит не должен модифицироваться в процессе обмена данными (это касается как передачи, так и приёма).
0: 1 старт-бит, 8 бит данных, n стоп-битов (количество стоп-битов программируется с помощью USART_CR2.STOP);
1: 1 старт-бит, 9 бит данных, n стоп-битов.
Примечание. Бит чётности считается битом данных.

WAKE: Wakeup method - метод пробуждения USART.
0: "линия свободна" (Idle line);
1: адресная метка.

PCE: Parity control enable - включить аппаратный контроль чётности (генерация бита чётности при передаче данных и проверка в принимаемых данных). Когда контроль чётности включён, бит чётности помещается в позицию старшего бита данных (9-й или 8-й бит, в зависимости от выбранной длины слова). После установки, контроль чётности активируется после завершения приёма/передачи текущего бита.
0: контроль чётности отключён;
1: контроль чётности включён.

PS: Parity selection - выбор метода контроля чётности. Выбор происходит после завершения передачи/приёма текущего байта.
0: контроль на чётность;
1: контроль на нечётность.

PEIE: PE interrupt enable - разрешение прерывания от PE.
0: прерывание запрещено;
1: генерируется прерывание от USART, когда USART_SR.PE==1.

TXEIE: TXE interrupt enable - разрешение прерывания от TXE.
0: прерывание запрещено;
1: генерируется прерывание от USART, когда USART_SR.TXE==1.

TCIE: Transmission complete interrupt enable - разрешение прерывания после завершения передачи.
0: прерывание запрещено;
1: генерируется прерывание от USART, когда USART_SR.TC==1.

RXNEIE: RXNE interrupt enable - разрешение прерывания от RXNE.
0: прерывание запрещено;
1: генерируется прерывание от USART, когда USART_SR.ORE==1 или USART_SR.RXNE==1.

IDLEIE: IDLE interrupt enable - разрешение прерывания при обнаружении, что "линия свободна" (Idle line).
0: прерывание запрещено;
1: генерируется прерывание от USART, когда USART_SR.IDLE==1.

TE: Transmitter enable - включить передатчик USART (включается установкой бита в 1).
Примечание.
1. Если в процессе передачи сформировать 0-импульс в бите TE (сбросить в 0 с последующей установкой в 1), происходит передача преамбулы (формируется сигнал "линия свободна" - Idle line) вслед за текущим словом. Преамбула не формируется в smartcard режиме.
2. После установки бита TE делается задержка длительностью в 1 бит (длительностью 1/S, где S - скорость передачи данных) перед началом передачи данных.

RE: Receiver enable - включить приёмник USART (включается установкой бита в 1). После установки бита, приёмник начинает поиск старт-бита во входном сигнале.

RWU: Receiver wakeup - переводит USART в тихий режим. Этот бит устанавливается и сбрасывается программно, а также может сбрасываться аппаратно при обнаружении пробуждающей последовательности.
0: приёмник в активном режиме;
1: приёмник в тихом режиме.
Примечание.
1. Прежде чем установить бит RWU, USART должен получить байт данных, иначе он не сможет функционировать в тихом режиме с пробуждением при обнаружении свободной линии (Idle line).
2. В конфигурации с пробуждением при обнаружении адресной метки (бит WAKE==1), бит RWU не может быть программно модифицирован, пока установлен бит RXNE.

SBK: Send break - отправить Break посылку. Бит может быть установлен и сброшен программно. Его необходимо программно установить в 1 для формирования Break посылки, он будет сброшен аппаратно во время формирования stop-бита в Break фрейме.
0: Break-символ не передаётся;
1: Break-символ будет передан.

USART_CR2 (Control register 2)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Res. LINEN STOP[1:0] CLKEN CPOL CPHA LBCL Res. LBDIE LBDL Res. ADD[3:0]  
rw rw rw rw rw rw rw rw rw rw rw rw rw  

Значение после сброса: 0x0000
Примечание: биты CLKEN, CPOL, CPHA, LBCL; длительность стоп-битов 0.5 и 1.5 недоступны для UART4 и UART5.

LINEN: LIN mode enable - включить режим LIN (включается установкой бита в 1). В режиме LIN имеется возможность отправлять и принимать синхронизирующую посылку Break.

STOP[1:0]: STOP bits - битовое поле задаёт количество используемых стоп-битов.
00: 1 стоп-бит;
01: 0.5 стоп-бита;
10: 2 стоп-бита;
11: 1.5 стоп-бита.

CLKEN: Clock enable - включить выход SCLK (включается установкой бита в 1).

CPOL: Clock polarity - полярность тактового сигнала на выходе SCLK в синхронном режиме. Этот бит используется совместно с CPHA битом.
0: 0 на выходе SCLK в отсутствие передачи данных;
1: 1 на выходе SCLK в отсутствие передачи данных.

CPHA: Clock phase - фаза тактового сигнала на выходе SCLK в синхронном режиме.
0: первый захват данных происходит по первому перепаду тактового сигнала;
1: первый захват данных происходит по второму перепаду тактового сигнала.
Перепады тактового сигнала, по которым фиксируются данные, приходятся примерно на середину передаваемого (принимаемого) бита.

LBCL: Last bit clock pulse - разрешить тактовый импульс на выходе SCLK для последнего бита передаваемых данных в синхронном режиме.
0: тактовый импульс не формируется для последнего бита (старшего бита) во фрейме;
1: тактовый импульс формируется для последнего бита.

Биты CPOL, CPHA, LBCL не должны изменяться при включённом передатчике USART.

LBDIE: LIN break detection interrupt enable - разрешить прерывание при обнаружении Break посылки.
0: прерывание запрещено;
1: прерывание генерируется всякий раз, когда бит USART_SR.LBD==1.

LBDL: lin break detection length - дина детектируемой Break посылки.
0: обнаружение 10-битовой Break посылки;
1: обнаружение 11-битовой Break посылки.

ADD[3:0]: Address of the USART node - битовое поле, с помощью которого назначается адрес узла USART; используется для мультипроцессорной связи для пробуждения из тихого состояния при обнаружении адресной метки.

USART_CR3 (Control register 3)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved ONEBITE CTSIE CTSE RTSE DMAT DMAR SCEN NACK HDSEL IRLP IREN EIE  
rw rw rw rw rw rw rw rw rw rw rw rw  

Значение после сброса: 0x0000
Примечание: биты CTSIE, CTSE, RTS, SCEN, NACK недоступны в устройствах UART4 и UART5.

ONEBITE: One sample bit method enable - выбор метода сэмплирования входного сигнала.
0: используется трёхбитный метод;
1: используется однобитный метод; выбор этого метода отключает флаг обнаружения шума NF.

CTSIE: CTS interrupt enable - разрешить прерывание от CTS.
0: прерывание запрещено;
1: прерывание генерируется всякий раз, когда устанавливается в 1 бит USART_SR.CTS.

CTSE: CTS enable - включить контроль сигнала CTS.
0: отключить аппаратный контроль управления потоком CTS;
1: включить аппаратный контроль управления потоком CTS, передача нового фрейма может начаться только в случае, когда на входе nCTS установлен низкий уровень nCTS==0. На передачу текущего фрейма сигнал nCTS не влияет.

RTSE: RTS enable - включить управление сигналом RTS.
0: отключить аппаратный контроль управлением потоком посредством сигнала RTS.
1: разрешить прерывание от RTS, данные запрашиваются только при наличии свободного места в приёмном буфере - на выходе nRTS устанавливается 0, если данные могут быть приняты.

DMAT, DMAR - управление обменом с использованием DMA.

SCEN: Smartcard mode enable - включить смарт-карт режим (включается установкой бита в 1).

NACK: Smartcard NACK enable - в смарт-карт режиме включить передачу NACK (нет подтверждения) в случае ошибки чётности (включается установкой бита в 1).

HDSEL: Half-duplex selection - выбор полудуплексного режима (включается установкой бита в 1).

IRLP: IrDA low-power - выбор между нормальным и низкопотребляющим IrDA режимами:
0: нормальный режим;
1: режим с низким потреблением.

IREN: IrDA mode enable - включить режим IrDA (включается установкой бита в 1).

EIE: Error interrupt enable - разрешить прерывание в случае ошибки при мультибуферном обмене (генерировать прерывание при установке в регистре USART_SR флага FE - ошибка фрейма, ORE - переполнение, NF - шум). Мультибуферный обмен включается установкой в 1 бита USART_CR3.DMAR.
0: прерывания запрещены; 1: прерывание генерируется всякий раз, когда USART_CR3.DMAR==1 и в регистре USART_SR хотя бы один из флагов FE, ORE или NF установлен в 1.

USART_GTPR (Guard time and prescaler register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
   
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
GT[7:0] PSC[7:0]  
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw  

Значение после сброса: 0x0000.

Примечание: этот регистр недоступен в устройствах UART4 и UART5.

GT[7:0]: Guard time value - защитный интервал времени. Это битовое поле используется в смарт-карт режиме и задаёт время задержки перед установкой флага "Transmission Complete". Величина задаётся в количестве тактов с частотой, равной скорости передачи данных.

PSC[7:0]: Prescaler value - значение для предварительного делителя частоты; используется в режимах IrDA и смарт-карт; восьмибитовое значение определяет коэффициент деления для прескалера, который делит частоту системного тактового сигнала. Значение 0 зарезервировано и не должно использоваться.

Значение в обычном режиме IrDA: 1. Значения больше 1 используются в режимах с малым потреблением.

В смарт-карт режиме используется для обеспечения требуемой тактовой частоты; в этом режиме делитель определяется 5 младшими битами поля, значение делителя получается умножением поля на 2 (значение поля 1 соответствует делителю 2, 2 соответствует делителю 4 и т.д.).

author: hamper; date: 2016-01-19; modified: 2016-01-27
  @Mail.ru