STM32. Урок 3. UART
Рано или поздно у каждого разработчика появляется необходимость подключить свое устройство к компьютеру. Для этого можно использовать LPT, COM или USB порты. Если первый морально устарел и зачастую отсутствует на материнских платах, а последний слишком сложен для начинающего, то COM порт является наиболее подходящим. Он все еще есть на материнских платах, и он относительно прост в использовании. Как и раньше, я не буду очень сильно углубляться в теоретические дебри, которых уйма на просторах интернета, а постараюсь максимально доступно объяснить основы работы на практике.
Диод VD1 – индикатор питания, светодиод в корпусе 0805, VD2 – защита от переполюсовки, можно взять любой маломощный. Микросхема – MAX3232 в корпусе SO16.
К статье прилагается проект платы в Sprint Layout.
Плата выполнена на одностороннем стеклотекстолите толщиной 2мм. Ответная часть для COM порта берется для монтажа на провод и одевается на текстолит, получается компактно и аккуратно.
Заранее отмечу, что я не изготавливал этот переходник для урока, так как у меня уже есть платка с аналогичной микросхемой, но такие переходники мною делались ранее.
У переходника 4 вывода:
1) Vcc – подключается к 3В питанию на отладочной плате;
2) Rx – подключается к Rx UART2 (PA3) микроконтроллера;
3) Tx – подключается к Tx UART2 (PA2);
4) GND – подключается к «земле» на плате.
Для связи с компьютером используется программа-терминал Putty.
Настройка:
Во вкладке Session выбираем Serial.
В строке Serial line пишем номер порта, к которому вы подключили плату.
В строке Speed пишем 9600 – это скорость работы.
Переходим во вкладку Serial.
Data bits ставим 8.
Stop bits – 1.
Parity и Flow control надо выставить None.
Нажимаем Open и получаем консоль.
Если подключить переходник к COM порту, выводы Vcc и GND подключить к плате, а Tx и Rx соединить, тогда то, что вы будете писать в консоли, будет возвращаться в нее же. Если при нажатии клавиш ничего не происходит и консоль остается чистой – ищите и исправляйте ошибку.
Итак, с подключением вроде справились. Теперь начинаем писать программу.
Первым делом нужно инициализировать UART, для этого создается функция:
Готово, теперь для инициализации достаточно написать usart_init() в main.
В этой функции UART настраивается по дефолтным значениям. Для более тонкой настройки вместо:
Теперь надо научится отправлять в COM порт байты, а потом и строки.
Принцип работы прост: send_to_uart отправляет в COM порт байт, а send_str пересылает строку по байту в send_to_uart.
Теперь нужно включить прерывание по приему сообщений от COM порта:
И самое главное – функция обработки прерываний UART:
Вот и все, теперь запускаем консоль, прошиваем плату, подключаем и набираем строку, а затем жмем Enter и наслаждаемся результатом. Команды led0, led1, led2, led3 управляют светодиодами на плате. Как это все работает видно на видео. Исходники и плата прикреплены к статье.
Хочется отметить, что все наработки по данным урокам будут реализованы в плате расширения для STM32F4discovery о разработке которой можно почитать в этой теме
Урок 10. Работа с UART интерфейсом
В этом уроке я расскажу про UART интерфейс в микроконтроллерах AVR и про работу с ним в BASCOM-AVR. UART это универсальный асинхронный приёмопередатчик. Сам интерфейс достаточно распространён и имеется практически во всех AVR микроконтроллерах, исключения лишь составляет микроконтроллер Attiny13 и еще некоторые. Передача данных осуществляется по биту в равные промежутки времени, этот промежуток времени задаётся скоростью в бодах, вот например стандартные скорости: 4800 бод, 9600 бод, 19200 бод, 38400 бод и т.д. Следует также учесть, что скорость должна быть одинаковой с обеих сторон подключения. Кстати приёмник и передатчик работают независимо. Подключение UART осуществляется по трём линиям: RXD – приём, TXD – передача и GND – общий (минус). Подключать UART надо, так сказать «наоборот» RXD к TXD, а TXD к RXD как на картинке ниже:
Работа с UART в BASCOM-AVR
В этом окне настроек вы можете указать скорость работы UART, тактовую частоту тактового генератора и посмотреть процент ошибок при выбранной тактовой частоте. Но лучше указывать скорость и тактовую частоту непосредственно в самой программе. Кстати процент ошибок при тактовой частоте в 4МГц очень мал (0.16%), но все, же есть. Если вы хотите чтобы процент ошибок был нулевой надо подобрать такую тактовую частоту, которая будет кратна скорости работы UART. Например, при тактовой частоте 3.6864 МГц и скорости работы UART в 115 200 бод процент ошибок будет нулевым.
Работа с UART на практике
Ну а теперь попробуем «порулить» UART на практике, сначала соберём простую схему:
Потом наберём простую программку, (используя полученные знания) и откомпилируем её. Вот и она:
А работать эта программка будет так: сначала будет посылать в UART текст, а потом будет ждать приёма данных (в данном случае числа) которые запишутся в переменную a и позже пошлёт текст вместе с переменой. Для тех, кому лень компилировать, в файлах к уроку есть готовая прошивка. Прошиваем микроконтроллер, подключаем выводы микроконтроллера RXD, TXD (подключаем, как я писал выше) и GND к COM порту компьютера (через конвертер уровней) или к USB (USB – UART переходник), открываем на компьютере программу для работы с COM портами, например: Terminal by Bray, Hyper Terminal или Terminal emulator в BASCOM-AVR, указываем COM порт к которому подключились, указываем скорость в бодах, смотрим в окно программы, подаём питание на микроконтроллер и радуемся. Необходимо также учесть, что после прошивки микроконтроллера необходимо установить фьюз биты на нужную нам тактовую частоту генератора в данном случае (для программки выше) на 8МГц. На 8МГц можно использовать внутренний тактовый генератор микроконтроллера и установить фьюз биты вот так (для PonyProg2000):
На фотографии у меня плата для программирования Attiny2313, USB-UART переходник и программатор USBtiny. Ниже вы можете посмотреть видео, как это работает
Файлы для урока (проект в Proteus, исходник, прошивка) прилагаются
Подключение UART (Windows)
Мы уже писали, что низковольтный последовательный порт UART может заметно облегчить процесс диагностики современной электронной техники. В этом материале расскажем, как его правильно подключить к компьютеру с операционной системой Windows.
Рассмотрим самый популярный UART, собранный на микросхеме CP2103.
Если подключить вновь приобретенный модуль к USB-разъему компьютера, мы увидим следующее сообщение:
Чтобы убедиться, что Windows обнаружила наш модуль UART, откроем панель управления, а в ней диспетчер устройств.
Теперь видно, что система обнаружила модуль UART на микросхеме CP2103, но драйвера к нему не нашла, так как около значка устройства стоит восклицательный знак. Далее нужно по этой ссылке сохранить драйвер устройства.
Сохраненный файл нужно распаковать в предварительно созданную папку на компьютере.
Принимаем условия соглашения и нажимаем «далее».
Нажимаем «готово» и возвращаемся в диспетчер устройств.
Здесь видно, что наш модуль правильно определился и переехал в раздел «Порты (COM и LPT)». Нужно запомнить номер COM-порта, который система присвоила модулю UART.
Поскольку, начиная с Windows7 Microsoft перестала поставлять программу «Гипертерминал», найдем ей достойную замену. Можно скачать бесплатную терминальную программу PyTTY с официального сайта.
На сайте предлагается выбрать файл с нужной разрядностью Windows для загрузки.
Затем нужно согласиться с тем, что мы собираемся открыть исполняемый файл.
Но на этом Windows не успокаивается, она не знакома с производителем файла, поэтому нажимаем кнопку «запустить».
После установки в разделе «Программы» появляется пункт PuTTY. Для дальнейшей работы его необходимо запустить.
Если на экране терминала появляется масса нечитаемых символов, значит необходимо изменить скорость порта.
Использовать в качестве UART можно и программатор на микросхеме CH341a. Для этого необходимо удалить перемычку PROG / UART и установить драйвер последовательного режима работы. Процедура установки драйвера и запуска PuTTY аналогична представленной выше.
UART и с чем его едят
После Vogue истерии появилось множество вопросов, как подключить плату к компьютеру. И многие люди даже не понимают, что же такое UART. И я решил рассказать здесь какой это мощный инструмент.

