Вы находитесь на странице: 1из 5

элементы и компоненты

Современные 32-разрядные
ARM-микроконтроллеры серии STM32:
универсальный последовательный порт USART
Олег Вальпа (г. Миасс, Челябинская обл.)
7. USART_GTPR – регистр делителя
В статье приведено описание универсального последовательного порта и задержки.
USART 32-разрядных ARM-микроконтроллеров серии STM32 от компании Формат регистров с названием вхо-
STMicroelectronics. Рассмотрена архитектура, состав и назначение дящих в них разрядов представлен
регистров конфигурирования порта, а также приведены примеры в таблице 1.
программ инициализации. Передача и приём информации через
порт USART производится по кадрам,
как показано на рисунке 2.
Введение вой частоты для формирования задан- Каждый кадр начинается со стар-
Наряду с портами ввода-вывода GPIO ной скорости работы. Благодаря это- тового бита, после которого следует
универсальный синхронно-асинхрон- му можно получить стандартные ско- несколько бит информации, бит пари-
ный последовательный приёмопере- рости связи порта при любой частоте тета, если он задан, и стоповые биты.
датчик USART (Universal Synchronous тактового сигнала. Рассмотрим поочерёдно назначение
Asynchronous Receiver Transmitter) Кроме того, с помощью блока DMA и содержимое разрядов этих регистров.
является одним из самых востребован- (Direct Memory Access) для любого пор-
ных портов для связи любого микро- та USART может быть организован пря- Регистр USART_SR
контроллера с внешними устройства- мой доступ к памяти, как для приёма, Регистр статуса USART_SR хранит раз-
ми. С помощью порта USART можно так и для передачи данных. ряды, отображающие текущее состоя-
легко организовать связь микрокон- Порты USART STM32 способны ние порта USART.
троллера с компьютером, провести поддерживать скорость обмена до Разряд 0 PE отображает ошибку пари-
его программирование, а также свя- 4,5 Мбит/с. Формат слова USART может тета при приёме байта. Данный разряд
зать микроконтроллеры между собой составлять 8 или 9 бит данных и 0,5; 1; устанавливается в единичное состоя-
по интерфейсам RS-232, RS-485, 1,5 или 2 стоповых бит. Дробные значе- ние при аппаратном выявлении ошиб-
RS-422 и т.д. ния стоповых бит применяются в режи- ки паритета, т.е. несовпадении числа
Преимуществами порта USART явля- ме порта Smartcard. Первым передаётся единиц в принимаемом байте с ожи-
ются простота в использовании, а так- и принимается младший бит данных. даемым чётным или нечётным количе-
же, в отличие от интерфейса USB, гиб- Некоторые порты USART STM32 мож- ством, заданным для контроля.
кость в настройке и надёжность работы. но программно переназначать на дру- Разряд 1 FE указывает на ошибку
гие выводы микроконтроллера. кадра при приёме байта. Ошибкой
Описание портов USART На рисунке 1 приведена структур- кадра является, например, отсутствие
Микроконтроллеры STM32 [1] име- ная схема одного порта USART, кото- стопового бита или несоответствие их
ют обычно несколько портов USART. рая помогает понять изложенное выше количества заданному при настройке
Например, STM32F103RBT имеет три описание, а также даёт представление порта значению. Данный разряд также
последовательных порта, обозначае- об архитектуре порта USART и соста- устанавливается аппаратно.
мых USART1, USART2 и USART3. ве регистров для его инициализации. Разряд 2 NE фиксирует наличие шума
Кроме обычного асинхронного в кадре. Шумом считается изменение
режима работы с использованием сиг- Регистры портов USART состояния линии связи в середине при-
налов RXD и TXD, порты USART STM32 В микроконтроллерах STM32 для ёма очередного бита информации.
поддерживают несколько расширен- настройки каждого порта USART Разряд 3 ORE отображает ошибку
ных режимов работы. В отличие от и работы с ним имеется по 7 регистров: переполнения приёмного буфера.
стандартных портов USART они могут: 1. USART_SR – регистр статуса, указы- Разряд 4 IDLE фиксирует обнаруже-
●● работать с однопроводной полуду- вающий на состояние порта USART; ние кадра ожидания. Кадром ожидания
плексной линией связи; 2. USART_DR – регистр данных для является отсутствие очередного старто-
●● поддерживать интерфейсы Smart- записи передаваемых и чтения при- вого бита после стоповых бит.
карт стандарта ISO7618-3, LIN (local нимаемых данных; Следующая группа флагов позволя-
interconnection network) и IrDA 3. USART_BRR – регистр, определяю- ет определить окончание передачи или
(infrared data association); щий скорость обмена; приёма данных.
●● связываться с внешними устройства- 4. USART_CR1 – первый управляющий Разряд 5 RXNE фиксирует приём дан-
ми, оснащёнными SPI-совместимым регистр; ных в регистр USART_DR.
интерфейсом, по 3-проводной линии. 5. USART_CR2 – второй управляющий Разряд 6 TC сигнализирует о завер-
К особенностям порта USART микро- регистр; шении передачи очередного байта
контроллеров STM32 также относится 6. USART_CR3 – третий управляющий данных, записанных в регистр дан-
возможность дробного деления такто- регистр; ных USART_DR.

