STM Урок 161. LL. USART. Передача данных. Часть 1



Продолжая изучать возможности библиотеки LL, на данном уроке мы начнём освоение аппаратной реализации шины USART (Universal synchronous asynchronous receiver transmitter) в контроллере STM32F1.

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

Технические характеристики USART контроллере STM32F1 мы также рассматривать не будем, с ними мы будем постепенно знакомиться уже на этапе создания проектов, скажу лишь, что по сравнению с аналогичной шиной в контроллере AVR есть ряд отличий, в том числе в контроллере STM32 уже можно организовать аппаратное управление потоком с помощью специальных ножек RTS и CTS. Порой данные ножки используются ещё для некоторых целей. Но об этом в будущем.

Посмотрим сначала блок-схему шины USART в нашем контроллере

 

 

Здесь мы видим, что имеются целых три управляющих регистра, регистр состояния, регистр данных, в который входят 2 регистра для передачи и 2 — для приёма, регистр времени защиты и предделителей (GTPR), . Также имеется в наличии блок управления скоростью потока (генератор бит-рейта), включающий в себя также и регистр управления скоростью потока, управляемый делитель частоты тактирования бит-рейт-генератора, контроллер управления аппаратным потоком и много чего ещё интересного.

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

По традиции начнём с регистров управления.

Первый рассматриваемый нами регистр — регистр управления 1 (control register 1)

 

 

Теперь поподробнее о битах данного регистра

UE (USART enable): бит разрешения работы USART

0 — шина выключена

1 — шина включена.

M (Word length): бит длины слова

0 — 8 бит данных

1 — 9 бит данных.

WAKE (Wakeup method): способ пробуждения

0 — по свободной линии

1 — по маркеру адреса.

PCE (Parity control enable): бит контроля чётности

0 — чётность не контролируется

1 — контроль чётности включен.

PS (Parity selection): тип контроля чётности

0 — проверка на чётность

1 — проверка на нечётность.

PEIE (PE interrupt enable): бит включения прерываний по чётности

0 — прерывания запрещены

1 — прерывания разрешены.

TXEIE (TXE interrupt enable): бит включения прерываний по опустошению буфера передатчика

0 — прерывания запрещены

1 — прерывания разрешены.

TCIE (Transmission complete interrupt enable): бит включения прерываний по окончанию передачи

0 — прерывания запрещены

1 — прерывания разрешены.

RXNEIE (RXNE interrupt enable): бит включения прерываний по заполнению буфера приёмника

0 — прерывания запрещены

1 — прерывания разрешены.

IDLEIE (IDLE interrupt enable): бит включения прерываний по окончанию приёма (освобождения линии)

0 — прерывания запрещены

1 — прерывания разрешены.

TE (Transmitter enable): бит включения передатчика

0 — передатчик выключен

1 — передатчик включен.

RE (Receiver enable): бит включения приёмника

0 — приёмник выключен

1 — приёмник включен.

RWU (Receiver wakeup): бит перевода приёмника в спящий режим

0 — режим активный

1 — режим спящий.

SBK (Send break): бит включения передачи символов BREAK. После передачи символа (вернее кода символа) бит очищается автоматически

0 — нет передачи Break

1 — передача Break.

 

 

Следующий регистр — регистр управления 2 (control register 2)

 

 

Назначение битов регистра.

LINEN (LIN mode enable): бит включения режима LIN.

LIN (Local Interconnect Network) — это специальный стандарт промышленной сети, в котором также умеет работать наш USART.

0 — режим LIN не используется

1 — режим LIN включен.

STOP (STOP bits): битовое поле управления стоповыми битами

00 — 1 стоповый бит

01 — 0.5 стоповых бит

10 — 2 стоповых бита

11 — 1.5 стоповых бита

CLKEN (Clock enable): бит разрешения работы линии синхронизации (контакт CK)

0 — синхронизация не используется

1 — синхронизация включена.

CPOL (Clock polarity): бит полярности линии CK

0 — уровень готовности линии CK — низкий