Роутер превращается в компьютер, если к нему по UART подключить клавиатуру и дисплей
От телеграфа к COM-порту
Протокол UART (Universal asynchronous receiver/transmitter) или, по-русски, УАПП (универсальный асинхронный приемопередатчик) — старейший и самый распространенный на сегодняшний день физический протокол передачи данных. Наиболее известен из семейства UART протокол RS-232 (в народе – COM-порт, тот самый который стоит у тебя в компе). Это, наверное, самый древний компьютерный интерфейс. Он дожил до наших дней и не потерял своей актуальности.
Надо сказать, что изначально интерфейс УАПП появился в США как средство для передачи телеграфных сообщений, и рабочих бит там было пять (как в азбуке Морзе). Для передачи использовались механические устройства. Потом появились компьютеры, и коды ASCII, которые потребовали семь бит. В начале 60-х на смену пришла всем известная 8-битная таблица ASCII, и тогда формат передачи стал занимать полноценный байт, плюс управляющие три бита.
В 1971 году, когда уже начался бум микросхем, Гордон Белл для компьютеров PDP фирмы Western Digital сделал микросхему UART WD1402A. Примерно в начале 80-х фирмой National Semiconductor был создан чип 8520. В 90-е был придуман буфер к интерфейсу, что позволило передавать данные на более высоких скоростях. Этот интерфейс, не претерпев практически никаких изменений, дошел и до наших дней
Физика интерфейса
Чтобы понять, что роднит и отличает разные UART-интерфейсы, разберем принцип работы самого популярного и любимого нами протокола RS-232. Дотошно расписывать все тонкости его работы я не буду. Об этом написан ни один десяток мегабайт статей, и если ты умеешь пользоваться Гуглом, то без проблем найдешь всю необходимую информацию. Но основы я расскажу, благо с ними можно уже круто всем рулить, а всякие фишки используются очень редко.