22 www.soel.ru современная электроника ◆ № 9 2013


элементы и компоненты

Шина данных
Запись Чтение Регистр данных (DR)

Регистр данных Регистр данных


передатчика (TDR) приемника (RDR)

TX
IrDA
SIR
RX Регистр сдвига Регистр сдвига
ENDEC
передатчика приемника
BLOCK
SW_RX

GTRR
GT PSC CK CONTROL
CR3 CR2
DMAT DMAR SCEN NACK HD IRLP IREN LINE STOP[1:0] SKEN CPOL CPHA LBCL

CR2 CR1

Адрес USART UE M WAKE PCE PS PEIE

nRTS
Драйвер
портов
nCTS

Тактовая частота
WAKE приёмника
Контроллер UP Контроллер
передатчика UNIT приёмника

CR1 CR
TXEIE TCIE RXNEIE IDLEIE TE RE RWU SBK CTS LBD TXE TC RXNE IDLE ORE NE FE PE

Блок
прерываний
USART

TE Формирователь
Тактовая частота скорости передатчика
передатчика

/16 /USARTDIV
Регистр BRR
DIV_Mantissa DIV_Fraction
15 4 0
fPCLK

Формирователь
RE скорости приёмника

Блок генератора скорости USART

Рис. 1. Структурная схема порта USART

Разряд 7 TXE сообщает о том, что этом устанавливается флаг TXE, озна- Очищаются все разряды программ-
сдвиговый регистр передачи данных чающий, что регистр данных пуст. Если но, последовательностью операций
пуст. же очередные данные не будут запи- чтения регистра USART_SR, с последу-
Порт USART передаёт данные из сдви- саны в регистр данных USART_DR, то ющим чтением регистра USART_DR.
гового регистра, в который они посту- после освобождения сдвигового реги-
пают из регистра USART_DR. После стра будет установлен также флаг TC. Регистр USART_DR
записи данных в USART_DR они нахо- Разряд 8 LBD фиксирует обнаруже- Регистр USART_DR содержит байт
дятся в нём до тех пор, пока сдвиговый ние разрыва связи. принятых или передаваемых дан-
регистр не освободится. Как только дан- Разряд 9 CTS отображает изменение ных. Несмотря на то, что в програм-
ные передаются, сдвиговый регистр состояния сигнала CTS. ме производится обращение к одному
освобождается, и в него переписыва- Разряды 10…31 зарезервированы для и тому же регистру USART_DR как для
ется информация из USART_DR. При будущих версий микроконтроллеров. приёма данных, так и для их переда-

современная электроника ◆ № 9 2013 www.soel.ru 23


