Академический Документы
Профессиональный Документы
Культура Документы
Современные 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.
Шина данных
Запись Чтение Регистр данных (DR)
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
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 скорости приёмника
Разряд 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. При будущих версий микроконтроллеров. приёма данных, так и для их переда-
состоит из двух частей: целой 12-раз- полученное значение до целого. Таким символа разрыва связи (0 – не посы-
рядной части DIV_mantissa и дробной образом, получим: 0,0833 ×16 = 1,3328. лать, 1 – посылать).
4-разрядной части DIV_fraction. Дроб- После округления и перевода этого ●● разряд 1 RWU определяет режим
ная часть позволяет довольно точно значения в 16-ричный формат полу- приёмника USART (0 – приёмник
подстроить скорость обмена для любой чим число 0х01. Теперь, поместив обе активен, 1 – приёмник в «спящем»
частоты тактового сигнала. части вычисляемого числа на свои раз- режиме);
Скорость обмена вычисляется по ряды в соответствии с таблицей 1, полу- ●● разряд 2 RE разрешает работу при-
Сдвиг Регистр 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
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
паритета (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 разрешает формиро-
Для наглядности в таблице 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] определяют
обнаружения разрыва 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
производительности микроконтрол-
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