Приём сигнала по RS-232 (взято из книги М.Гук «Аппаратные интерфейсы ПК»)
Такая большая амплитуда рабочих напряжений, целых 24 вольта, нужна в первую очередь для помехоустойчивости линий связи. По стандарту, длина кабеля, по которому у нас бегают данные, может быть 15 м. Хотя на практике люди умудрялись заставлять его работать даже на 25 м. Электрические параметры RS-232 – это главная характеристика, которая отличает его от других протоколов семейства UART.
Следующие характеристики – формат посылки и скорость передачи данных – полностью применимы ко всем видам UART и обеспечивают их совместимость через несложные схемы сопряжения.

Сигнал UART на экране осциллографа. Виден старт бит, данные и стоповый бит. Спасибо DIHALTза картинку
Скорость работы
Даже если тебе раньше никогда не приходилось работать с СОМ-портом, по крайней мере, в модеме ты должен знать номинальные скорости работы: 9600, 28800, 33600, 56000 и т.п. Сколько бит в секунду убегает из нашего порта? Вот смотри, допустим, скорость у нас 9600 бит в секунду. Это означает, что передача одного бита будет занимать 1/9600 секунды, а пересылка байта – 11/9600. И такая скорость для байта верна только в случае, если стоп-бит будет занимать один бит. В случае, если он занимает два стоп-бита, то передача будет 12/9600. Это связано с тем, что вместе с битами данных передаются еще специальные биты: старт, стоп и бит четности. Линейка скоростей СОМ-порта стандартизирована. Как правило, все устройства работают на трех стандартных скоростях: 9600, 19200, 115200. Но возможны другие варианты, даже использование нестандартных скоростей или скорости, меняющейся во времени, – с этим я сталкивался при разборе полетов очередного устройства.
Такой разный протокол
Видов UART существует великое множество. Я не буду перечислять их наименования, ибо, если ты владеешь английским, то сумеешь и сам нагуглить. Но самые основные не отметить нельзя! Напомню, что главное отличие интерфейсов состоит в среде и способе передаче данных. Данные могут передаваться даже по оптоволокну.
Второй по распространению интерфейс после RS-232 – это RS-485. Он является промышленным стандартом, и передача в нем осуществляется по витой паре, что дает ему неплохую помехоустойчивость и повышенную скорость передачи до 4 мегабит в секунду. Длина провода тут может достигать 1 км. Как правило, он используется на заводах для управления разными станками.
Надо сказать, что IRDA, или инфракрасная связь, которая встроена в большинство телефонов и КПК, тоже по сути является UARTом. Только данные передаются не по проводам, а с помощью инфракрасного излучения.
В SMART-картах (SIM, спутниковое телевиденье, банковские карты) – тех самых устройствах, которые мечтает похачить каждый уважающий себя фрикер – тоже используется наш любимый UART. Правда, там полудуплексная передача данных, и логика работы может быть 1,8/3,3 и 5 вольт. Выглядит так, будто RX запаян с TX на одном конце и на другом – в результате, один передает, другой в этот момент слушает, и наоборот. Это регламентировано стандартом смарт-карт. Так мы точно знаем, сколько байт пошлем, и сколько нам ответит карточка. Тема достойна отдельной статьи. В общем, запомни, что UART есть практически везде.