элементы и компоненты

Такая запись осуществляется с по­­


Следующий кадр
мощью следующих операторов:
данных
Кадр данных Бит паритета USART1–>BRR = 0x0341; // Записать
Старт Старт
бит Бит0 Бит1 Бит2 Бит3 Бит4 Бит5 Бит6 Бит7 Бит8 Стоп бит значение скорости для USART1
бит
Старт При округлении дробной части воз-
Кадр ожидания (Idle frame) бит никла погрешность, которую мож-
Старт
но вычислить с помощью обратного
Кадр разрыва (Break frame) Стоп
бит бит преобразования. Для этого необходи-
мо преобразовать полученное значение
Рис. 2. Формат кадра порта USART в десятичное представление. В нашем
случае целая часть равна 0x34 = 52,
чи, на самом деле при чтении инфор- где fck – тактовый сигнал (PCLK2 для а дробная часть равна 1/16 = 0,0625
мация поступает из регистра приём- USART1 и PCLK1 для USART2, 3). Соот- и USARTDIV = 52,0625 вместо расчёт-
ника порта USART, а при записи дан- ветственно, значение переменной ного значения 52,0833.
ные заносятся в регистр передатчика Ошибка в процентном выражении
порта USART. . составит: error = (52,0833 – 52,0625) /
Для работы с регистром данных 52,0833 × 100% = 0,04%. Такая ошибка
используются следующие операторы: Рассмотрим пример вычисления зна- не превышает предельно допустимое
USART1->DR = tx1; // Передать байт чения переменной USARTDIV для ско- значение, составляющее 5%, и впол-
переменной tx1 через USART рости порта USART, равной 9600 бод не приемлема для нормальной рабо-
rx1 = USART1->DR; // Считать приня- с тактовой частотой 8 МГц. ты порта USART.
тый байт из USART в переменную rx1 Теперь рассмотрим разряды трёх
. управляющих регистров: USART_CR1,
Регистр USART_BRR USART_CR2 и USART_CR3.
Регистр USART_BRR служит для зада- Целая часть USARTDIV имеет значе-
ния скорости обмена через порт USART ние 52, а в 16-ричном формате 0x34. Регистр USART_CR1
и содержит определяющую эту ско- Для перевода дробной части 0,0833 Регистр USART_CR1 имеет следую-
рость переменную USARTDIV с фикси- в 16-ричный формат, необходимо щие разряды:
рованной точкой. Данная переменная умножить эту часть на 16 и округлить ●● разряд 0 SBK управляет отправкой

состоит из двух частей: целой 12-раз- полученное значение до целого. Таким символа разрыва связи (0 – не посы-
рядной части DIV_mantissa и дробной образом, получим: 0,0833 ×16 = 1,3328. лать, 1 – посылать).
4-разрядной части DIV_fraction. Дроб- После округления и перевода этого ●● разряд 1 RWU определяет режим

ная часть позволяет довольно точно значения в 16-ричный формат полу- приёмника USART (0 – приёмник
подстроить скорость обмена для любой чим число 0х01. Теперь, поместив обе активен, 1 – приёмник в «спящем»
частоты тактового сигнала. части вычисляемого числа на свои раз- режиме);
Скорость обмена вычисляется по ряды в соответствии с таблицей 1, полу- ●● разряд 2 RE разрешает работу при-

формуле: чим значение USARTDIV = 0x0341, кото- ёмника;


, рое следует записать в регистр задания ●● разряд 3 TE разрешает работу пере-

скорости USART_BRR. датчика;

Таблица 1. Формат регистров порта USART

Сдвиг Регистр 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
RXNE

IDLE

ORE
LBD
CTS

TXE

USART_SR
NE

PE
TC

FE

0x00 Резерв
Reset value 0 0 1 1 0 0 0 0 0 0
USART_DR DR[8:0]
0x04 Резерв
Reset value 0 0 0 0 0 0 0 0 0

