Сегодня я решил рассказать об UART’е. Вместо ведения будет выдержка из моего дипломного проекта:
«Универсальный асинхронный или универсальный синхронно / асинхронный приемопередатчик (Universal Synchronous / Asynchronous Receiver and Transmitter — UART или USART) — удобный и простой последовательный интерфейс для организации информационного канала обмена данными микроконтроллера с внешним миром. Способен работать в полудуплексном(только прием или передача данных) и полнодуплексном режиме (одновременная передача и прием данных). UART поддерживает протокол стандарта RS-232, что обеспечивает возможность быстрой организации связи с персональным компьютером.»
Осталось добавить, что используется всего 2 сигнальных провода: первый – прием,второй – передача данных. Обозначаются RX и TX соответственно, ну и общий GND…куда ж без него?
Теперь, что касается USART STM32. Управляет этим модулем 7 регистров:
SR – status register
DR – data register
BRR – baud rate register
CR1 – control register 1
CR2 – control register 2
CR3 – control register 3
GTPR – guard time and prescaler register
Самое сложное, как на мой взгляд – настройка предделителя тактовой частоты (регистр BRR). Он несколько хитро устроен. Дело в том, что с помощью целых значений этого регистра можно очень точно кодировать дробные значения предделителя.
Итак, приступим: из руководства по программированию известно, что модуль UART STM32 тактируется от шины АРВ2(стр. 83). В моей отадочной плате STM32F1-Discovery шина АРВ2 настроена на частоту 24 МГц, а модуль UART я хочу настроить на скорость обмена в 9600 бод. Воспользовавшись формулой из руководства по программированию (стр. 588) считаем:
FUART=FAPB2/(16*BRR), где
FUART – желаемая частота UART.
FAPB2 – частота шины АРВ2.
BRR – значение предделителя.
Если с первыми двумя составляющими все ясно. То со третьим мне пришлось поломать голову. Итого, имеем следующие параметры:
FUART – 9600 бод
FAPB2 – 24 000 000 Гц
BRR – считаем!
BRR= (FAPB2/ FUART)/16
Подставляем значения и получаем => (24000000/9600)/16
Сначала действия в скобках 😉 => 2500/16
Итого значение предделителя равно => 156,25
Теперь посмотрим на регистр BRR.
0-3 биты – дробная часть значения.
15-4 биты – целое число.
Сперва вычисляем дробное значение: для этого умножим дробную часть на 16. В нашем примере: 0,25*16=4 (4h). Если получилось дробное число, то необходимо округлить по правилам математики, например: из8,3 получаем 8, а из 2,9 получаем 3.
Теперь вычисляем целую часть: Если после вычисления дробной части в результате не получилось число 16, то просто напросто отбрасываем дробную составляющую и записываем в регистр, т.е в текущем примере просто пишем 156 ( 9Ch ). Но если бы у нас дробное значение получилось 16, то его надо было бы анулировать, а в значение к целой части прибавить 1.
Итак, в нашем примере значение регистра BRR = 9C4h.
Еще один пример:
FUART – 2400 бод
FAPB2 – 997632 Гц
BRR –считаем!
BRR= (FAPB2/ FUART)/16
Подставляем значения и получаем => (997632/2400)/16
Сначала действия в скобках 😉 => 415,68/16
Итого значение предделителя равно => 25,98
Вычисляем дробное значение: 0,98*16=15,68 — округляем по правилам математики и получаем до 16 Тогда целое значение равно 25+1=26 (1Ah), а дробное 0. Таким образом значение регистра BRR = 1А0h.
Конечно, такая тактовая частота шины АРВ2 является вымышленной, но например в тех же AVR часто используются кварцевые резонаторы с дробной частотой( например, 4.433619 МГц или 8.867238 МГц), которые позволяют получить точные значения предделителя UART. Такие заморочки нужны потому, что интерфейс UART AVR очень скромный в плане всяких настроек. А синхронизация обмена данными происходт по времени, и если в приемнике и передатчике один такт будет длиться разное время, то передача может пойти с ошибками.
Таким образом можно сделать вывод, что в STM32 настройка несущих частот программная, а в AVR – аппаратная. Это, как для меня, еще один плюс 32-х разрядникам!
Это документация для последней (основной) ветки разработки Зефир. Если вы ищете документацию предыдущих выпусков, используйте раскрывающееся меню слева и выберите нужную версию.
Поставщик: STMicroelectronics
Эти узлы являются узлами шины «uart».
STM32 USART
Свойства не унаследованы от базового файла привязки.
Имя | Тип | Детали |
---|---|---|
| | Сброс информации Это свойство требуется . |
| | Включить однопроводную полудуплексную связь. В этом режиме линии TX и RX внутренне соединены и только вывод TX используется впоследствии и должен быть настроен. Конфликты RX/TX должны обрабатываться на стороне пользователя. |
| | Поменяйте местами контакты TX и RX. |
| | Инвертировать двоичную логику вывода tx. При включении физические логические уровни инвертируются и мы используем 1=низкий, 0=высокий вместо 1=высокий, 0=низкий. |
| | Инвертировать двоичную логику контакта rx. При включении физические логические уровни инвертируются и мы используем 1=низкий, 0=высокий вместо 1=высокий, 0=низкий. |
| | Конфигурация контакта/с для первого состояния. Контент специфичен для выбранная реализация драйвера пин-контроллера. Это свойство требуется . |
| | Имена для предоставленных состояний. Количество имен должно совпадать с количество штатов. Это свойство требуется . |
| | Номер строки EXTI, соответствующий регистру маски прерывания пробуждения устройства. Это свойство требуется на устройствах stm32, где сигнал прерывания пробуждения может быть настроена маска при загрузке (например, sm32wl55), предотвращающая пробуждение устройства ядро из режима(ов) остановки. Допустимый диапазон: 0–31 |
| | Информация о тактовой частоте для работы UART |
| | Начальная настройка скорости передачи для UART |
| | Установите, чтобы включить управление потоком RTS/CTS во время загрузки |
| | Настраивает четность адаптера. Идентификатор перечисления 0 для отсутствия, 1 для нечетного и 2 для четности. По умолчанию нет, если не указано. Допустимые значения: |
| | Устанавливает количество стоповых битов. Допустимые значения: |
| | Устанавливает количество битов данных. Допустимые значения: |
| | Конфигурация контакта/с для второго состояния. См. pinctrl-0. |
| | Конфигурация контакта/с для третьего состояния. См. pinctrl-0. |
| | Конфигурация контакта/с для четвертого состояния. См. pinctrl-0. |
| | Конфигурация вывода/с для пятого состояния. См. pinctrl-0. |
| | Имя каждого сброса |
#define | USART_SR_CTS (1 << 9) |
CTS: C Флаг ТС. Подробнее… | |
#define | USART_SR_LBD (1 << 8) |
9004 5 | LBD: Флаг обнаружения обрыва LIN. Подробнее… |
#define | USART_SR_TXE (1 << 7) |
TXE: буфер передачи данных пуст. Подробнее… | |
#define | USART_SR_TC (1 << 6) |
TC: Передача завершена. Подробнее… | |
#define | USART_SR_RXNE (1 << 5) |
900 45 | RXNE: регистр данных чтения не пуст. Подробнее… |
#define | USART_SR_IDLE (1 << 4) |
IDLE: обнаружена свободная линия. Подробнее… | |
#define | USART_SR_ORE (1 << 3) |
ORE: ошибка переполнения. Подробнее… | |
#define | USART_SR_NE (1 << 2) |
NE: флаг ошибки шума. Подробнее… | |
#define | USART_SR_FE (1 << 1) |
90 040 FE: Ошибка кадрирования. Подробнее… | |
#define | USART_SR_PE (1 << 0) |
PE: ошибка четности. Подробнее… | |
#define USART_SR_CTS (1 << 9) |
CTS: Флаг CTS.
Определение в строке 136 файла usart_common_f124. h.
#define USART_SR_FE (1 << 1) |
FE: Ошибка кадрирования.
Определение в строке 160 файла usart_common_f124.h.
#define USART_SR_IDLE (1 << 4) |
IDLE: Обнаружена свободная линия.
Определение в строке 151 файла usart_common_f124.h.
#define USART_SR_LBD (1 << 8) |
LBD: Флаг обнаружения обрыва LIN.
Определение в строке 139 файла usart_common_f124.h.
#define USART_SR_NE (1 << 2) |
NE: флаг ошибки шума.
Определение в строке 157 файла usart_common_f124.h.
#define USART_SR_ORE (1 << 3) |
ORE: ошибка переполнения.