UART
UART (универсальный асинхронный приемо-передатчик) осуществляет асинхронный полнодуплексный обмен данными по последовательным линиям RX и TX с другими устройствами UART.
Основные характеристики
- изменение скорости передачи заданием коэффициента делителя частоты;
- изменение формата посылки. От 1 до 8 бит в слове данных, 1 или 2 стоп-бита, бит контроля четности (4 режима: odd, parity, space, mark);
- входной и выходной FIFO буферы позволяют снизить количество прерываний от UART. Количество слов в буфере (глубина буфера), при которой формируется прерывание, задается программно. Глубина буферов 8 слов;
- тестовые режимы:
- эхо-режим;
- режим внутренней петли;
- режим внешней петли.
- 9-битный режим с автоматической сверкой адреса для систем из нескольких UART;
- высокоскоростной режим (четыре семпла на бит вместо шестнадцати);
- аппаратный контроль обмена через сигналы RTS и CTS;
- детектирование и формирование break-сигнала;
- тайм-аут программируемой длительности;
- возможность инвертирования логических уровней передачи сигнала.
Структурная схема
UART состоит из следующих блоков:
- REGISTERS – блок для хранения управляющих данных и статусов;
- FIFO_TX – буфер передатчика;
- FIFO_RX – буфер приемника;
- CONTROL – управляющий автомат модуля UART;
- RECEIVER – приемник, реализующий функцию приема интерфейса;
- TRANSMITTER – передатчик, реализующий функцию передачи интерфейса;
- CLOCK_DIVIDER – делитель частоты
Делитель частоты
Делитель частоты модуля UART состоит из двух делителей. Первый делитель осуществляет деление системной частоты на BDR – со держимое специальных регистров UARTBDR0 и UART_BDR1 (от 0 до 65535). Этот делитель определяет скорость обмена. Полученная частота (_sampling_clock) – это частота, с которой приемник сканирует линию RX до приема валидного старт бита.
Второй делитель делит частоту sampling_clock на 16 или на 4 в высокоскоростном режиме. С полученной частотой (baud_rate_clock) передатчик выдает биты на линию TX, а приемник сканирует линию RX в процессе приема посылки. На время передачи одного бита приходится несколько (16 или 4) семпла линии RX, для того чтобы приемник мог синхронизироваться по изменению сигнала RX в процессе работы. Частота работы взаимодействующих UART пересинхронизируется (счетчик-делитель сбрасывается) по старт-биту и каждый раз, когда меняется уровень на линии RX в процессе приема посылки. Это позволяет справиться с «уходом» тактовых частот UART. При BDR = 0 делитель частоты не работает, соответственно не работают приемник и передатчик.
Для установления необходимой скорости обмена необходимо записать в регистры UART_BDR0 и UART_BDR1 соответствующий коэффициент деления, который рассчитывается по формуле:
где FCLK – частота тактирования системы, desired_baud_rate – желаемая скорость передачи (в бодах или в бит/с).
При этом если по формуле получилось не целое число, то в результате округления реальная частота обмена будет несколько отличаться от желаемой. Реальная частота обмена (baud_rate_clock) в бодах рассчитывается по формуле:
Для самого длинного из возможных форматов посылки (12 бит), если ресинхронизации в процессе происходить не будет (то есть посылка состоит из одних единиц/нулей кроме старт/стоп-бита), максимально допустимая разница частот, взаимодействующих UART – 3.6% (2% в высокоскоростном р ежиме). При меньшем формате посылки максимально допустимая разница частот соответственно увеличивается.
Высокоскоростной режим
При выставлении бита «Высокоскоростной режим» регистра UART_CFG0 в «1» меняется коэффициент второго делителя частоты с 16 на 4. Таким образом, в высокоскоростном режиме делитель частоты осуществляет деление на 4*BDR, скорость передачи увеличивается в 4 раза. Формулы выше остаются справедливыми, если заменить число 16 на число 4. При этом синхронизация происходит менее точно. Этот режим рекомендуется использовать только при полном отсутствии помех на линии.
Приемник
После сброса устройства приемник выключен. Для включения необходимо записать «1» в бит RE регистра UARTCTRL. После этого приемник начинает сканировать линию RX c частотой _sampling_clock, ожидая старт-бита (уровня логического нуля). При выключении приемника записью в RE «0», UART перестает сканировать линию, однако если в этот момент шла операция приема данных, она будет закончена, и данные будут помещены в буфер приемника.
UART считает старт-битом логический «0» длительностью больше, чем половина времени передачи одного бита (9/16 baud_rate_clock, то есть 9 семплов sampling_clock). Если уровень логического «0» держится меньшее время, это считается помехой, и UART продолжает сканировать линию на наличие старт-бита. Если логический «0» держится 9 семплов, то приемник начинает сканировать линию с меньшей в 16 раз частотой baud_rate_clock (таким образом, что сканирование на временной диаграмме происходит в предполагаемой середине каждого бита), помещая в регистр сдвига значение на линии RX. Когда вся посылка принята (длина посылки определяется форматом посылки, задающимся в регистрах UART_CFG0 и UART_CFG1), приемник формирует статус наличия break, ошибки четности/совпадения адреса и стоп-бита (а также соответствующие прерывания, если их формирование разрешено в регистре UART_MSK0) и помещает их и принятое слово данных в буфер приемника. Если битов в слове данных выставлено меньше восьми в регистре UART_CFG1, то старшие разряды данных заполняются нулями. Если буфер заполнен, формируется прерывание переполнения буфера приемника. Временная диаграмма работы приемника представлена на рисунке ниже.
Между приемником и выводом RX находится простейший фильтр нижних частот: три последних значения сигнала RX (взятых с частотой sampling_clock) попадают в мажоритар 2 из 3, затем результат поступает в приемник. Таким образом, одиночные помехи линии длиной меньше периода sampling_clock не поступают в приемник. Помехи длиной больше периода sampling_clock могут привести к ошибочной ресинхронизации и ошибке приема.
Буфер приемника
Принятые данные попадают в буфер приемника, откуда могут быть вычитаны программно через регистр UART_RX0. Буфер имеет 11 разрядов, 8 бит данных и 3 разряда под статус наличия break, ошибки четности/совпадения адреса и стоп-бита. Биты RBRPL, RBF, RBNE регистров UART_ST0 и UART_ST1 позволяют контролировать заполненность буфера. Все эти биты равны «0», если приемник выключен.
Передатчик
После сброса устройства передатчик выключен, для включения необходимо записать «1» в бит TE в UART_CTRL. При выключении передатчика записью в TE «0» UART сначала завершает передачу текущего слова данных.
Передатчик выдает биты слова данных, полученного из буфера передатчика, с частотой baud_rate_clock в соответствии с форматом посылки, указанным в UARTCFG0 и UART_CFG1. Примечание: если передатчик и буфер передатчика пусты, от момента записи в UART_TX до начала передачи, может пройти время меньше или равное периоду _baud_rate_clock (время передачи одного бита). Это происходит из-за того, что передатчик ждет следующего импульса baud_rate_clock, чтобы начать передачу посылки.
Буфер передатчика
Передатчик берет данные для отправки из буфера передатчика, куда их можно поместить записью в регистр UART_TX. Буфер передатчика имеет 9 разрядов, 8 из них для передаваемого слова данных. 9-ый бит испо льзуется только в 9-битном режиме как идентификатор адреса и передается вместо бита четности. Биты TBNF, TBRPL, TBE, TI регистра UART_ST1 позволяют контролировать заполненность буфера. Все эти биты равны 0, если передатчик выключен. Если после начальной конфигурации и задания маски прерываний включить передатчик, сработают все эти прерывания.
Прерывания
По любому из битов UART_ST0 или UART_ST1 можно разрешить формировать прерывание, записав «1» в соответствующий бит регистра макси прерываний UART_MSK0 или UART_MSK1 (расположение битов в регистрах одинаково).
Прерывание возникает, как только соответствующее событие было зафиксировано. Из-за наличия буфера может быть не очевидно, при приеме какого именно слова возникла ошибка, поэтому статус наличия break, ошибки четности/совпадения адреса и ошибки стоп-бита данного слова доступны также через младшие разряды регистра UART_RX1.
Таймер тайм-аута
В режиме сканирования линии приемником каждый период baud_rate_clock инкрементируется счетчик-таймера тайм-аута. Он не работает, если приемник выключен. Таймер сбрасывается в «0», как только зафиксирован валидный старт-бит и остается в «0» во время приема данных. После приема стоп-бита, он начинает считать снова. Таймер сбрасывается в «0», при записи «1» в бит RTT регистра UARTCTRL и остается в «0» до момента записи «0» в RTT. Максимальное значение, до которого досчитывает таймер, определяется в разрядах TV регистра UART_CFG0. Возможные значения: 2, 4, 8, 16, 32, 64, 128, 256 периодов _baud_rate_clock. Досчитав до этого значения, таймер останавливается, статусный бит RTO переходит в «1» и генерируется соответствующее прерывание, если его формирование разрешено в регистре UART_MSK0.
Генерация и распознавание сигнала break
Сигнал break, то есть уровень логического «0» на линии на время большее времени передачи посылки, используется как индикатор серьезного сбоя в работе. Даже если никакая информация
не может быть передана из-за слишком большой разности в частотах двух UART, долгий логический «0» на линии может быть правильно принят и интерпретирован приемником. Также в большинстве физических реализаций при разрыве линии сигнал RX также принимает значение логического «0».
Приемник засчитывает за сигнал break посылку, в которой старт-бит, все биты данных, бит четности (если, конечно, бит четности включен в регистре UART_CFG1) и стоп-бит равны «0» (ошибка стоп-бита при этом не возникает). В момент приема последнего из битов бит BD переходит в «1» и генерируется соответствующее прерывание, если его формирование включено в регистре UART_MSK0.
В буфер приемника при этом записывается одно слово из восьми нулей с выставленным в «1» битом BD. Break сигнал может длиться и дольше, приемник ждет конца сигнала, то есть перехода линии RX в «1», и только потом продолжает работу.
Передатчик выдает сигнал break при записи «1» в бит SB регистра UARTCTRL.
Если запись произошла в момент передачи слова, то передача будет закончена перед выдачей сигнала break. Линия TX удерживается в состоянии логического «0» до момента записи «0» в разряд SB, таким образом продолжительность сигнала определяется программно. После окончания сигнала линия TX удерживается в «1» на 12 периодов _baud_rate_clock, чтобы удаленный приемник смог корректно определить конец сигнала, предпринять необходимые действия и начать прием следующей посылки.
Особые режимы работы
Выбор режима работы происходит записью в разряды MODE регистра UART_CFG1.
Эхо-режим
В этом режиме все данные принятые UART с линии RX побитово ретранслируются на линию TX. Передатчик при переходе в этот режим работы автоматически выключается, программно включить его в регистре UART_CTRL нельзя.
Режим внутренней петли
Пины UART TX и RX замыкаются внутри устройства, таким образом, выдаваемая передатчиком информация может быть принята приемником. При этом на линию TX выдается высокий уровень. Этот режим применяется для тестирования работы UART без использования линии и другого UART.
Режим внешней петли
Линии TX и RX замыкаются внутри устройства, таким образом, вся информация, принятая по линии RX, попадает, на линию TX. Отличие от эхо-режима в том, что эта информация не фиксируется приемником UART. Приемник и передатчик при переходе в этот режим работы автоматически выключаются, программно включить их записью в UART_CTRL нельзя.
9-битный режим
9-бит режим, или режим с аппаратным детектированием и сверкой адреса, необходим для соединения по UART одного ведущего устройства с несколькими ведомыми. Этот режим работы может быть полезен при реализации сетевых протоколов, например Modbus RTU. При работе в этом режиме формат посылки тот же, что и в обычном режиме, но вместо бита четности ведущий UART передает бит, определяющий тип данных в посылке: 1 - в посылке содержится адрес ведомого устройства, 0 - в посылке обычное слово данных (настройки бита четности PE и PT в регистрах конфигурации игнорируются в 9-бит режиме). Ведомое устройство распознает свой адрес, принимает последующие данные и/или передает ведущему устройству свои данные.
По умолчанию после включения 9-битного режима приемник не принимает слова данных, а адреса (слова данных с «1» в девятом бите) сравнивает с заданными в регистрах UART_NBADDR0 и UART_NBADDR1 (обычно один адрес индивидуальный для ведомого, а второй – широковещательный, общий для всех ведомых). При этом приемник сравнивает только биты адреса незамаскированные регистром UART_NBMSK. Если адрес совпадает, то приемник посылает его в буфер вместе с 3-мя статусными битами (при чтении этого слова бит PE/AM регистра UART_RX1 установлен в «1», показывая, что это слово – адрес), устанавливает соответствующий статус (PE/AM) в регистре UART_ST0 и формирует прерывание по совпадению адреса, если его формирование разрешено в регистре UART_MSK0. После этого приемник начинает принимать последующие слова данных (с «0» вместо бита четности) и продолжает делать это, пока не получит новую посылку с адресом («1» вместо бита четности). Если в формате посылки выставлено меньше восьми битов в слове, то перед сверкой идет дополнение нулями до восьми разрядов (в 9-битном режиме рекомендуется все же выставить 8 бит в слове, хотя это не обязательно). Передатчик вместо бита четности отправляет значение бита SADDR регистра UART_CTRL.
Аппаратный контроль обмена
Для установления аппаратного контроля обмена необходимо соединить вывод RTS (Request To Send, запрос на отправку данных, выходной сигнал) с выводом CTS того UART, с которым происходит обмен, и соединить вывод CTS (Clear To Send, запрос на получение данных, входной сигнал) с выводом RTS того UART, с которым происходит обмен. При работе в этом режиме передатчик начинает отправку посылки, только если сигнал CTS равен «0».
При работе в этом режиме при приеме старт-бита оценивается состояние буфера приемника. Если в результате приема данного слова буфер приемника будет полностью заполнен, то сигнал RTS переходит из «0» в «1», запрещая удаленному передатчику отправлять следующие данные. Чтение регистра RX переводит RTS обратно из «1» в «0», разрешая удаленному передатчику дальнейшую отправку. Если приемник выключен, RTS равно «1».
В других режимах работы сигнал RTS управляется битом RTS регистра UART_CTRL. Этот сигнал можно использовать для управления внешним приемопередатчиком физического уровня, например RS-485.
Регистры UART
№ | Аббревиатура | Доступ | Описание |
---|---|---|---|
UART0 | |||
2800h | UART0_CFG0 | RW* | Регистр конфигурации 0 |
2801h | UART0_CFG1 | RW* | Регистр конфигурации 1 |
2804h | UART0_BDR0 | RW* | Регистр настройки скорости обмена 0 |
2805h | UART0_BDR1 | RW* | Регистр настройки скорости обмена 1 |
2808h | UART0_TXFIFOLVL0 | RW | Регистр контроля уровня заполнения буфера передатчика 0 |
2809h | UART0_TXFIFOLVL1 | RW | Регистр контроля уровня заполнения буфера передатчика 1 |
280Ch | UART0_RXFIFOLVL0 | RW | Регистр контроля уровня заполнения буфера приемника 0 |
280Dh | UART0_RXFIFOLVL1 | RW | Регистр контроля уровня заполнения буфера приемника 1 |
2810h | UART0_NBMSK | RW | Регистр маски адреса 9-битного режима |
2814h | UART0_NBADDR0 | RW | Регистр фильтра адреса в 9-битном режиме 0 |
2815h | UART0_NBADDR1 | RW | Регистр фильтра адреса в 9-битном режиме 1 |
2818h | UART0_MSK0 | RW | Регистр маски прерываний 0 |
2819h | UART0_MSK1 | RW | Регистр маски прерываний 1 |
281Ch | UART0_CTRL | RW | Регистр управления |
2820h | UART0_TX | W | Регистр буфера передатчика |
2824h | UART0_RX0 | R | Регистр буфера приемника 0 |
2825h | UART0_RX1 | R | Регистр буфера приемника 1 |
2828h | UART0_ST0 | R | Регистр статусов 0 |
2829h | UART0_ST1 | R | Регистр статусов 1 |
UART1 | |||
2900h | UART1_CFG0 | RW* | Регистр конфигурации 0 |
2901h | UART1_CFG1 | RW* | Регистр конфигурации 1 |
2904h | UART1_BDR0 | RW* | Регистр настройки скорости обмена 0 |
2905h | UART1_BDR1 | RW* | Регистр настройки скорости обмена 1 |
2908h | UART1_TXFIFOLVL0 | RW | Регистр контроля уровня заполнения буфера передатчика 0 |
2909h | UART1_TXFIFOLVL1 | RW | Регистр контроля уровня заполнения буфера передатчика 1 |
290Ch | UART1_RXFIFOLVL0 | RW | Регистр контроля уровня заполнения буфера приемника 0 |
290Dh | UART1_RXFIFOLVL1 | RW | Регистр контроля уровня заполнения буфера приемника 1 |
2910h | UART1_NBMSK | RW | Регистр маски адреса 9-битного режима |
2914h | UART1_NBADDR0 | RW | Регистр фильтра адреса в 9-битном режиме 0 |
2915h | UART1_NBADDR1 | RW | Регистр фильтра адреса в 9-битном режиме 1 |
2918h | UART1_MSK0 | RW | Регистр маски прерываний 0 |
2919h | UART1_MSK1 | RW | Регистр маски прерываний 1 |
291Ch | UART1_CTRL | RW | Регистр управления |
2920h | UART1_TX | W | Регистр буфера передатчика |
2924h | UART1_RX0 | R | Регистр буфера приемника 0 |
2925h | UART1_RX1 | R | Регистр буфера приемника 1 |
2928h | UART1_ST0 | R | Регистр статусов 0 |
2929h | UART1_ST1 | R | Регистр статусов 1 |
* – Запись в регистры UART_CFG0, UART_CFG1, UART_BDR0, UART_BDR1 запрещена аппаратно во время работы UART, т.к. изменение содержимого этих регистров во время работы может привести к ошибкам передачи или приема. Поэтому запись в регистры производится один раз в начале работы. Если необходимо изменить содержимое регистров, то приемник и передатчик должны быть выключены, и текущие операции приема/передачи должны закончиться. Когда эти условия выполнены, бит CRWE регистра UART_ST1 переходит в «1», показывая, что запись в эти регистры разрешена.
UARTx_CFG0
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | PT | NSB | HSE | Резерв | TV | |||
Начальное значение | 0 | 4 |
PT (Parity Type) – тип контроля четности:
- 11b – mark, бит четности всегда равен «1»;
- 10b – space, бит четности всегда равен «0»;
- 01b – odd, бит четности формируется как XNOR всех битов данных в слове;
- 00b – even, бит четности формируется как XOR всех битов данных в слове.
NSB (Number of Stop Bits) – количество стоп-битов в посылке:
- 1 – два стоп-бита. Приемник не проверяет наличие второго стоп-бита, эта настройка влияет только на передатчик;
- 0 – один стоп-бит.
HSE (High Speed Enabled) – высокоскоростной режим:
- 1 – высокоскоростной режим включен. Коэффициент делителя частоты равен 4;
- 0 – высокоскоростной режим выключен. Коэффициент делителя частоты 16.
TV (Time-out Value) – длительность тайм-аута в периодах baud_rate_clock:
- 111b – 256;
- 110b – 128;
- 101b – 64;
- 100b – 32;
- 011b – 16;
- 010b – 8;
- 001b – 4;
- 000b – 2.
UARTx_CFG1
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | INVE | MODE | CHRL | PE | ||||
Начальное значение | 0 | 7 | 0 |
INVE (Inversion Enabled) – инверсия сигналов линии:
- 1 – сигналы линии обмена (RX, TX, RTS, CTS) инвертированы. Активный уровень для RX и TX – «0», для RTS и CTS – «1»;
- 0 – сигналы линии обмена не инвертированы.
MODE – режим работы:
- 101b – аппаратный контроль обмена;
- 100b – 9-битный режим;
- 011b – режим внешней петли;
- 010b – режим внутренней петли;
- 001b – эхо-режим;
- 000b – обычный режим работы.
CHRL (Character Length) – размер слова данных:
- 111b – 8 бит;
- 110b – 7 бит;
- 101b – 6 бит;
- 100b – 5 бит;
- 011b – 4 бита;
- 010b – 3 бита;
- 001b – 2 бита;
- 000b – 1 бит.
PE (Parity Enabled) – контроль четности:
- 1 – контроль четности включен, бит четности передается после слова данных;
- 0 – контроль четности выключен, бит четности не формируется.
UARTx_BDR0
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | BDR | |||||||
Начальное значение | 0 |
BDR – коэффициент деления, младшая часть.
UARTx_BDR1
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | BDR | |||||||
Начальное значение | 0 |
BDR – коэффициент деления, старшая часть.
UARTx_TXFIFOLVL0
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв* | TXFIFOLVL | ||||||
Начальное значение | 0 |
* – Не изменять начальное значение.
TXFIFOLVL (Transmitter FIFO Buffer Level) – заданный уровень буфера передатчика. Когда количество слов в буфере передатчика меньше или равно заданному уровню, разряд TBRPL регистра UART_ST1 равен «1». Таким образом, в момент опустошения буфера до заданного уровня, бит TBRPL регистра UART_ST1 переходит из «0» в «1».
UARTx_TXFIFOLVL1
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв* | |||||||
Начальное значение | 0 |
* – Не изменять начальное значение.
UARTx_RXFIFOLVL0
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв* | RXFIFOLVL | ||||||
Начальное значение | 0 |
*– Не изменять начальное значение.
RXFIFOLVL (Receiver FIFO Buffer Level) – заданный уровень буфера приемника. Когда количество слов в буфере приемника больше или равно заданному уровню, разряд RBRPL регистра UART_ST0 равен «1». Таким образом, в момент заполнения буфера до заданного уровня, бит RBRPL регистра UART_ST0 переходит из «0» в «1».
UARTx_RXFIFOLVL1
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв* | |||||||
Начальное значение | 0 |
* – Не изменять начальное значение.
UARTx_NBMSK
Содержимое этого регистра имеет эффект только в 9-битном режиме.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | NBMSK | |||||||
Начальное значение | 255 |
NBMSK (Nine Bit Mode Address Mask) – маска адреса в 9-битном режиме:
- 1 – этот разряд сравнивается при приеме адреса в 9-битном режиме;
- 0 – этот разряд не сравнивается при приеме адреса в 9-битном режиме.
UARTx_NBADDR0
Содержимое этого регистра имеет эффект только в 9-битном режиме.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | NBA2 | |||||||
Начальное значение | 0 |
NBA2 (Nine Bit Mode Address 2) – адрес устройства в 9-битном режиме №2.
UARTx_NBADDR1
Содержимое этого регистра имеет эффект только в 9-битном режиме.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | NBA1 | |||||||
Начальное значение | 0 |
NBA1 (Nine Bit Mode Address 1) – адрес устройства в 9-битном режиме №1.
UARTx_MSK0
Возможно формирование прерывания по любому биту статусного регистра UART_ST0. Расположение битов в UART_ST0 и UART_MSK0 аналогично.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | RBRPL | RBF | OE | RTO | BD | PE/AM | FE | CTSIC |
Начальное значение | 0 |
Для каждого из битов справедливо:
- 1 – данное прерывание формируется;
- 0 – данное прерывание не формируется.
UARTx_MSK1
Возможно формирование прерывания по любому биту статусного регистра UART_ST1. Расположение битов в UART_ST1 и UART_MSK1 аналогично.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | CTSI | CRWE | TBNF | TBRPL | TBE | TI | RBNE |
Начальное значение | 0 |
Для каждого из битов справедливо:
- 1 – данное прерывание формируется;
- 0 – данное прерывание не формируется.
UARTx_CTRL
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | RE | TE | SB | RTS | RTT | SADDR | |
Начальное значение | 0 |
RE (Receiver Enabled):
- 1 – приемник включен;
- 0 – приемник выключен, если в момент выключения происходил прием слова, он будет завершен перед выключением.
TE (Transmitter Enabled):
- 1 – передатчик включен;
- 0 – передатчик выключен, если в момент выключения происходила передача слова, она будет завершена перед выключением.
SB (Send Break) – устанавливает линию TX в «0». Если в этот момент происходила передача посылки, она будет завершена перед выдачей break сигнала. Сигнал заканчивается при записи «0» в этот бит, таким образом длительность сигнала break задается программно. После конца сигнала break линия TX устанавливается в «1» на 12 периодов baud_rate_clock. После этого передатчик продолжает работу.
RTS (Request To Send) – управляет сигналом RTS:
- 1 – пассивный уровень сигнала RTS (RTS установлен в «1», если инверсия сигналов линии не включена битом INVE регистра UART_CFG1);
- 0 – активный уровень сигнала RTS (RTS установлен в «0», если инверсия сигналов линии не включена битом INVE регистра UART_CFG1).
Значение этого бита не имеет эффекта в режиме работы «Аппаратный контроль обмена», так как в этом режиме UART сам управляет сигналом RTS.
RTT (Reset Timeout Timer) – сбросить таймер тайм-аута:
- 1 – таймер тайм-аута сброшен в «0» и не работает;
- 0 – таймер тайм-аута работает.
SADDR (Send Address) – отправить адрес, этот бит имеет эффект только в 9-битном режиме:
- 1 – все записываемые в TX слова отправляются как адреса (с «1» вместо бита четности);
- 0 – все записываемые в TX слова отправляются как слова данных (с «0» вместо бита четности).
UARTx_TX
Запись в этот регистр запрещена, если буфер передатчика полон (бит TBNF регистра ST равен «0»). Стоит избегать записи в заполненный буфер
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | CHTBT | |||||||
Начальное значение | 0 |
CHTBT (Character To Be Transmitted) – слово данных для передачи. Если количество битов в слове (биты CHRL в регистре UART_CFG1) выбрано меньше 8, то передаваемые биты – младшие. Например, если выбрано 5 битов в слове, а в CHTBT записано 00001111b, то передатчик отправит на линию TX 01111b (младшими битами вперед).
UARTx_RX0
Чтение буфера приемника UART_RX0, если тот пуст (бит RBNE регистра UART_ST1 равен «0») приводит к выдаче «0» во всех разрядах. Стоит избегать чтения пустого буфера.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | RCH | |||||||
Начальное значение | 0 |
RCH (Received Character) – принятое слово данных. Если количество битов в слове (биты CHRL в регистре UART_CFG1) выбрано меньше 8, то принятые биты дополняются нулями слева до 8 перед записью в RCH. Например, если выбрано 5 битов данных в слове и приемник принял 10110b, тогда RCH = 00010110b.
UARTx_RX1
Если необходимо считать UART_RX1 и UART_RX0, то сначала нужно считать данные регистра UART_RX1, а затем UART_RX0. Если нужно считать только принятое слово данных, то в чтение регистра UART_RX1 необходимости нет.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | BD | PE/AM | FE | ||||
Начальное значение | 0 |
BD (Break Detected) – это слово данных состоит только из «0», даже вместо стоп-бита, и поэтому было интерпретировано как сигнал break.
PE/AM (Parity Error/Address Match) – значение этого бита зависит от режима работы:
- 1 – обнаружена ошибка четности или это слово – адрес.
- 0 – ошибка четности не обнаружена или это слово – слово данные.
Во всех режимах кроме 9-битного значение бита PE/AM – ошибка четности при приеме данного слова. В 9-битном режиме, где бит четности не используется, этот бит показывает содержимое девятого бита принятого слова. Слово вместе с битами статуса отправляются в буфер приемника, только если адрес совпал при сверке.
FE (Frame Error) – при приеме этого слова произошла ошибка стоп-бита, то есть вместо «1» на месте старт бита принят «0».
UARTx_ST0
Биты BD, PE/AM, FE при приеме слова выставляются в «1» даже в случае, если в буфере приемника не было места, чтобы сохранить принятое слово.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | RBRPL | RBF | OE | RTO | BD | PE/AM | FE | CTSIC |
Тип статуса | FLAG | EVENT | ||||||
Начальное значение | 0 |
RBRPL (Receiver Buffer Reached Preprogrammed Level) – в буфере приемника количество слов больше или равно заданному в регистре RXFIFOLVL уровню (и приемник включен).
RBF (Receiver Buffer Full) – буфер приемника полон (и приемник включен). Если приемник закончит прием еще одного слова данных, это приведет к ошибке Overrun Error.
OE (Overrun Error) – произошла ошибка переполнения приемника, то есть стоп-бит был принят в момент, когда буфер приемника был полон, в результате чего принятое слово было утеряно.
RTO (Receiver Timeout) – произошел тайм-аут приемника, то есть приемник не зафиксировал старт-бита после приема последнего слова по истечению количества периодов baud_rate_clock, заданного в разрядах TV регистра UART_CFG0.
BD (Break Detected) – обнаружен сигнал break, то есть линия RX удерживалась в «0» в течение времени, большего времени передачи посылки (иными словами, принята посылка, состоящая только из нулей, даже в стоп-бите). При этом приемник записывает в FIFO-буфер одно слово из восьми нулей, вне зависимости от того, как долго держится «0» на RX. Прием следующей посылки начнется только после перехода линии в «1», а затем приема старт-бита. Сигнал break не считается ошибкой стоп-бита.
PE/AM (Parity Error/Address Match) – зафиксирована ошибка четности/совпадение адреса
в 9-битном режиме. Значение этого бита зависит от режима работы UART. Во всех режимах работы, кроме 9-битого режима, значение этого бита – ошибка четности, то есть содержимое бита четности принятой посылки не соответствовало биту, сформированному приемником для проверки в соответствии с выбранным типом контроля. В 9-битном режиме значение этого бита – совпадение адреса, то есть приемник принял адрес (посылка с «1» вместо бита четности), совпадающий с одним из адресов, заданных в регистрах UART_NBADDR0 и UART_NBADDR1. При этом сравниваются только разряды адреса незамаскированные в UART_NBMSK.
FE (Frame Error) – зафиксирована ошибка стоп-бита, то есть в принятой посылке значение стоп-бита было равно «0». Этот бит не устанавливается в «1», если все остальные биты слова также равны «0», так как это воспринимается как сигнал break.
CTSIC (Clear To Send Input Change) – произошло изменение сигнала CTS. Это событие не возникает, если передача запрещена, чтобы избежать ложной генерации этого события после сброса.
UARTx_ST1
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | CTSI | CRWE | TBNF | TBRPL | TBE | TI | RBNE |
Начальное значение | FLAG | |||||||
Тип статуса | 0 | 1 | 0 |
CTSI (Clear To Send image) – текущее значение сигнала CTS:
- 1 – удаленный приемник готов принимать данные;
- 0 – удаленный приемник не готов принимать данные.
Значение этого бита берется из входного сигнала CTS. Если инверсия сигналов линии (бит INVE регистра UART_CFG1) выключена, то он равен инверсии CTS, если включена, то самому сигналу CTS.
CRWE (Config Registers Write Enable) – запись в регистры UART_CFG0, UART_CFG1, UART_BDR0, UART_BDR1 разрешена. Этот бит равен «1» при условиях:
- приемник и передатчик выключены;
- приемник и передатчик закончили свои операции.
TBNF (Transmitter Buffer Not Full) – буфер передатчика не полон, в нем есть место еще как минимум для одного слова данных (и передатчик включен).
TBRPL (Transmitter Buffer Reached Preprogrammed Level) – в буфере передатчика осталось количество слов меньше или равно заданному в регистрах UART_TXFIFOLVL0 и UART_TXFIFOLVL1 уровню (и передатчик включен).
TBE (Transmitter Buffer Empty) – буфер передатчика пуст (и передатчик включен).
TI (Transmitter Idle) – буфер передатчика пуст и у него нет больше слов для отправки (и передатчик включен). Формируется до завершения последнего стоп-бита. Таким образом, если новое слово будет записано до завершения последнего стоп-би та, то новое слово начнет отправляться сразу после его завершения (при CTS в активном уровне в режиме аппаратного контроля обмена).
RBNE (Receiver Buffer Not Empty) – в буфере приемника есть как минимум одно непрочитанное слово данных (и приемник включен).