USART_BRR DIV_Mantissa[15:4] DIV_Fraction [3:0]


0x08 Резерв
Reset value 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
RXNEIE

IDLEIE
WAKE

TXEIE

RWU
PEIE

TCIE

SBK
PCE

USART_CR1
PS
UE

RE
TE
M

0x0C Резерв
Reset value 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CLKEN
LINEN

LBDIE

STOP
CPHA
CPOL

LBDL
LBCL

Резерв

Резерв

USART_CR2 ADD[3:0]
0x10 Резерв [1:0]
Resert value 0 0 0 0 0 0 0 0 0 0 0 0 0
HDSEL
DMAR
DMAT
STSIE

NACK
SCEN
RTSE
CTSE

IREN
IRLP

EIE

USART_CR3
0x14 Резерв
Reset value 0 0 0 0 0 0 0 0 0 0 0
USART_
GT[7:0] PSC[7:0]
0x18 GTPR Резерв
Reset value 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

24 www.soel.ru современная электроника ◆ № 9 2013


элементы и компоненты

●● разряд 4 IDLEIE разрешает прерыва-


ния от флага IDLE регистра USART_SR; Ожидание или Ожидание или
предыдущий кадр Разряд М = 0 (8 бит данных) следующий кадр
Старт Стоп
●● разряд 5 RXNEIE разрешает прерыва-

ния от флага RXNE регистра USART_


CPOL = 0, CPHA = 0 *-
SR;
●● разряд 6 RXNEIE разрешает прерыва- CPOL = 0, CPHA = 1
*-
ния от флага RXNE регистра USART_
SR, когда в регистр данных переме-
*-
щён принятый байт; CPOL = 1, CPHA = 0
●● разряд 7 TXEIE разрешает прерыва-
*-
ния от флага TXE регистра USART_SR, CPOL = 1, CPHA = 1
т.е. когда регистр передачи пуст;
●● разряд 8 PEIE разрешает прерыва- TX 0 1 2 3 4 5 6 7
ние при обнаружении ошибки пари- MSB Стоп
Старт LSB
тета; RX 0 1 2 3 4 5 6 7
●● разряд 9 PS управляет типом парите- LSB MSB
та (0 – чётный, 1 – нечётный); Строб захвата данных
●● разряд 10 PCE разрешает контроль

паритета (0 – отключён, 1 – включён); * Разряд LBCL управляет синхроимпульсом для последнего бита
●● разряд 11 WAKE определяет метод

«пробуждения» порта (0 – по состо- Рис. 3. Варианты настройки порта USART в режиме SPI
янию линии связи, 1 – по выделению
адреса); ●● разряд 11 CLKEN активирует выход ●● разряд 7 DMAT разрешает работу
●● разряд 12 M определяет длину посыл- CK (0 – пассивен, 1 – активен); передатчика через DMA;
ки данных (0 – 8 бит данных, 1 – 9 ●● разряды 13 и 12 STOP определяют ●● разряд 8 RTSE разрешает формиро-

бит данных); формат стоп-битов (00 – 1 стоп-бит, вание сигнала RTS;


●● разряд 13 UE разрешает работу USART 01 – 0,5 стоп-бита, 10 – 2 стоп-бита, ●● разряд 9 CTSE разрешает формиро-

(0 – отключён, 1 – включён); 11 – 1,5 стоп-бита); вание сигнала CTS;


●● разряды 14–31 зарезервированы. ●● разряд 14 LINEN разрешает режим ●● разряд 10 CTSIE разрешает прерыва-

Для наглядности в таблице 2 при- LIN USART (0 – запрещён, 1 – разре- ния от флага CTS регистра USART_SR;
ведён формат кадра данных USART в шён); ●● разряды 11…31 зарезервированы.

