STM Урок 13. HAL. USART. Передача данных



Сегодня я расскажу вам, что такое USART и как им пользоваться в контроллерах STM32.

USART — это такой интерфейс передачи данных, который происходит по двум проводам между двумя устройствами, при котором передача и прием данных происходит по двум раздельным проводам.

Причем контакт передачи данных одного устройсва соединяется с контактом приёма данных другого и наоборот.

 

image03

 

Подробно мы здесь не будем изучать данный интерфейс, его протокол и другие тонкости, это всё подробно разжёвано в уроке для AVR.

Вообще, передача данных по USART происходит вот таким вот образом

 

image05-2

 

Те биты, обозначения которых даны в фигурных скобках, могут не использоваться при определённых режимах.

В начале диаграммы мы видим, что когда шина не используется и данные по определённому проводу не передаются или не принимаются в зависимости от назначения контакта, то данный контакт находится в высоком состоянии. Как ещё принято говорить, что пассивное состояние на шине высокое. Дальше идёт обязательный стартовый бит. Как видим, он направлен вниз, то есть в это время контакт переходит из высокого состояния в низкое. Сколько времени длиться данный бит, подсчитать немудрено. Нужно 1 секунду разделить на скорость, установленную для передачи и приёма данных, которая измеряется в битах в секунду ну или, как ещё называют, в бодах. После того, как время стартового бита истечёт, контроллер будет считать следующие биты информационными. Их может быть от пяти до девяти в зависимости от режима. Вообще, чаще всего используется именно 8, так как удобнее всего данные передавать байтами. Ну здесь уже состояние ножки во время передачи определённого информационного бита будет диктоваться собственно самим информационным битом. То есть если надо передать единицу — то высокое, если ноль — низкое. Важно заметить также что передача информационных битов начинается с самого младшего, и затем более старшие.

Следующий бит P — это бит чётности. В зависимости от режима он может быть, а также его может и не быть. То есть когда мы передаём один блок, он будет выставлен, а следующий — сброшен, для ещё большей синхронизации.

Затем идут стоповые биты, гласящие о том, что передача посылки закончена. Данных битов может быть один или два также в зависимости от режима. Данные биты передаются с помощью организации высокого логического состояния на ножке. И затем процесс повторяется сначала, то есть передаём следующую посылку.

Каким же всё таки образом всё это проделать практически, чтобы связать наш контроллер с ПК при условии, что данного интерфейса у ПК не существует. Подобные вещи решаются посредством преобразователей интерфейсов или переходников.

Данные переходники бывают разного вида в зависимости от их производителей

 

image00  image01  image02

 

 

У меня переходник самодельный, изготовленный из старинного телефонного дата-кабеля на микросхеме PL2303HX. Вот так вот он выглядит

 

image06

 

Вот его внутренний вид со стороны микросхемы

 

image07

 

Я вывел наружу необходимые провода с соответствующих контактов и напаял к ним наконечники. Припаял провода я вот таким вот образом

 

image08

 

 

А вот так вот выглядит данный переходник в подключенном к плате Discocery состоянии

 

image09

 

А к каким именно ножкам платы подключается переходник, мы увидим в програме Cube MX, когда будем настраивать там свой проект.

Установленный драйвер для переходника выглядет в системе Windows вот так

 

image10

 

Для того, чтобы нам увидеть данные на ПК, необходима терминальная программа. Мы будем использовать программу Terminal 1.9b, ссылка на которую будет дана внизу страницы.

 

Так же как и раньше проект создаем из TEST001, называем его USART_TRANSMIT

Запускаем куб, отключим все порты для светодиодов, они нам пока не нужы, порт кнопки также отключим включаем USART2 в положение Asynchronous

 

image11

 

Мы видим, что у нас также включились ножки портов в определённые альтернативные режимы.

 

image12

 

Соответственно, к данным ножкам мы и подключим провода нашего переходника.

В настройках в Configuration вообще ничего не трогаем, просто проверим, всё ли у нас правильно включилось, так как некоторые версии Cube MX могут по умолчанию включить 7-битный режим предачи данных, нам нужен 8-битный

 

image13

 

Такие же настройки мы должны выставить и в терминальной программе.

Генерируем проект.

В главной функции 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, прошиваем, смотрим

 

image14

 

Всё у нас передаётся. Но тут проще.

С приёмом будет посложнее, для этого нужно будет подключать дисплей, обрабатывать прерывания.

Поэтому мы отложим это дело до следующего занятия.

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Терминальная программа

 

Отладочную плату и переходник USB-TTL можно приобрести здесь:

STM32F4-DISCOVERY

Переходник USB-TTL лучше купить такой (сейчас у меня именно такой и он мне больше нравится)

 

 

Смотреть ВИДЕОУРОК

 

STM32 HAL. USART. Передача данных

8 комментариев на “STM Урок 13. HAL. USART. Передача данных
  1. Николай:

    разве 8bits including parity не передаёт 7 бит?

  2. Mikhail:

    есть ведь более «скорострельные» способы использования USART — прерывания, DMA…

  3. Айдар:

    подскажите пожалуйста как передавать переменную, а эту переменную менять каждый цикл на 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);
    написал вот так выдает ошибку

  4. Булат:

    «После того, как время стопового бита истечёт, конроллер будет считать следующие биты информационными.»
    1. Мне кажется, что по истечении стартового бита.
    2. Исправьте «контроллер».

  5. W4d1m:

    Здравствуйте, NarodStream! Планируются ли уроки по CAN шине?

  6. Сделал все как было сказано, но что то не почему то данные так и не пошли, ошибиться тут сложно, пробовал несколько вариантов usart переходников, и на нескольких портах. Самое странное, что программа шьётся, дебаг проходит тоже нормально, у меня stm32f429 Discavery. rx с tx тоже не путал, что не так не понимаю, возможно с частотой что то не так делаю, у кого то была подобная ситуация?
    Я даже зашивал и запитывал плату потом отдельно, но данные так в терминале и не увидел, с avr это у меня вышло куда быстрее. Есть какие то подводные камни тут?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*