Программирование ARM-контроллеров STM32 на ядре Cortex-M3. Часть 12. Работа с модулями USART и UART.
USART — это модуль универсального синхронно-асинхронного приёмо-передатчика. В первую очередь эти модули используются для организации связи по интерфейсу RS-232 и другим, имеющим аналогичный формат фреймов (RS-422, RS-485). Модули, естественно, реализуют не весь интерфейс, а только нижний уровень логики (формат передачи одного фрейма, байта), к которому потом ещё нужно прикрутить правильную физику и, возможно, протокол более высокого уровня, но это не суть.
Кроме описанных выше, модули USART позволяют реализовать интерфейсы IrDA (обмен данными по ИК-каналу), LIN (используется в автомобилях совместно с CAN), SmartCard (ISO7816-3: чип-карты, симки и так далее).
Всего в контроллерах stm32 может быть до 3-х модулей USART (USART1, USART2, USART3) и до 2-х модулей UART (UART4, UART5) в зависимости от конкретной модели.
Модули UART предоставляют практически те же самые возможности, что и USART за исключением возможностей синхронного обмена данными и аппаратного контроля передачи (соответственно, для этих модулей недоступен режим Smartcard). Кроме того, для модуля UART5 недоступна работа через DMA.
Таблица возможностей различных модулей USART:
Физически выводы USART мультиплексированы с выводами GPIO. Для того, чтобы контроллер понял, что вы хотите использовать эти выводы именно в качестве выводов USART, — они должны быть специальным образом настроены в регистрах настройки GPIO:
Кроме того, с помощью регистров настройки AFIO можно «сремапить» (перенести) выводы некоторых модулей USART на другие ноги контроллера. В таблице ниже указано какие ноги используются модулями USART по умолчанию и куда их можно сремапить:
Управление модулями осуществляется через специальные регистры. Подробно эти регистры описаны в Reference manual RM0008, но коротенько я на них всё равно остановлюсь.
USART_SR — регистр статуса. Младшие 10 бит этого регистра позволяют отслеживать состояние и различные события модуля USART. По каждому из этих событий может быть сгенерировано прерывание (настройка прерываний осуществляется в регистрах USART_CRx).
- CTS: устанавливается в 1 при изменении состояния линии CTS, если это разрешено настройками. Сбрасывается программно, записью в него нуля.
- LBD: устанавливается в 1 при обнаружении сигнала Break для интерфейса LIN. Сбрасывается программно, записью в него нуля. По этому событию может генерироваться прерывание.
- TXE (transmit data register empty): устанавливается в 1 после того, как все биты регистра TDR будут переданы в сдвиговый регистр передатчика. Сбрасывается автоматически при записи в регистр USART_DR.
- TC (transmission complete): устанавливается в 1 после того как будут переданы все биты из сдвигового регистра передатчика, если при этом установлен бит TXE (то есть если в регистре данных передатчика нет новых данных для передачи). Сбрасывается автоматически, выполнением программной последовательности: чтение регистра USART_SR с последующей записью в регистр USART_DR. Также можно сбросить записью в этот бит нуля.
- RXNE (read data register not empty): устанавливается в 1 после того, как очередная порция принятых данных будет перемещена из сдвигового регистра приёмника в регистр данных приёмника. Сбрасывается автоматически при чтении регистра USART_DR. Также можно сбросить записью в этот бит нуля.
- IDLE: устанавливается в 1 после обнаружения на линии сигнала idle. Сбрасывается автоматически, выполнением программной последовательности: чтение регистра USART_SR с последующим чтением регистра USART_DR.
- ORE (overrun error): устанавливается в 1, если в сдвиговом регистре приёмника готова очередная порция данных для передачи в регистр данных приёмника, но при этом из регистра данных приёмника ещё не считали предыдущие принятые данные. При возникновении этой ошибки данные в регистре RDR сохраняются, а в сдвиговом регистре приёмника перезаписываются.
- NE (noise error): устанавливается в 1, если в принятом фрейме были обнаружены помехи (результаты нескольких выборок для какого-либо бита не совпали).
- FE (framing error): устанавливается в 1 при обнаружении рассинхронизации (например, если приёмник в нужное время не обнаружил ожидаемые стоповые биты).
- PE: устанавливается в единицу при обнаружении ошибки чётности.
Все биты ошибок (ORE, NE, FE, PE) сбрасываются автоматически при выполнении программной последовательности: чтение регистра USART_SR с последующим чтением регистра USART_DR.
USART_DR — регистр данных. Младшие 9 бит этого регистра используются для доступа к регистрам данных приёмника и передатчика. Фактически регистры для приёма и передачи — это разные регистры (TDR и RDR), но к ним нет прямого доступа, доступ к обоим этим регистрам осуществляется через USART_DR. Когда мы читаем данные из регистра USART_DR, то фактически они читаются из регистра RDR, а когда пишем данные в USART_DR, то фактически они пишутся в регистр TDR.
USART_BRR — регистр настройки скорости передачи.
Младшие 4 бита регистра USART_BRR называются DIV_Fraction и содержат информацию о дробной части значения USARTDIV. Биты [4:15] регистра USART_BRR называются DIV_Mantissa и содержат информацию о целой части значения USARTDIV. Правила тут следующие: в DIV_Mantissa записывается целая часть значения USARTDIV, а в DIV_Fraction — умноженная на 16 и округлённая до ближайшего целого дробная часть USARTDIV. Если полученное после округления число занимает больше 4 бит, то старший бит добавляется к целой части, а в DIV_Fraction записываются только младшие 4 бита.
Например, при вычислениях получилось, что USARTDIV = 0d50.99, то есть целая часть = 0d50 = 0x32, а умноженная на 16 дробная часть = 0d15.84. При округлении до целого умноженной на 16 дробной части получаем 0d16 = 0x10. Число 0x10 занимает больше 4-х бит, следовательно DIV_Fractional = 0, а старшая единица добавляется к целой части, которая получается равной 0d50 + 1 = 0d51 = 0x33. Соответственно в USART_BRR нужно записать значение 0x330.
USART_СR1 — регистр настроек.
- UE (usart enable): 1 — включение модуля USART, 0 — выключение.
- M: определяет количество информационных битов в посылке (0 — 8 бит, 1 — 9 бит).
- WAKE: метод пробуждения из режима ожидания (0 — по сигналу IDLE, 1 — по приёму спецслова, адреса).
- PCE (parity control enable): 1 — включить контроль чётности, 0 — выключить.
- PS (parity selection): 1 — проверяется нечётность, 0 — проверяется чётность.
- PEIE: 1 — включить прерывание по ошибке чётности (флаг PE регистра статуса), 0 — выключить.
- TXEIE: 1 — включить прерывание по опустошению регистра передатчика (флаг TXE регистра статуса), 0 — выключить.
- TCIE: 1 — включить прерывание по завершению передачи (флаг TC регистра статуса), 0 — выключить.
- RXNEIE: 1 — включить прерывание по приёму данных (флаги ORE или RXNE регистра статуса).
- IDLEIE: 1 — включить прерывание по обнаружению на линии сигнала IDLE (флаг IDLE регистра статуса).
- TE (transmitter enable): 1 — включение передатчика, 0 — выключение.
- RE (receiver enable): 1 — включение приёмника, 0 — выключение.
- RWU: 1 — переключение приёмника в режим ожидания, 0 — активный режим.
- SBK: 1 — послать в линию сигнал break. Сбрасывается автоматически во время передачи стоповых битов сигнала break.
USART_СR2 — регистр настроек.
- LINEN: 1 — включение режима LIN, 0 — выключение.
- STOP[1:0]: определяет количество стоповых битов (00 — 1, 01 — 0.5, 10 — 2, 11 — 1.5).
- CLKEN (clock enable): 1 — включить пин CK, 0 — выключить.
- PCE (parity control enable): 1 — включить контроль чётности, 0 — выключить.
- CPOL (clock polarity): определяет уровень сигнала на линии CK в отсутствии импульсов (0 — низкий, 1 — высокий).
- CPHA (clock phase): определяет по которому фронту импульсов на линии CK происходит захват бита с линии данных (0 — по переднему, 1 — по заднему).
- LBCL (last bit clock pulse): позволяет выбрать нужно ли тактировать через линию CK последний передаваемый бит (0 — не нужно, 1 — нужно).
- LBDIE: 1 — включить прерывание по обнаружению сигнала break (в режиме LIN), 0 — выключить.
- LBDL: определяет длительность ожидаемого сигнала break (0 — 10 бит, 1 — 11 бит).
- ADD[3:0]: адрес узла USART. Здесь задаётся адрес текущего узла. Получив этот адрес приёмник выйдет из режима ожидания (если выбран соответствующий метод пробуждения).
USART_СR3 — регистр настроек.
- CTSIE (CTS interrupt enable): 1 — включение прерывания по линии CTS (флаг CTS в регистре статуса), 0 — выключение.
- CTSE (CTS enable): включение контроля линии CTS (данные начнут передаваться только когда на линии CTS установится низкий уровень).
- RTSE (RTS enable): включение контроля линии RTS (на линии RTS выставляется низкий уровень только когда регистр приёмника пуст и готов к приёму).
- DMAT (DMA enable transmitter): 1 — включить режим DMA для передатчика, 0 — выключить.
- DMAR (DMA enable receiver): 1 — включить режим DMA для приёмника, 0 — выключить.
- SCEN: 1 — включение режима Smartcard, 0 — выключение.
- NACK: оперделяет посылать или нет NACK в режиме Smartcard при ошибке чётности (1 — посылать, 0 — не посылать).
- HDSEL: 1 — включить однопроводный полудуплексный режим, 0 — выключить.
- IRLP: 1 — включение режима low-power для IrDA, 0 — IrDA в режиме normal.
- IREN (IrDA enable): 1 — включение режима IrDA, 0 — выключение.
- EIE (error interrupt enable): 1 — включение прерывание по ошибкам передачи (флаги FE, ORE, NE регистра статуса), 0 — выключение.
Есть ещё регистр USART_GTPR, но в нём прописываются настройки только для режимов Smartcard и IrDA, так что про него сами в доке почитаете.
Теперь давайте посмотрим, как и в какой последовательности нужно программировать модули USART для организации обмена данными в асинхронном режиме (ну, просто этот режим самый популярный).
Конфигурирование и настройка:
- Включить тактирование USARTx, GPIO, AFIO. Выполняется в регистрах настройки RCC.
- Если нужно, то сремапить выводы USART на другие пины. Выполняется в регистрах настройки AFIO.
- Перевести используемые для USART выводы в нужные режимы. Как должны быть настроены выводы можно посмотреть в таблице 24 документа RM0008 (или вверху этой статьи, вторая картинка). Выполняется в регистрах настройки GPIO.
- Настроить USART (скорость, режим, количество информационных и стоповых битов). Выполняется в регистрах настройки USART (там же сразу нужно выбрать, должен ли быть включен передатчик, приёмник или и то и другое).
- Включить модуль USART. Выполняется в регистре USART_CR1.
Если предполагается использовать прерывание от модуля USART, то в регистрах настройки USART необходимо разрешить прерывание от нужных вам событий. Помимо этого, если необходимо, то нужно настроить в регистрах NVIC_IPRx приоритет для прерывания от UART. И, наконец, в регистрах NVIC_ISERx нужно включить само прерывание.
Учтите, что для каждого модуля USART генерируется всего одно прерывание. Далее нужно самостоятельно (по флагам регистра статуса) определять какое именно событие его вызвало.
Отправка данных без использования DMA:
- Убеждаемся, что бит TXE установлен (регистр передатчика пуст и в него можно писать данные).
- Пишем данные для отправки в регистр USART_DR (это автоматически сбрасывает флаг TXE).
- Анализируем флаг TXE (как только он снова взведётся — можно писать в регистр данных передатчика новый байт).
- После записи последнего байта ждём пока последовательно установятся флаги TXE и TC в регистре статуса, что является признаком окончания передачи (последний байт ушёл из регистра данных передатчика и далее из сдвигового регистра передатчика).
Отправка данных с использованием DMA:
- Заполняем буфер для передачи.
- Включаем канал DMA, к которому подключен передатчик USART. Контроллер DMA будет сам анализировать флаг TXE и пихать очередной байт в регистр данных передатчика как только он освободится.
- Ждём событие Transfer Complete для канала DMA (которое означает, что последний байт буфера был передан в регистр данных передатчика), после чего ждём последовательной установки флагов TXE и TC (последний байт ушёл из регистра данных передатчика и далее из сдвигового регистра передатчика).
Если для используемого канала DMA выбран режим Normal, то при каждом использовании DMA взводить счётчик переданных байт нужно вручную. Для этого выключают канал DMA, взводят счётчик (пишут в него количество байт для передачи) и снова включают канал DMA.
Приём данных без использования DMA:
- Анализируем бит RXNE в регистре статус. Его установка означает, что из сдвигового регистра приёмника в регистр данных приёмника был вытеснен очередной байт и его можно забирать.
- Далее нужно прочитать и проанализировать регистр статуса на наличие ошибок, а также успеть забрать принятый байт до того, как придёт следующий. Чтение регистра данных приёмника автоматически очищает бит RXNE.
Приём данных с использованием DMA:
- Включаем канал DMA, к которому подключен приёмник USART. С этого момента контроллер DMA будет сам анализировать флаг RXNE и при наличии принятого байта вычитывать его из регистра данных приёмника в буфер (что автоматически будет сбрасывать флаг RXNE).
- Событие Transfer Complete для канала DMA в случае приёма будет означать, что приёмный буфер целиком заполнен. Но нам всё равно нужно после каждого принятого байта анализировать регистр статуса на наличие ошибок. Это можно сделать, установив прерывание по событию RXNE или просто включив прерывание по ошибкам.
В качестве примера рассмотрим программу, которая будет принимать байты в буфер через USART, и отправлять этот буфер обратно после того, как в нём накопится 5 байт.
Использование интерфейса USART микроконтроллеров AVR
Микроконтроллеры AVR имеют в своем составе модуль полнодуплексного универсального асинхронного приемопередатчика UART (в семействе Mega универсальный синхронный/асинхронный приемопередатчик USART). Через него осуществляется прием и передача информации, представленной последовательным кодом, поэтому модуль UART часто называют также последовательным портом. С помощью этого модуля микроконтроллер может обмениваться данными с различными внешними устройствами.
Поток данных, передаваемых по каналу UART, представляет собой совокупность посылок или кадров. Каждый кадр содержит стартовый бит, восемь или девять битов данных и стоповый бит. Стартовый бит имеет уровень логического 0, стоповый — уровень логической 1. Скорость передачи данных может варьироваться в широких пределах, причем высокие скорости передачи могут быть достигнуты даже при относительно низкой тактовой частоте микроконтроллера.
Обмен данными по последовательному интерфейсу
Известно, что при передаче данных могут произойти различные сбои. Модуль UART, реализованный в микроконтроллерах, способен при приеме обнаруживать ошибку формата и переполнение. Для взаимодействия с программой в модуле предусмотрены прерывания при наступлении следующих событий: прием завершен с адресом вектора $009 в таблице векторов прерываний, регистр данных передатчика пуст с адресом вектора $00А, передача завершена с адресом вектора $00В.
Выводы микроконтроллера, используемые модулем UART, являются линиями порта PD. В качестве входа приемника (RXD) используют вывод РD0, а в качестве выхода передатчика (TXD) — вывод PD1.
Принимаемые и передаваемые данные (восемь разрядов) хранятся в регистре UDR. Физически регистр UDR состоит из двух отдельных регистров, один из которых используется для передачи данных, другой — для приема. При чтении регистра UDR выполняется обращение к регистру приемника, при записи — к регистру передатчика.
Регистры управления модулями USART на примере микроконтроллера ATmega8
Буферные регистры приемника и передатчика располагаются по одному адресу пространства ввода/вывода и обозначаются как регистр данных UDR(Universal Data Register). В этом регистре хранятся младшие 8 разрядов принимаемых и передаваемых данных. При чтении выполняется обращение к буферному регистру UDR приемника, при записи — к буферному регистру передатчика. В модулях USART буфер приемника является двухуровневым (FIFO буфер), изменение состояния которого происходит при любом обращении к регистру UDR. В связи с этим не следует использовать регистр UDR в качестве операндов команд типа «чтение/модификация/запись» (SBI и CBI). Кроме того, следует быть очень аккуратными при использовании команд проверки SBIC и SBIS, поскольку они также изменяют состояние буфера приемника.
Для управления модулями USART используются три регистра: UCSRA , UCSRB и UCSRC.
Описание разрядов регистра UCSRA.
Флаг завершения приема. Флаг устанавливается в «1» при наличии непрочитанных данных в буфере приемника (регистр данных UDR). Сбрасывается флаг аппаратно после опустошения буфера (в UART — после прочтения регистра
данных). Если разряд RXCIE регистра UCSRB установлен, то при установке флага генерируется запрос на прерывание «прием завершен»
Флаг завершения передачи. Флаг устанавливается в «1» после передачи всех разрядов посылки из сдвигового регистра передатчика, при условии, что в регистр данных UDR не
было загружено нового значения. Если разряд TXCIE регистра UCSRB (UCSRnB) установлен, то при установке флага
генерируется прерывание «передача завершена». Флаг сбрасывается аппаратно при выполнении подпрограммы обработки прерывания или программно, записью в него лог. 1
Флаг опустошения регистра данных. Данный флаг устанавливается в «1» при пустом буфере передатчика (после пересылки байта из регистра данных UDR в сдвиговый регистр передатчика). Установленный флаг означает, что в
регистр данных можно загружать новое значение. Если разряд UDRIE регистра UCR (UCSRB) установлен, генерируется запрос на прерывание «регистр данных пуст». Флаг сбрасывается аппаратно, при записи в регистр данных
Флаг ошибки кадрирования. Флаг устанавливается в «1»
при обнаружении ошибки кадрирования, т. е. если первый
стопбит принятой посылки равен «0». Флаг сбрасывается
при приеме стопбита, равного «1»
Флаг переполнения. В USART флаг устанавливается в «1»,
если в момент обнаружения нового стартбита в сдвиговом
регистре приемника находится последнее принятое слово, а
буфер приемника полон (два значения). В UART флаг устанавливается в «1», если новый кадр будет помещен в сдвиговый регистр приемника до того, как из регистра данных будет считано предыдущее слово. Флаг сбрасывается при
пересылке принятых данных из сдвигового регистра приемника в буфер
Флаг ошибки контроля четности. Флаг устанавливается в
«1», если в данных, находящихся в буфере приемника, выявлена ошибка контроля четности. При отключенном контроле четности этот разряд постоянно сброшен в «0»
Удвоение скорости обмена. Если этот разряд установлен в
«1», коэффициент деления предделителя контроллера скорости передачи уменьшается с 16 до 8, удваивая тем самым
скорость асинхронного обмена по последовательному каналу. В USART разряд U2X используется только при асинхронном режиме работы. В синхронном режиме он должен быть сброшен
Режим мультипроцессорного обмена. Разряд MPCM используется в режиме мультипроцессорного обмена. Если он
установлен в «1», ведомый микроконтроллер ожидает приема кадра, содержащего адрес. Кадры, не содержащие адреса
устройства, игнорируются
Описание разрядов регистра UCSRB.
| Разряд | Название | Описание |
| 7 | RXCIE | Разрешение прерывания по завершению приема. Если данный разряд установлен в «1», то при установке флага RXC регистра UCSRA генерируется прерывание «прием завершен» (если флаг I регистра SREG установлен в «1») |
| 6 | TXCIE | Разрешение прерывания по завершению передачи. Если данный разряд установлен в «1», то при установке флага TXC регистра UCSRA генерируется прерывание «передача завершена» (если флаг I регистра SREG установлен в «1») |
| 5 | UDRIE | Разрешение прерывания при очистке регистра данных UART. Если данный разряд установлен в «1», то при установке флага UDRE в регистра UCSRA генерируется прерывание «регистр данных пуст» (если флаг I регистра SREG установлен в «1») |
| 4 | RXEN | Разрешение приема. При установке этого разряда в «1» разрешается работа приемника USART/UART и переопределяется функционирование вывода RXD (RXDn). При сбросе разряда RXEN работа приемника запрещается, а его буфер сбрасывается. Значения флагов TXC, DOR/OR и FE при этом становятся недействительными |
| 3 | TXEN | Разрешение передачи. При установке этого разряда в «1» разрешается работа передатчика UART и переопределяется функционирование вывода TXD. Если разряд сбрасывается в «0» во время передачи, выключение передатчика произойдет только после завершения передачи данных, находящихся в сдвиговом регистре и буфере передатчика |
| 2 | UCSZ2 | Формат посылок. Этот разряд используется для задания размера слов данных, передаваемых по последовательному каналу. В модулях USART он используется совместно с разрядами UCSZ1:0 регистра UCSRC. В модулях UART, если разряд CHR9 установлен в «1», осуществляется передача и прием 9 разрядных данных, если сброшен — 8 разрядных |
| 1 | RXB8 | 8 й разряд принимаемых данных. При использовании 9 разрядных слов данных этот разряд содержит значение старшего разряда принятого слова. В случае USART содержимое этого разряда должно быть считано до прочтения регистра данных UDR |
| 0 | TXB8 | 8 й разряд передаваемых данных. При использовании 9 разрядных слов данных, содержимое этого разряда является старшим разрядом передаваемого слова. Требуемое значение должно быть занесено в этот разряд до загрузки байта данных в регистр UDR |
Описание разрядов регистра UCSRC.
| Разряд | Название | Описание |
| 7 | URSEL | Выбор регистра. Этот разряд определяет, в какой из регистров модуля производится запись. Если разряд установлен в «1», обращение производится к регистру UCSRC. Если же разряд сброшен в «0», обращение производится к регистру UBRRH. |
| 6 | UMSEL | Режим работы USART. Если разряд сброшен в «0», модуль USART работает в асинхронном режиме. Если разряд установлен в «1», то модуль USART работает в синхронном режиме |
| 5 | UPM1 | Режим работы схемы контроля и формирования четности. Эти разряды определяют функционирование схем контроля и формирования четности |
| 4 | UPM0 | |
| 3 | USBS | Количество стопбитов. Этот разряд определяет количество стопбитов, посылаемых передатчиком. Если разряд сброшен в «0», передатчик посылает 1 стопбит, если установлен в «1», то 2 стопбита. Для приемника содержимое этого разряда безразлично |
| 2 | UCSZ1 | Формат посылок. Совместно с разрядом UCSZ2 эти разряды определяют количество разрядов данных в посылках (размер слова) |
| 1 | UCSZ0 | |
| 0 | UCPOL | Полярность тактового сигнала. Значение этого разряда определяет момент выдачи и считывания данных на выводах модуля. Разряд используется только при работе в синхронном режиме. При работе в асинхронном режиме он должен быть сброшен в «0» |
Скорость приема/передачи USART
В асинхронном режиме, а также в синхронном режиме при работе в качестве ведущего, скорость приема и передачи данных задается контроллером скорости передачи, функционирующим как делитель системного тактового сигнала с программируемым коэффициентом деления. Коэффициент определяется содержимым регистра контроллера UBRR. В блок приемника сформированный сигнал поступает сразу, а в блок передатчика — через дополнительный делитель, коэффициент деления которого (2, 8 или 16) зависит от режима работы модуля USART/UART. Регистр UBRR является 12 разрядным и физически размещается в двух регистрах ввода/вывода UBRRH и UBRRL.
При работе в асинхронном режиме скорость обмена определяется не только содержимым регистра UBRR, но и состоянием разряда U2X регистра UCSRA . Если этот разряд установлен в «1», коэффициент деления предделителя уменьшается в два раза, а скорость
обмена соответственно удваивается. При работе в синхронном режиме этот разряд должен быть сброшен.
Cкорость обмена определяется следующими формулами, где
BAUD — скорость передачи в бодах, fCK — тактовая частота микроконтроллера, UBRR — содержимое регистра контроллера скорости передачи (0…4095):
асинхронный режим (обычный, U2Xn = «0»)
BAUD = fCK/16(UBRR + 1);
асинхронный режим (ускоренный, U2Xn = «1»)
BAUD = fCK/8(UBRR + 1);
синхронный режим ведущего
BAUD = fCK/2(UBRR + 1).
Ниже представлен пример тестовой программы для изучения протокола USART, где микроконтроллер Atmega8 обменивается информацией с терминалом, для наглядности к контроллеру подключен LCD 16X02 дисплей. При нажатии на кнопки 1-3 в терминале высвечиваются соответствующие строки, также если выводить в терминал символы «a» или «b», будет загораться или гаснуть светодиод, подключенный к порту PB0 контроллера. Любые символы выводимые в терминал будут также высвечиваться на LCD дисплее. Для тестирования в «железе», микроконтроллер подключается к компьютеру через микросхему преобразователя уровней MAX232, для обмена данными используется стандартная программа Hyper Terminal от Microsoft.
Реализация приема данных по UART на 1986VE92U milandr
Работаю с отладочной платой на отечественный микроконтроллер 1986ВЕ92 от компании Milandr. Реализую прием и передачу данных через интерфейс RS-232C (встроенный на отладочную плату), для общения с МК и считывания получаемых/отправляемых данных использую программу «Terminal» версии 1.9b, для написания и отладки прошивки «Keil uVision 5». Если с передачей я разобрался(однозначно меняется скорость передачи и видно, что что-то посылается), то с приемом разобраться никак не могу. Перепроверил все пины уже несколько раз, пробовал менять порты, проверял метод загрузки на плате. Ситуация так и не сдвинулась с мертвой точки: передача работает, прием — нет. Прикладываю код на C, на котором я пытаюсь реализовать режим эхо. При написании основывался на данных видео: Передача, Прием