зависимости от установки разрядов ●● разряды 15…31 зарезервированы. Некоторые разряды регистров USART
M и PCE. Разряды CPOL, CPHA и LBCL не долж- могут быть использованы для форми-
ны изменяться во время активности рования прерывания. Эти разряды
Регистр USART_CR2 передатчика. представлены на рисунке 4.
Ниже представлено назначение раз- Варианты настройки порта USART
рядов регистра USART_CR2: в режиме SPI с помощью разрядов CPOL, Регистр USART_GTPR
●● разряды 3…0 ADD[3:0] задают адрес CPHA и LBCL наглядно представлены на Последний регистр порта USART_CTPR
узла USART для многопроцессорной рисунке 3. содержит следующие разряды:
связи с целью его пробуждения при ●● разряды 7…0 PSC[7:0] определяют

обнаружении данного адреса; Регистр USART_CR3 величину предварительного делителя


●● разряд 4 зарезервирован и всегда Регистр USART_CR3 содержит следу- для задания скорости порта в режи-
имеет нулевое состояние; ющие разряды: ме IrDA и Smartcard;
●● разряд 5 LBDL определяет длину ●● разряд 0 EIE разрешает прерывания ●● разряды 15…8 GT[7:0] задают значе-

обнаружения разрыва LIN (0 – 10 бит, от ошибок; ние таймера защиты для работы пор-
1 – 11 бит); ●● разряд 1 IREN разрешает режим рабо- та USART в режиме Smartcard;
●● разряд 6 LBDIE разрешает пре­ ты порта IrDA; ●● разряды 31…16 зарезервированы.

рывание от флага LBD в регистре ●● разряд 2 IRLP осуществляет выбор Более подробное описание на-
USART_SR; между нормальным и низко потре- значения всех регистров USART
●● разряд 7 зарезервирован и всегда бляющим режимом IrDA (0 – нор- и их разрядов можно найти в источ-
имеет нулевое состояние; мальный режим, 1 – низко потребля- нике [2].
●● разряд 8 LBCL управляет последним ющий режим);
синхроимпульсом порта в режиме SPI ●● разряд 3 HDSEL разрешает полуду- Таблица 2. Формат кадра данных USART
(0 – не влияет, 1 – определяет син- плексный режим для однопроводно-
хроимпульс); го интерфейса; Бит М Бит PCE Формат USART

●● разряд 9 CPHA определяет фазу син- ●● разряд 4 NACK разрешает форми- 0 0 S012345678F
хроимпульсов порта в режиме SPI (0 – рование сигнала NACK в режиме 0 1 S01234567PF
по фронту, 1 – по спаду); Smartcard; 1 0 S0123456789F

●● разряд 10 CPOL определяет поляр- ●● разряд 5 SCEN разрешает работу пор- 1 1 S012345678PF

ность синхроимпульсов порта в режи- та в режиме Smartcard; Примечания:


ме SPI (0 – пассивен низкий уровень, ●● разряд 6 DMAR разрешает работу при- S – стартовый бит, F – стоповый бит, P – бит паритета,
1 – пассивен высокий уровень); ёмника через DMA; 0…8 – биты данных.

современная электроника ◆ № 9 2013 www.soel.ru 25


элементы и компоненты