1 — уровень готовности линии CK — высокий.

CPHA (Clock phase): бит фазы линии CK

0 — данные пойдут по фронту первого тактового импульса

1 — данные пойдут по фронту второго тактового импульса.

LBCL (Last bit clock pulse): данный бит позволяет выбрать, должен ли тактовый импульс, связанный с последним битом данных (MSB), выводиться на вывод CK в синхронном режиме

0 — последний бит не выводится на линию CK

1 — последний бит выводится на линию CK.

LBDIE (LIN break detection interrupt enable): разрешение прерываний от шины в режиме LIN по обнаружению прерывания (в буквальном смысле или перерыва) на линии

0 — прерывания запрещены

1 — прерывания разрешены.

LBDL (lin break detection length): бит длительности прерывания (перерыва) на линии в режиме LIN

0 — 10 бит

1 — 11 бит.

ADD[3:0] (Address of the USART node): битовое поле адреса на шине в для мультипроцессорной коммуникации.

Следующий регистр — регистр управления 3 (control register 3)

 

 

Назначение битов регистра:

CTSIE (CTS interrupt enable): разрешение прерывания от линии CTS

0 — прерывания запрещены

1 — прерывания разрешены.

CTSE (CTS enable): разрешение использования линии CTS

0 — линия не используется

1 — линия включена.

RTSE (RTS enable): разрешение использования линии RTS

0 — линия не используется

1 — линия включена.

DMAT (DMA enable transmitter): Включение DMA для передатчика

0 — DMA не используется

1 — DMA включен.

DMAR (DMA enable receiver): Включение DMA для приемника

0 — DMA не используется

1 — DMA включен.

SCEN (Smartcard mode enable): режим работы со смарткартами

0 — режим работы со смарткартами не используется

1 — режим работы со смарткартами включен.

NACK (Smartcard NACK enable): бит разрешения передачи условия NACK (нет подтверждения) в случае ошибки в режиме работы со смарткартами

0 — передача NACK не используется

1 — передача NACK включена.