Устройства, которые имеют на своём борту UART, по часовой стрелке: мышка, ридер-эмулятор SMART-карт, КПК Palm m105, отладочная плата для микроконтроллера ATtiny2313 (или AT89C2051), модем.
Сопряжение интерфейсов
Я уже глаза намозолил разными интерфейсами, но как с ними работать-то? Ну, с обычным RS-232 понятно, а, допустим, с 5-вольтовым юартом как быть? Все просто: существуют различные готовые микросхемы-преобразователи. Как правило, в маркировке они содержат цифры «232». Увидел в схеме микруху с этими цифирями – будь уверен: скорее всего, это преобразователь. Через такие микросхемы с небольшим обвязом и сопрягаются все интерфейсы UART. Я не буду рассказывать о промышленных интерфейсах, а скажу о тех преобразователях, которые интересуют нас в первую очередь.
Самый известный преобразователь интерфейса – это микросхема, разработанная фирмой MAXIM, которая и получила от нее часть своего названия (max232). Для ее работы требуется четыре конденсатора от 0,1 микрофарады до 4 микрофарад и питание 5 вольт. Удивительно, что эта микросхема из 5 вольт генерирует отрицательное напряжение, чтобы сопрягать 5-вольтовый UART с RS-232.
Существуют микросхемы сопряжения USB с UART, например, микросхема ft232rl. В Ubuntu для этой микросхемы уже встроены драйвера. Для Windows их придется качать с официального сайта. После установки драйверов в системе появится виртуальный СОМ-порт, и с ним уже можно рулить различными устройствами. Советую не принимать эти микросхемы, как единственно возможные. Найдется громадное количество более дешевых и интересных аналогов, посему наседай на Гугл и поймешь, что мир UARTа – это круто.
В целом, микросхемы стоят достаточно дорого и порой можно обойтись более сложными, но зато более дешевыми схемами на паре транзисторов.
Что нам это дает?
Как ты понял, интерфейс UART присутствует во многих устройствах, в которых стоит какой-либо процессор или контроллер. Я даже больше скажу: если там стоит контроллер, то юарт есть стопудово (только он не всегда может использоваться). Как правило, по этому интерфейсу идет наладка и проверка работоспособности девайса. Зачастую производитель умалчивает о наличии этого интерфейса в изделии, но найти его несложно: достаточно скачать мануал на процессор и, где находится юарт, ты будешь знать. После того, как ты получишь физический доступ к железяке по нашему интерфейсу, можно его настроить на свое усмотрение или даже заставить работать, так как надо тебе, а не как задумал производитель. В общем, – выжать максимум возможностей из скромного девайса. Знание этого протокола дает также возможность подслушать, что же творится в линиях обмена между различными процессорами, так как часто производители организуют целые юарт-сети в своем устройстве. В общем, применений много, главное – интуитивно понимать, как это делать.
Апдейтим роутер
Намедни я намутил себе WiFi-роутер WL-520GU и, прочитав статью Step’a «Level-up для точки доступа» (][ #106), успешно установил туда Linux. Но у меня возникли проблемы с монтированием swap-раздела жесткого диска. Так появилась необходимость посмотреть лог загрузки точки доступа – подмонтировался раздел или нет – причем, как говорится, на лету, чтобы сразу вносить необходимые изменения. Шестым чувством я подозревал, что в моем роутере просто обязан быть UART. Я взял в руки крестовую отвертку и начал его разбирать. Дело тривиальное, но с заковыркой – потайные винтики находятся под резиновыми ножками (если решишь повторить, помни, что при разборе ты лишаешься гарантии). Моему взору предстала достаточно скучная плата, где все «chip-in-one»: один центральный процессор, в который включено все, внешняя оператива, флеша, преобразователь питания и рядок разъемов с кнопками. Но на плате была не распаянная контактная площадка, точнее сказать, отверстия под иголки. Их было четыре штуки. Вот он UART, это очевидно! По плате даже без мультиметра видно, что крайние иголки – это +3,3 вольта и второй – земля. Средние контакты, соответственно, RX и TX. Какой из них что, легко устанавливается методом научного тыка (спалить интерфейс очень проблематично).
Сразу хочу отметить, что интерфейс UART в каждом роутере выглядит по-разному. В большинстве случаев, это не распаянные отверстия на плате. Правда, в одном роутере от ASUS я даже встретил полностью подписанный разъем.
Собираем преобразователь
Чтобы подключить роутер к компу, необходимо сопрячь интерфейсы RS-232 с UARTом роутера. В принципе, можно подключить к USB, используя указанную выше микросхему FT232RL, – что я и сделал при первой проверке роутера. Но эта микросхема – в достаточно сложном для пайки корпусе, посему мы поговорим о более простых решениях. А именно – микросхеме MAX232. Если ты собираешься питаться от роутера, то там, скорее всего, будет 3,3 вольта, поэтому лучше использовать MAX3232, которая обычно стоит в КПК (схему распайки нетрудно найти в инете). Но в моем роутере присутствовало питание +5 вольт на входе, а указанных микросхем у меня великое множество, и я не стал заморачиваться. Для сборки нам потребуются конденсаторы 0,1 мкФ (4 штуки) и сама микросхема. Запаиваем все по традиционной схеме, и начинаем эксперименты.

Исходники для сборки
На выход я сразу повесил 9-пиновый разъем типа «папа», чтобы можно было легко подключить нуль-модемный кабель. Если ты помнишь, во времена DOSа такими кабелями делали сетку из двух компов и резались в «Дюкнюкем». Провод для наших целей собрать несложно. Правда, получится не полный нуль-модем и через него особо не поиграешь, но рулить точкой доступа будет самое то! Тебе понадобятся два 9-пиновых разъема типа «мама», корпуса к ним и провод, например, от старой мышки или клавы (главное, чтобы в нем было три провода). Сначала соединяем земли ¬- это пятый контакт разъемов; просто берем любой провод и с обоих сторон припаиваем к 5-му контакту. А вот с RX и TX надо поступить хитрее. С одного конца провода запаиваем на 3-й контакт, а с другого – на 2-й. Аналогично с третьим проводом, только с одного конца запаиваем на 2-й контакт, с другого – на 3-й. Суть в том, что TX должен передавать в RX. Прячем запаянные разъемы в корпус — и готов нуль-модемный кабель!

Распаянные иголки на плате роутера.
Для удобства монтажа в материнку роутера я впаял штырьковый разъем, а в монтажку с MAX232 – обратный разъем и вставил платку, как в слот. RX и TX роутера подбираются экспериментально.

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

Прожигаем отверстие для вывода проводов

Распаянный СОМ-порт

Всё в сборе. Обратите внимание, что красный провод питания идёт к разъёму адаптера роутера. Узелок внутри сделан, для того чтобы рывком на оторвать припаянные провода.
Настройка терминала
Нам нужно настроить терминальную программу. В Винде все достаточно просто: запускаем Hyper Terminal, отключаем программную и аппаратную проверку данных, выставляем скорость 115200 и один стоповый бит. А вот в Линухе дело обстоит чуть хитрее. У меня Ubuntu, и рассказывать буду про нее. Для начала разберись, как в твоей сборке именуется СОМ-порт. В моем случае СОМ1 был ttyS0 (если использовать к примеру микросхему FT232, то он будет именоваться ttyUSB0). Для работы с ним я использовал софтинку minicom.
* Скорость/четность/биты 115200 8N1
* Аппаратное управление потоком — нет
* Программное управление потоком — нет
Я не рекомендую подключать микросхему преобразователя к роутеру, дабы проверить ее функционал. Допускается только брать с него питание. Проверка проходит очень просто — необходимо перемкнуть RX с TX. Сначала перемыкаешь в СОМ-порте 2-й и 3-й контакт — проверяешь настройки терминалки. Пишешь что-то на клаве: если символы возвращаются, значит, все ОК. Также проверяешь кабель, те же контакты. Потом подключаешь микросхему, и уже у нее на выходе ставишь перемычку. Я заостряю на этом внимание, потому что, например, у меня возникли проблемы, и ничего не работало, пока я все не проверил и не нашел ошибку.
После всех настроек можешь смело цеплять к роутеру и искать RX-TX на роутере, периодически выдергивая из него питание. Если все сделано правильно, то при подаче питания ты увидишь лог загрузки роутера. Принимай поздравления, теперь у тебя полный аппаратный рут, так, будто ты сидишь за монитором с клавой роутера.
Лог загрузки роутера в программе minicom
Автономное плаванье
Согласись, делать через терминальную программу то же самое, что удобнее сделать через SSH – не айс. Мне хотелось превратить роутер в автономный Linux-компьютер, со своей хитрой архитектурой. Для этого нужно, чтобы данные с клавиатуры передавались по UART, и по нему же выводились на монитор. Паять и разрабатывать устройство было лениво. Тогда-то и пришла идея заюзать для этих целей пылящийся без дела КПК. По сути, наладонник будет исполнять роль контроллера клавиатуры и дисплея, ну и служить сопряжением интерфейсов.
Сначала я попробовал древнейший Palm m100. Но, видимо, у него очень маленькая буферная память, и от количества данных, которые идут с роутера, ему становилось плохо. Я взял другой — промышленный КПК, с нормальным СОМ-портом и терминалкой. Подключил, вставил в док и, в результате, получил небольшой линукс-компьютер. В принципе, вместо дорогущего промышленного КПК подойдет большинство наладонников, работающих под операционкой WinCE, главное – найти подходящий терминальный софт.

Линукс компьютер 🙂
Итоги
Итак, я показал небольшой пример использования UART. Если ты вкуришь в этот протокол, то поверь, станешь просто повелителем различных железок. Есть он практически везде, и через него можно сопрягать, казалось бы, совершенно разные вещи. К примеру, к тому же роутеру при небольших настройках подключается мобильный телефон по юарту, – и раздает с него интернет. В общем, применений куча. Не бойся экспериментировать, самообразовываться и реализовать свои идеи.
Этот пост является отредактированной для хабра версией моей статьи в Хакере № 05/09 «Главный инструмент фрикера».




