производительности микроконтрол-
TC лера, а порой и к зависанию програм-
TCIE мы. Во избежание этих проблем реко-
TXE мендуется использовать работу с пор-
TXIE
том USART по прерываниям.
CTS Для работы по прерываниям необхо-
CTSIE
димо написать функцию обработчика
Прерывание
IDLE USART прерывания, в которой будет прово-
IDLEIE диться анализ причины прерывания,
RXNEIE а также будут выполняться необходи-
ORE
мые операции для его обработки.
RXNEIE
RXNE Такая функция может иметь следу-
PE ющий вид:
PEIE void USART1_IRQHandler(void)
LBD {
LBDIE unsigned char temp; // Временная
FE байтовая переменная
NE
ORE EIE if((USART1->SR USART_SR_RXNE)!=0) //
DMAR
Если приём завершен
{
Рис. 4. Структурная схема формирования прерываний от порта USART temp = USART1->DR; // Считать
принятый байт
Программное использование USART1->CR2 = ∼USART_CR2_STOP; // … // Выполнить необходимые
портов USART Значение STOP = 00 соответствует действия
После знакомства с назначением 1 стоп-биту }
регистров порта USART рассмотрим Разрешение работы приёмника, пере- if((USART1->SR USART_SR_TC)!=0) //
пример его инициализации. Допустим датчика и порта можно задать одной Если передача завершена
необходимо настроить порт USART1 командой: {
для связи с компьютером со скоростью USART1->CR1 = USART_CR1_RE | USART_ USART1->SR = ∼USART_SR_TC; //
обмена 9600 бод. Определим формат CR1_TE | USART_CR1_UE Сбросить флаг
кадра порта с длиной посылки данных Теперь инициализация порта выпол- … // Выполнить необходимые
8 бит, одним стоп-битом, без контро- нена. действия
ля паритета. Частоту тактового сигна- Для передачи данных через порт }
ла примем равной 24 МГц. USART необходимо записать переда- }
Вначале необходимо включить так- ваемый байт в регистр USART_DR кон- Для активации прерываний от пор-
тирование порта USART и портов GPIO кретного порта: та USART необходимо сначала их раз-
с помощью следующего набора команд: USART1->DR = data; // Передать байт решить и затем задать события, кото-
RCC->APB2ENR | = RCC_APB2ENR_ данных рые будут генерировать прерывания
USART1EN; // Включить Прежде чем передавать следующий с помощью следующих команд:
тактирование порта USART1 байт необходимо дождаться оконча- NVIC_EnableIRQ (USART1_IRQn); //
RCC->APB2ENR | = RCC_APB2ENR_ ния передачи предыдущего байта, ана- Разрешить прерывания от USART1
IOPAEN; // Включить тактирование лизируя состояние разряда TC регистра USART1->CR1 | = USART_CR1_TCIE; //
GPIO USART_SR: Разрешить прерывание по
RCC->APB2ENR | = RCC_APB2ENR_ while((USART1->SR USART_ окончанию передачи
AFIOEN; // Включить тактирование SR_TC)==0) {} // Ждать окончания USART1->CR1 | = USART_CR1_RXNEIE; //
альтернативных функций GPIO передачи Разрешить прерывание по приёму
Далее следует рассчитать скорость USART1->SR = ∼USART_SR_TC; // данных
обмена для порта и записать получен- Очистить флаг окончания передачи Использование прерываний осво-
ное значение в регистр USART1_BRR. Приём информации от порта мож- бождает процессор микроконтролле-
Итак: USARTDIV = fck / (16 × baud) = но осуществлять следующим образом: ра от необходимости постоянной про-
= 24 000 000/(16 × 9600) = 156,25. while((USART1->SR USART_SR_ верки флагов и позволяет высвободить
Переменная DIV_Mantissa составляет RXNE)==0) {} // Ждать приёма его ресурсы для других действий.
156 = 0x9C, а переменная DIV_Fraction информации Помимо прерываний уменьшить
= 0,25 ×16 = 4. temp = USART1->DR; // Считать нагрузку на процессор микроконтрол-
Запись значения скорости в регистр принятый байт лера позволяет использование DMA. Но
USART1_BRR выполняется с помощью В данном случае сброс флага окон- это уже тема отдельной статьи…
команды: чания приёма производится автомати-
USART1->BRR = 0x09с4; // Задать чески после чтения регистра данных. Литература
скорость обмена порта USART1 Обмен информацией через порт 1. https://www.st.com
равную 9600 бод USART с помощью ожидания установ- 2. http://www.st.com/web/en/resource/
Количество стоп-битов задаётся ки флагов является неэффективным technical/document/reference_manual/
командой: и приводит к значительным потерям CD00246267.pdf

26 www.soel.ru современная электроника ◆ № 9 2013

Вам также может понравиться