UART в STM32. Часть 0.

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

uart connection

Передающая ножка одного устройства соединяется с принимающей ногой другого, и наоборот. Кстати, обмен данными возможен одновременно в обе стороны. Когда передача не осуществляется, на выходе передатчика всегда присутствует логическая единица. Перед началом передачи данных передатчик устанавливает на выходе логический ноль. Это называется стартовым битом, после которого начинается передача бит данных, которых обычно восемь (может быть от 5 до 9). Потом следует бит проверки чётности (если она используется). Этот бит предназначен для предотвращения обработки некорректных данных после приёма. Этакая однобитовая контрольная сумма одним словом. И только потом, после отправки всех бит следует стоповый бит, обычно один (иногда бывает два). Стоповый бит всегда логическая единица. Чуть ниже есть поясняющая картинка всего вышесказанного:

uart frame

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

1 with descr

Для успешной передачи данных, на обоих устройствах, UART должен быть настроен с одинаковыми параметрами. Еще до начала передачи нужно задать: Скорость, количество стоповых бит, количество бит данных, наличие проверки чётности. Скорость передачи данных по сути дела штука произвольная, но как правило существует некоторый набор стандартных скоростей: 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 56000, 57600 бит/сек итд. Чем ниже скорость передачи данных - тем надёжней. Обычно я использую 9600 если не требуется передавать большие объёмы данных. Проверку чётности как правило не использую, на такой скорости у меня обычно ошибок при приёме не бывает. Стоповый бит я ставлю один. Ставил два - разницы ни какой не заметил. Количество бит данных - всегда ставлю восемь, так удобнее на мой взгляд. У компьютера интерфейса UART как такового нет, но есть COM порт. Разница между ком портом и UART по сути дела только в уровнях напряжений. В ком порте логический ноль это примерно +12 вольт, а логическая единица примерно -12 вольт. Если подключить микроконтроллер напрямую к выводам ком порта, то ему поплохеет от такого напряжения. Ведь для него логический ноль это примерно ноль вольт, а логическая единица это примерно полное напряжение питания.  Для согласования логических уровней используют специальные микросхемы, например max3232. Есть популярный аналог max232 выполняет ту же функцию но работает только от пяти вольт, а следовательно напряжение логической единицы тоже пять вольт. А контроллеры STM32 работают от 3.3 вольта, и напряжение логической единицы не должно превышать напряжения питания. Таким образом применяя max232 нужно понизить напряжение выхода до 3.3 вольт, например при помощи резисторного делителя. Если нет желания заморачиваться, то можно просто использовать max3232. Схема включения очень простая: 

max3232

По сути дела, кроме конденсаторов и микросхемы ничего не нужно. Вот теперь к двум выводам TxD и RxD можно подцеплять микроконтроллер. Ком порт это штука довольно устаревшая, ноутбуках его например уже давно нет, в обычных настольных ПК он еще встречается, пока. Так где же взять UART если ком порта нет? Существуют специальные микросхемы: преобразователи интерфейса USB <-> UART. Микросхем таких великое множество, в народе популярностью пользуется микросхема FT232RL. Примечательная она тем, что ей не надо почти ни какой обвязки, и корпус вполне можно запаять, не смотря на его устрашающе-мелкий вид. У неё есть только один недостаток, это цена. Из-за этого я отказался от её использования, и во всех своих проектах применяю вполне хороший аналог CP2102. Но к сожалению микросхема требует приличных навыков пайки феном, так как корпус у неё QFN. Она очень маленькая, но у меня сложностей не возникало. Ком порта на ноутбуке у меня нет, и я сделал на базе этой микросхемы вот такую платку-переходник USB-UART: 

cp2102 usb uart

Если кто-то захочет повторить подвиг и подковать блоху запаять козявку, то вот схема: 

cp2102 usb uart schemaitc

Кстати, можно взять data кабель от какого-нибудь старого сименса и использовать его в качестве преобразователя USB-UART. Обычно у него там 4 провода: Земля, питание, TxD, RxD. В некоторых особо продвинутых шнурах бывает больше. Они тоже годятся главное найти там землю, TxD и RxD. Выводы такого преобразователя можно подключать напрямую к контроллеру. Но предварительно замерить напряжение логической единицы (должно быть не более напряжения питания контроллера). Теперь когда разобрались с аппаратной частью, пора переходить к программной. Для того чтоб отправить что-то в UART используют терминальные программы. Самый простой вариант стандартный HyperTerminal в Windows. На мой взгляд - не самое лучший выбор. Не отличается какими-либо возможностями, думаю что даже я написал бы лучше. Из всех программ что я видел, мне больше всех понравилась Bray's Terminal:

terminal by bray 

Кроме собственно передачи и приёма байт по UARTу программа еще умеет: 

  • Строить графики исходя из принятых данных
  • Отправлять содержимое файла в UART
  • Сохранять принятые байты в лог
  • Есть поддержка макросов

Программа бесплатная и не требует установки.  Скачать можно [тут] или на официальном сайте автора. В следующей части мы попробуем настроить UART на контроллере STM32 и передать какую-нибудь строку на компьютер, и осуществить передачу и в обратном направлении.