HDSEL (Half-duplex selection): Включение полудуплексного режима (режим однопроводной передачи данных в оба направления

0 — полудуплексный режим не используется

1 — полудуплексный режим включен.

IRLP (IrDA low-power): бит выбора режима работы в режиме ИК

0 — обычный режим

1 — режим пониженного энергопотребления.

IREN (IrDA mode enable): бит включения режима ИК (передачи по инфракрасному порту)

0 — режим ИК не используется

1 — режим ИК включен.

EIE (Error interrupt enable): бит разрешения прерываний в случае ошибки. Генерация прерываний в случае ошибки кадрирования, ошибки переполнения или шумовой ошибки (флаги FE, ORE и NE)

0 — прерывания запрещены

1 — прерывания разрешены.

 

 

Следующий регистр — регистр состояния (Status register)

 

 

Назначение битов данного регистра:

CTS (CTS flag): бит обнаружения изменения уровня на линии CTS (если такая включена). Сбрасывается программно

0 — изменения состояния линии CTS не происходило

1 — произошло изменение состояния линии CTS.

LBD (LIN break detection flag) — флаг перерыва (прерывания) на шине LIN. Сбрасывается программно

0 — перерыва не происходило

1 — произошел перерыв (прерывание) на шине LIN.

TXE (Transmit data register empty): флаг опустошения буфера передатчика. Сбрасывается с помощью записи в регистр DR

0 — опустошения буфера передатчика не было

1 — произошло опустошение буфера передатчика.

TC (Transmission complete): флаг завершения передачи. Отличие от TXE в том, что не только буфер очищен, но ещё и сдвиговый регистр отработал. Сбрасывается программно записью 0 в данный бит.

0 — завершения передачи не происходило

1 — произошло завершение передачи.

RXNE (Read data register not empty): флаг заполнения буфера приёмника. Сбрасывается чтением регистра DR

0 — заполнения буфер приёмника не было

1 — произошло заполнение буфера приёмника.

IDLE (IDLE line detected): линия свободна. Сбрасывается чтением сначала регистра SR, потом DR

0 — линия занята

1 — линия свободна.

ORE (Overrun error): флаг переполнения буфера. Сбрасывается чтением сначала регистра SR, потом DR

0 — переполнение буфера не обнаружено

1 — обнаружено переполнение буфера или новые данные в буфере пытаются перезаписать старые, которые ещё не были прочитаны.

NE (Noise error flag): флаг обнаружения шума на линии. Сбрасывается чтением сначала регистра SR, потом DR

0 — шума не обнаружено

1 — обнаружен шум на линии.

FE (Framing error): флаг ошибки кадра. Сбрасывается чтением сначала регистра SR, потом DR

0 — ошибки кадра не обнаружено

1 — обнаружена ошибка кадра.

PE (Parity error): ошибка при проверке чётности, например, дважды пришёл нечётный кадр. Сбрасывается чтением сначала регистра SR, потом DR. Только перед чтением надо подождать, когда установится бит RXNE

0 — ошибки чётности не обнаружено

1 — обнаружена ошибка чётности.

Следующий регистр — регистр настройки скорости передачи данных или бит-рейта (Baud rate register)

 

 

Здесь всего два битовых поля:

DIV_Mantissa[11:0] (mantissa of USARTDIV): мантисса или целая часть.

DIV_Fraction[3:0] (fraction of USARTDIV): дробная часть.

Чуть позже мы узнаем, как производится настройка бит-рейта шины USART.

А теперь следующий регистр — регистр времени защиты и предделителей (Guard time and prescaler register)

 

 

Здесь также два битовых поля:

GT[7:0] (Guard time value): значение времени защиты в тактах. Используется только в режиме работы со смарткартами.

PSC[7:0] (Prescaler value): значение коэффициента предделителя. Используется только в режиме работы со смарткартами и в режиме ИК

Для режима ИК в режиме пониженного энергопотребления

00000001 — деление на 1

00000010 — деление на 2

В нормальном режиме ИК всегда 00000001.

В режиме работы со смарткартами используются только биты 4:0:

00000 — не используется

00001 — деление на 2

00010 — деление на 4

00011 — деление на 6.

Следующий регистр — регистр данных (Data register)

 

 

Используются только 9 младших бит, в данный регистр мы записываем данные для их последующей передачи в шину или читаем из него пришедшие данные.

Давайте теперь рассмотрим, как настраивается скорость работы шины USART.

Для этого существует формула в Reference Manual

 

 

где fCK — частота тактирования периферии (PCLK1 для USART2, 3, 4, 5 или PCLK2 для USART1), а USARTDIV, это коэффициент деления, который содержится в двух битовых полях регистра BRR.

Также в той же технической документации приведены аж целых 3 примера расчёта этого самого коэффициента деления из двух полей.

Нам, думаю хватит и одного. За основу берём 1 пример.

Если в целой части (DIV_Mantissa) находится десятичное число 27, а в дробной 12, то целая часть коэффициента у нас и будет 27, а дробная считается делением числа в дробной части регистра на 16, то есть в нашем случае 12/16 — это 0.75. Таким образом, коэффициент у нас получился 27.75.

Дальше мы уже подставляем этот коэффициент в вышеприведенную формулу и, в зависимости от нашей установленной частоты тактирования шины, рассчитываем наш битрейт.

Так как стандартные общепринятые скорости (9600, 115200 и т.д.) мы не всегда сможем получить точно из формулы, то мы можем рассчитать процент ошибки (или погрешности), в технической документации в качестве примеров расчёта приведена вот такая таблица

 

 

Хотя точного значения мы не всегда сможем добиться, но надо стремиться к тому, чтобы погрешность была наименьшей.

 

В следующей части нашего занятия мы закрепим наши знания, приобретенные в прошлой части занятия, на практике.

 

 

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

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

Индикатор светодиодный семиразрядный с драйвером MAX7219

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM LL. USART. Передача данных

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

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

*