Сегодня я расскажу вам, что такое USART и как им пользоваться в контроллерах STM32.
USART — это такой интерфейс передачи данных, который происходит по двум проводам между двумя устройствами, при котором передача и прием данных происходит по двум раздельным проводам.
Причем контакт передачи данных одного устройсва соединяется с контактом приёма данных другого и наоборот.
Подробно мы здесь не будем изучать данный интерфейс, его протокол и другие тонкости, это всё подробно разжёвано в уроке для AVR.
Вообще, передача данных по USART происходит вот таким вот образом
Те биты, обозначения которых даны в фигурных скобках, могут не использоваться при определённых режимах.
В начале диаграммы мы видим, что когда шина не используется и данные по определённому проводу не передаются или не принимаются в зависимости от назначения контакта, то данный контакт находится в высоком состоянии. Как ещё принято говорить, что пассивное состояние на шине высокое. Дальше идёт обязательный стартовый бит. Как видим, он направлен вниз, то есть в это время контакт переходит из высокого состояния в низкое. Сколько времени длиться данный бит, подсчитать немудрено. Нужно 1 секунду разделить на скорость, установленную для передачи и приёма данных, которая измеряется в битах в секунду ну или, как ещё называют, в бодах. После того, как время стартового бита истечёт, контроллер будет считать следующие биты информационными. Их может быть от пяти до девяти в зависимости от режима. Вообще, чаще всего используется именно 8, так как удобнее всего данные передавать байтами. Ну здесь уже состояние ножки во время передачи определённого информационного бита будет диктоваться собственно самим информационным битом. То есть если надо передать единицу — то высокое, если ноль — низкое. Важно заметить также что передача информационных битов начинается с самого младшего, и затем более старшие.
Следующий бит P — это бит чётности. В зависимости от режима он может быть, а также его может и не быть. То есть когда мы передаём один блок, он будет выставлен, а следующий — сброшен, для ещё большей синхронизации.
Затем идут стоповые биты, гласящие о том, что передача посылки закончена. Данных битов может быть один или два также в зависимости от режима. Данные биты передаются с помощью организации высокого логического состояния на ножке. И затем процесс повторяется сначала, то есть передаём следующую посылку.
Каким же всё таки образом всё это проделать практически, чтобы связать наш контроллер с ПК при условии, что данного интерфейса у ПК не существует. Подобные вещи решаются посредством преобразователей интерфейсов или переходников.
Данные переходники бывают разного вида в зависимости от их производителей
У меня переходник самодельный, изготовленный из старинного телефонного дата-кабеля на микросхеме PL2303HX. Вот так вот он выглядит
Вот его внутренний вид со стороны микросхемы
Я вывел наружу необходимые провода с соответствующих контактов и напаял к ним наконечники. Припаял провода я вот таким вот образом
А вот так вот выглядит данный переходник в подключенном к плате Discocery состоянии
А к каким именно ножкам платы подключается переходник, мы увидим в програме Cube MX, когда будем настраивать там свой проект.
Установленный драйвер для переходника выглядет в системе Windows вот так
Для того, чтобы нам увидеть данные на ПК, необходима терминальная программа. Мы будем использовать программу Terminal 1.9b, ссылка на которую будет дана внизу страницы.
Так же как и раньше проект создаем из TEST001, называем его USART_TRANSMIT
Запускаем куб, отключим все порты для светодиодов, они нам пока не нужы, порт кнопки также отключим включаем USART2 в положение Asynchronous
Мы видим, что у нас также включились ножки портов в определённые альтернативные режимы.
Соответственно, к данным ножкам мы и подключим провода нашего переходника.
В настройках в Configuration вообще ничего не трогаем, просто проверим, всё ли у нас правильно включилось, так как некоторые версии Cube MX могут по умолчанию включить 7-битный режим предачи данных, нам нужен 8-битный
Такие же настройки мы должны выставить и в терминальной программе.
Генерируем проект.
В главной функции main() добавим переменную
/* USER CODE BEGIN 1 */
uint8_t str[]=»USART Transmit\r\n»;
/* USER CODE END 1 */
В бесконечный цикл добавим
while (1)
{
HAL_UART_Transmit(&huart2,str,16,0xFFFF);
HAL_Delay(100);
/* USER CODE END WHILE */
В данной функции мы в качестве входных параметров пеедаём ссылку на переферию, на массив данных, количество передаваемых байт и таймаут.
А затем добавим задержку, иначе без неё наша терминальная программа зависнет.
Собираем проект, открываем терминальную программу, устанавливаем там все настройки, жмём кнопку Connect, прошиваем, смотрим
Всё у нас передаётся. Но тут проще.
С приёмом будет посложнее, для этого нужно будет подключать дисплей, обрабатывать прерывания.
Поэтому мы отложим это дело до следующего занятия.
Предыдущий урок Программирование МК STM32 Следующий урок
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Переходник USB to TTL можно приобрести здесь ftdi ft232rl
Смотреть ВИДЕОУРОК
разве 8bits including parity не передаёт 7 бит?
Извиняюсь, недосмотрел отсутствие parity ниже
есть ведь более «скорострельные» способы использования USART — прерывания, DMA…
подскажите пожалуйста как передавать переменную, а эту переменную менять каждый цикл на 1 цифры от 0 до 10
uint8_t i;
uint8_t d;
Uint8_t i[]={d};
for ( d=0, d<=10; d++);
{
}
HAL_UART_TRANSMIT(huart2, i, 2, 1000);
HAL_delay(1000);
написал вот так выдает ошибку
«После того, как время стопового бита истечёт, конроллер будет считать следующие биты информационными.»
1. Мне кажется, что по истечении стартового бита.
2. Исправьте «контроллер».
Поправил, спасибо!
Здравствуйте, NarodStream! Планируются ли уроки по CAN шине?
Сделал все как было сказано, но что то не почему то данные так и не пошли, ошибиться тут сложно, пробовал несколько вариантов usart переходников, и на нескольких портах. Самое странное, что программа шьётся, дебаг проходит тоже нормально, у меня stm32f429 Discavery. rx с tx тоже не путал, что не так не понимаю, возможно с частотой что то не так делаю, у кого то была подобная ситуация?
Я даже зашивал и запитывал плату потом отдельно, но данные так в терминале и не увидел, с avr это у меня вышло куда быстрее. Есть какие то подводные камни тут?