Программирование ARM ESP32 UART Tue, April 23 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

ESP32 UART Печать
Добавил(а) microsin   

Universal Asynchronous Receiver/Transmitter (UART) это периферийное устройство, которое обеспечивает последовательный обмен данными с такими интерфейсами, как RS232, RS422, RS485. UART предоставляет широко распространенный и дешевый метод реализации полнодуплексного обмена данными между различными устройствами.

Примечание: в этой статье приведен перевод главы, посвященной UART из документации [1]. Незнакомые термины и сокращения см. в Словарике, в конце статьи.

Чип ESP32 содержит на борту 3 контроллера (порта) UART, каждый из которых содержит идентичный набор регистров, чтобы упростить программирование и предоставить больше гибкости при использовании.

Каждый контроллер UART конфигурируется независимо от других такими параметрами, как скорость (baud rate), количество бит в кадре (data bit length), порядок следования бит (bit ordering), количество стоп-бит в кадре (number of stop bits), наличие бита четности и его значение (parity) и т. д. Все контроллеры совместимы с UART-устройствами от других производителей, и дополнительно могут поддерживать протоколы беспроводной связи инфракрасными лучами (Infrared Data Association protocols, IrDA).

[Обзор функционала UART]

В этой статье приведено описание установки связи между ESP32 и другими UART-устройствами с помощью функций и типов данных драйвера UART (перевод документации [1]). Обзор показывает типовое программирование, и разбит на отдельные секции:

1. Настройка коммуникационных параметров - baud rate, data bits, stop bits, и т. п.
2. Настройка ножек выводов.
3. Установка драйвера - выделение ресурсов ESP32 для драйвера UART.
4. Запуск обмена через UART - отправка / прием данных.
5. Использование прерываний для определенных событий коммуникаций.
6. Удаление драйвера - освобождение ресурсов, если обмен через UART больше не требуется.

Шаги 1 .. 3 выполняются на стадии конфигурирования проекта. Шаг 4 выполняется программой ESP32 в том месте, где UART запускается в работу. Шаги 5 и 6 не обязательны.

Функции драйвера UART идентифицируют каждый из контроллеров UART с помощью типа uart_port_t. Эта идентификация необходима для всех последующих вызовов функций.

Настройка коммуникационных параметров. Параметры можно настроить сразу за один шаг, либо последовательно, один за другим. Для настройки за 1 шаг нужно вызвать функцию uart_param_config() и передать ей номер контроллера UART и структуру параметров uart_config_t:

const uart_port_t uart_num = UART_NUM_2;
 
uart_config_t uart_config = {
   .baud_rate           = 115200,
   .data_bits           = UART_DATA_8_BITS,
   .parity              = UART_PARITY_DISABLE,
   .stop_bits           = UART_STOP_BITS_1,
   .flow_ctrl           = UART_HW_FLOWCTRL_CTS_RTS,
   .rx_flow_ctrl_thresh = 122,
};
 
// Конфигурирование параметров UART
ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));

Примечание: более подробно про конфигурирование опций аппаратного управления потоком hardware flow control см. пример кода examples\peripherals\uart\uart_echo\ в каталоге установки ESP-IDF [2].

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

Таблица 1. Функции для индивидуальной конфигурации отдельных параметров UART.

Параметр Функция
Скорость (baud rate) uart_set_baudrate
Количество бит во фрейме uart_set_word_length (варианты длительности кадра выбираются значением перечисления uart_word_length_t)
Управление четностью (parity control) uart_set_parity (варианты установки четности выбираются значением перечисления uart_parity_t)
Количество стоп-бит uart_set_stop_bits (варианты установки количества бит заершения фрейма выбираются значением перечисления uart_stop_bits_t)
Режим аппаратного управления потоком uart_set_hw_flow_ctrl (режим выбирается значением перечисления uart_hw_flowcontrol_t)
Режим обмена данными uart_set_mode (режим выбирается значением перечисления uart_mode_t)

Каждая из этих функций имеет функцию-комплемент с корнем _get_, предназначенный для проверки текущего установленного значения параметра. Например, чтобы проверить текущее установленное значение baud rate, вызовите функцию uart_get_baudrate().

Настройка ножек портов. После настройки параметров обмена сконфигурируйте физические выводы GPIO, через которые будут проходить сигналы UART. Для этого вызовите функцию uart_set_pin(), и укажите номера выводов портов GPIO, на которые драйвер должен вывести сигналы Tx, Rx, RTS и CTS. Если Вы хотите сохранить текущий выделенный номер вывода для определенного сигнала, то передайте макрос UART_PIN_NO_CHANGE.

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

// Настройка ножек для UART (TX: IO4, RX: IO5, RTS: IO18, CTS: IO19)
ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, 4, 5, 18, 19));

Установка драйвера. После того, как были настроены выводы для сигналов обмена, установите драйвер вызовом функции uart_driver_install(), и укажите следующие параметры:

● Размер кольцевого буфера передачи (Tx ring buffer)
● Размер кольцевого буфера приема (Rx ring buffer)
● Дескриптор очереди событий (event queue handle) и её размер
● Флаги для назначения прерывания

Эта функция выделит необходимые внутренние ресурсы для драйвера UART.

// Настройка буферизированного UART с очередью событий
// ввода/вывода (IO event queue)
const int uart_buffer_size = (1024 * 2);
QueueHandle_t uart_queue;
// Установка драйвера UART с очередью событий:
ESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, uart_buffer_size, \
                                    uart_buffer_size, 10, &uart_queue, 0));

После того, как этот шаг выполнен, можно подключить внешнее UART-устройство и проверить обмен данными.

Запуск обмена данными. Прием и передача обрабатывается машиной состояний (finite state machine, FSM) каждого контроллера UART.

Процесс отправки данных включает следующие шаги:

1. Запись данных в буфер Tx FIFO (вызовом uart_write_bytes).
2. FSM преобразует данные в последовательность бит.
3. FSM отправляет данные.

Процесс приема похож на передачу, только последовательность шагов обратная:

1. FSM обрабатывает приходящую последовательность бит и преобразует её в параллельное представление данных.
2. FSM записывает данные в буфер Rx FIFO.
3. Чтение данных из буфера Rx FIFO (вызовом uart_read_bytes).

Таким образом, приложению нужно всего лишь записывать и считывать данные вызовами функций uart_write_bytes() и uart_read_bytes() соответственно, остальное берет на себя FSM.

Передача. После того, как данные были подготовлены для передачи, вызовите функцию uart_write_bytes(), и передайте в неё адрес буфера данных и длину этих данных. Функция скопирует данные в кольцевой буфер Tx (либо немедленно, либо после того, как в буфере окажется достаточно места), и сделает возврат. Когда освободится место в буфере Tx FIFO, обработчик прерывания (ISR) переместит данные из кольцевого буфера Tx в буфер Tx FIFO (это будет сделано в фоновом режиме, независимо от основных потоков выполнения программы). Ниже показан пример использования функции uart_write_bytes.

// Запись данных в UART.
char* test_str = "This is a test string.\n";
uart_write_bytes(uart_num, (const char*)test_str, strlen(test_str));

Функция uart_write_bytes_with_break() работает подобно uart_write_bytes(), однако добавляет в конец передачи последовательный сигнал break (serial break signal). Такой сигнал обозначается удержанием линии Tx на лог. 0 в течение периода времени, большего чем длительность одного фрейма данных.

// Запись данных в UART с завершением сигналом break.
uart_write_bytes_with_break(uart_num,
                            "test break\n",
                            strlen("test break\n"),
                            100);

Существует другая функция для записи данных в буфер Tx FIFO: uart_tx_chars(). В отличие от uart_write_bytes(), эта функция не будет блокировать свое выполнение в ожидании появления доступного места. Вместо этого uart_tx_chars запишет все данные, которые сразу поместились в Tx FIFO, и возвратит количество записанных данных.

Есть функция-компаньон uart_wait_tx_done(), которая мониторит статус буфера Tx FIFO, и выполнит возврат, когда он опустошится.

// Ожидание отправки пакета.
const uart_port_t uart_num = UART_NUM_2;
// Таймаут ожидания установлен 100 тиков RTOS ticks (TickType_t):
ESP_ERROR_CHECK(uart_wait_tx_done(uart_num, 100));

Прием. Как только данные были приняты аппаратурой UART и сохранены в буфер Rx FIFO, их надо будет извлечь оттуда (прочитать) вызовом функции uart_read_bytes(). Перед чтение данных Вы можете проверить количество данных, доступных в буфере Rx FIFO, путем вызова uart_get_buffered_data_len(). Ниже показан пример использования этих функций.

// Чтение данных из UART.
const uart_port_t uart_num = UART_NUM_2;
uint8_t data[128];
int length = 0;
ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&length));
length = uart_read_bytes(uart_num, data, length, 100);

Если данные в буфере Rx FIFO больше не нужны, то можно этот буфер очистить вызовом uart_flush().

Программное управление потоком. Если аппаратное управление потоком запрещено, Вы можете вручную устанавливать уровни сигналов RTS и DTR с помощью функций uart_set_rts() и uart_set_dtr() соответственно.

Выбор режима обмена данными. Контроллер UART поддерживает несколько режимов обмена (communication modes). Режим можно выбрать с помощью функции uart_set_mode(). Как только был выбран режим, драйвер UART будет соответствующим образом обрабатывать поведение подключенного устройства UART. В качестве примера, можно управлять микросхемой драйвера RS485 с помощью сигнала RTS, чтобы реализовать полудуплексный обмен данными интерфейса RS485.

// Настройка UART в полудуплексном режиме RS485
ESP_ERROR_CHECK(uart_set_mode(uart_num, UART_MODE_RS485_HALF_DUPLEX));

[Использование прерываний]

На различные состояния (события) UART и на обнаруженные ошибки могут быть сгенерированы прерывания. Полный список доступных прерываний предоставлен в техническом руководстве esp32_technical_reference_manual_en.pdf [3] (ESP32 Technical Reference Manual -> UART Controller (UART) -> UART Interrupts and UHCI Interrupts). Вы можете разрешить или запретить определенные прерывания вызовом функций uart_enable_intr_mask() или uart_disable_intr_mask() соответственно.

Функция uart_driver_install() устанавливает обработчик прерывания драйвера (ISR) для обслуживания кольцевых буферов Tx и Rx, и предоставляются высокоуровневые API-функции для обработки событий (см. далее).

API предоставляет удобный путь для обработки определенных прерываний, путем оборачивания их в выделенные функции:

● Детектирование события: определены несколько событий, определенных в перечислении uart_event_type_t, о которых может оповещаться приложение пользователя с использованием функционала очередей FreeRTOS. Вы можете разрешить этот функционал, когда вызываете uart_driver_install(), как это было описано выше в секции "Установка драйвера". Как использовать детектирование событий (event detection) можно найти в примере проекта examples\peripherals\uart\uart_events.

● Определение момента достижения порога места в FIFO или возникновения таймаута: буферы Tx и Rx FIFO могут вызывать прерывание, когда они были заполнены определенным количеством символов, или когда произошел таймаут при отправке или приеме данных. Для использования этих прерываний сделайте следующее:

- Сконфигурируйте соответствующе значения порога длины буфера и таймаута путем ввода их в структуру uart_intr_config_t, и вызова uart_intr_config().
- Разрешите прерывания с использованием функций uart_enable_tx_intr() и uart_enable_rx_intr().
- Запретите эти прерывания с использованием соответствующих функций uart_disable_tx_intr() и uart_disable_rx_intr().

● Детектирование последовательности (pattern detection): сработает прерывание, когда было определено появление повтора приема/передачи одного и того же символа (pattern) определенное количество раз. Эта функциональность демонстрируется в примере examples\peripherals\uart\uart_events. Это может использоваться, например, для детектирования строки команды, завершающейся определенным количеством одинаковых символов, которые добавлены в конец строки команды. Для использования pattern detection сделайте следующее:

- Сконфигурируйте и разрешите это прерывания с помощью uart_enable_pattern_det_intr().
- Запретите это прерывание с помощью uart_disable_pattern_det_intr().

Макросы. API также определяет несколько макросов. Нaпример, UART_FIFO_LEN определяет длину аппаратных буферов FIFO; UART_BITRATE_MAX дает максимальную скорость (baud rate) поддерживаемую контроллерами UART controllers, и т. д.

Удаление драйвера. Если обмен данными, установленный с помощью uart_driver_install(), больше не нужен, то драйвер можно удалить, чтобы освободить занимаемые им ресурсы, с помощью вызова uart_driver_delete().

[Обзор опций, специфичных для RS485]

В этой документации используется обозначение [UART_REGISTER_NAME].[UART_FIELD_BIT], чтобы ссылаться на поля и биты регистра UART. Для дополнительной информации по определенному биту опций см. техническое руководство esp32_technical_reference_manual_en.pdf [3] (ESP32 Technical Reference Manual -> UART Controller (UART) -> Register Summary. Используйте имя регистра (UART_REGISTER_NAME), чтобы найти описание регистра, и затем ищите в нем соответствующее поле/бит опции (UART_FIELD_BIT).

UART_RS485_CONF_REG.UART_RS485_EN: установка этого бита разрешает поддержку коммуникационного режима RS485.

UART_RS485_CONF_REG.UART_RS485TX_RX_EN: если этот бит установлен, то выходной сигнал передатчика логически замыкается на входной сигнал приемника (используется для самотестирования).

UART_RS485_CONF_REG.UART_RS485RXBY_TX_EN: если этот бит установлен, то передатчик будет отправлять данные, если приемник занят (автоматическое аппаратное устранение коллизий данных).

Аппаратура RS485 UART микроконтроллера ESP32 может детектировать коллизии сигнала во время передачи датаграммы, и генерировать прерывание UART_RS485_CLASH_INT, если это прерывание разрешено. Термин "коллизия" обозначает ситуацию, когда на линию вклиниваются одновременно 2 или более передатчиков, тем самым мешая друг другу, и тогда переданная датаграмма не соответствует принятой на противоположном конце канала связи. Коллизии могут происходить из-за наличия на шине нескольких не согласованных друг с другом передатчиков, или из-за ошибок шины.

Функция детектирования коллизий позволяет их обрабатывать, когда активировано и сработало прерывание коллизии. Прерывания UART_RS485_FRM_ERR_INT и UART_RS485_PARITY_ERR_INT могут использоваться вместе с функцией детектирования коллизии, чтобы в режиме RS485 контролировать ошибки фрейма и ошибки бита четности соответственно. Эта функциональность поддерживается в драйвере UART, и может быть использована путем выбора режима UART_MODE_RS485_APP_CTRL (см. описание функции uart_set_mode).

Функция детектирования коллизии может работать со схемой A и схемой C (см. далее секцию "Схемы интерфейса RS485"). В случае использования схемы A или B ножка RTS, подключенная к выводу DE драйвера шины, должна управляться приложением пользователя. Используйте функцию uart_get_collision_flag(), чтобы проверить, установлен ли флаг детектирования коллизии.

Сами по себе контроллеры ESP32 UART не поддерживают полудуплексный обмен данными, поскольку они не могут предоставить автоматическое управление ножкой RTS, подключенной ко входу ~RE/DE драйвера шины RS485. Однако полудуплексный обмен может быть реализован программно, путем управления ножкой RTS со стороны драйвера UART. Это можно разрешить установкой режима UART_MODE_RS485_HALF_DUPLEX, когда вызывается функция uart_set_mode().

Когда хост начинает записывать данные в буфер Tx FIFO, драйвер UART автоматически установит вывод RTS (в лог. 1); как только последний бит данных был передан, драйвер снимет сигнал с вывода RTS (лог. 0). Для использования этого режима программа должна запретить функцию аппаратного управления потоком. Этот режим работает со всеми схемами, показанными ниже.

Схемы интерфейса RS485. В этой секции приведено несколько примеров схем, демонстрирующих базовые моменты организации интерфейса ESP32 RS485.

Примечание: схемы, показанные ниже, не обязательно будут содержать все необходимые элементы. Микросхемы драйвера ADM483 и ADM2483 от компании Analog Devices приведены в качестве примера, и могут быть заменены на другие аналогичные трансиверы.

        VCC ---------------+
                           |
                   +-------x-------+
       RXD < ------| R             |
                   |              B|----------< > B
       TXD ------->| D    ADM483   |
ESP                |               |     RS485 bus side
       RTS ------->| DE            |
                   |              A|----------< > A
              +----| /RE           |
              |    +-------x-------+
              |            |
             GND          GND

Рис. 1. Схема A: детектирование коллизий.

Схема на рис. 1 предпочтительна, потому что она позволяет определять коллизии, и одновременно достаточно простая. Приемник в драйвере линии постоянно разрешен, что позволяет для UART мониторинг шины RS485. Подавление эхо производится периферийным устройством UART, когда установлен бит UART_RS485_CONF_REG.UART_RS485TX_RX_EN.

        VCC ---------------+
                           |
                   +-------x-------+
       RXD < ------| R             |
                   |              B|-----------< > B
       TXD ------->| D    ADM483   |
ESP                |               |     RS485 bus side
       RTS ---+--->| DE            |
              |    |              A|-----------< > A
              +----| /RE           |
                   +-------x-------+
                           |
                          GND

Рис. 2. Схема B: переключение прием/передача вручную, без детектирования коллизий.

Схема на рис. 2 не позволяет делать детектирование коллизий. Она подавляет null-байты, которые принимает аппаратура при установленном бите UART_RS485_CONF_REG.UART_RS485TX_RX_EN. Для этого случая бит UART_RS485_CONF_REG.UART_RS485RXBY_TX_EN неприменим.

 VCC1 < ------------------+-----------+           +-------------------+----> VCC2
               10K ____   |           |           |                   |
              +---|____|--+       +---x-----------x---+    10K ____   |
              |                   |                   |   +---|____|--+
RX < ---------+-------------------| RXD               |   |
                   10K ____       |                  A|---+---------------< > A (+)
              +-------|____|------| PV    ADM2483     |   |    ____  120
              |   ____            |                   |   +---|____|---+  RS485 bus side
    VCC1 < ---+--|____|--+------->| DE                |                |
              10K        |        |                  B|---+------------+--< > B (-)
                      ---+    +-->| /RE               |   |    ____
         10K          |       |   |                   |   +---|____|---+
        ____       | /-C      +---| TXD               |    10K         |
TX >---|____|--+_B_|/   NPN   |   |                   |                |
                   |\         |   +---x-----------x---+                |
                   | \-E      |       |           |                    |
                      |       |       |           |                    |
                     GND1    GND1    GND1        GND2                 GND2

Рис. 3. Схема C: автоматическое переключение с передатчик/приемник.

Это схема с гальванической развязкой, которая не нуждается в управлении ножкой RTS со стороны приложения или драйвера, потому что она автоматически управляет направлением работы трансивера. Однако она требует подавления null-байтов во время передачи путем установки бита UART_RS485_CONF_REG.UART_RS485RXBY_TX_EN в 1 и установки бита UART_RS485_CONF_REG.UART_RS485TX_RX_EN в 0. Эта настройка может работать в любом режиме RS485 UART, или даже в режиме UART_MODE_UART.

[Примеры приложений]

В таблице ниже показаны примеры проектов от компании Espressif, доступные в папке examples\peripherals\uart\ установленной среды разработки ESP-IDF [2].

Таблица 1. Краткое описание примеров для UART, поставляемых вместе со средой разработки ESP-IDF.

Пример кода Описание
peripherals/uart/uart_echo Конфигурирование настроек UART, установка драйвера UART, и демонстрация чтения/записи (используется UART1).
peripherals/uart/uart_events Сообщает о различных событиях обмена (communication events), демонстрируются прерывания детектирования шаблона данных (pattern detection interrupt).
peripherals/uart/uart_async_rxtxtasks Передача и прием данных в отдельных задачах FreeRTOS через один и тот же UART.
peripherals/uart/uart_select Использование синхронного мультиплексирования I/O для файловых дескрипторов UART.
peripherals/uart/uart_echo_rs485 Настройка драйвера UART для обмена через интерфейс RS485 в полудуплексном режиме. Этот пример подобен peripherals/uart/uart_echo, однако позволяет осуществлять обмен через чип интерфейса RS485, подключенный к ножкам ESP32.
peripherals/uart/nmea0183_parser Получение информации GPS путем парсинга операторов NMEA0183, принимаемых от приемника GPS через периферийное устройство UART.

[Справочник по API драйвера UART]

Заголовочный файл:

components/driver/include/driver/uart.h

Описание макросов, структур, определений типов для UART API см. в документации [1].

esp_err_t uart_driver_install (uart_port_t uart_num,
                               int rx_buffer_size,
                               int tx_buffer_size,
                               int queue_size,
                               QueueHandle_t *uart_queue,
                               int intr_alloc_flags);

Производит инсталляцию драйвера UART, и устанавливает конфигурацию по умолчанию для UART. UART ISR будет подсоединен к тому же самому ядру CPU, на котором эта функция была запущена.

Примечание: параметр rx_buffer_size должен быть больше, чем UART_FIFO_LEN. Параметр tx_buffer_size должен быть либо 0, либо больше чем UART_FIFO_LEN.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
rx_buffer_size: размер кольцевого буфера UART RX.
tx_buffer_size: размер кольцевого буфера UART TX. Если установлен в 0, то драйвер не использует буфер TX, функция передачи будет блокировать задачу, когда отправляются данные.
queue_size: размер/глубина очереди событий UART.
uart_queue: дескриптор UART событий очереди (выходной параметр). В случае успеха сюда записывается новый дескриптор очереди, чтобы можно было обрабатывать события UART путем блокировки задачи на очереди. Если установлен в NULL, то драйвер не использует очередь событий.
intr_alloc_flags: флаги, используемые для выделения прерывания. Сюда устанавливают одно или несколько объединенных операцией OR значений констант ESP_INTR_FLAG_*. Для дополнительной информации см. esp_intr_alloc.h. Не используйте здесь ESP_INTR_FLAG_IRAM (ISR драйвера UART не находится в IRAM).

esp_err_t uart_driver_delete (uart_port_t uart_num);

Деинсталлирует драйвер UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

bool uart_is_driver_installed (uart_port_t uart_num);

Проверяет, установлен драйвер, или нет.

Возвращаемые значения

true драйвер установлен
false драйвер не установлен

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_set_word_length (uart_port_t uart_num,
                                uart_word_length_t data_bit);

Устанавливает количество бит данных во фрейме UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
data_bit: количество бит данных UART.

esp_err_t uart_get_word_length (uart_port_t uart_num,
                                uart_word_length_t *data_bit);

Запрашивает конфигурацию количество бит данных во фрейме UART.

Возвращаемые значения

ESP_OK успешный возврат, результат будет помещен в ячейку памяти *data_bit
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
data_bit: указатель на ячейку памяти, которая примет количество бит данных UART.

esp_err_t uart_set_stop_bits (uart_port_t uart_num,
                              uart_stop_bits_t stop_bits);

Установит количество стоп-бит фрейма UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
stop_bits: количество стор-бит UART.

esp_err_t uart_get_stop_bits (uart_port_t uart_num,
                              uart_stop_bits_t *stop_bits);

Запрашивает конфигурацию количества стоп-бит UART.

Возвращаемые значения

ESP_OK успешный возврат, результат будет помещен в ячейку памяти *stop_bit
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
stop_bits: указатель на ячейку памяти, которая примет количество стоп-бит UART.

esp_err_t uart_set_parity (uart_port_t uart_num,
                           uart_parity_tparity_mode);

Установит режим проверки четности UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
parity_mode: одно из значений перечисления, обозначающее режим проверки четности бит фрейма.

esp_err_t uart_get_parity (uart_port_t uart_num,
                           uart_parity_t *parity_mode);

Запрашивает конфигурацию режима проверки четности фрейма UART.

Возвращаемые значения

ESP_OK успешный возврат, результат будет помещен в ячейку памяти *parity_mode
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
parity_mode: указатель на ячейку памяти, которая примет режим проверки четности бит данных UART.

esp_err_t uart_set_baudrate (uart_port_t uart_num,
                             uint32_t baudrate);

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
baudrate: скорость порта UART.

esp_err_t uart_set_baudrate (uart_port_t uart_num,
                             uint32_t baudrate);

Запрашивает конфигурацию установленной скорости UART.

Возвращаемые значения

ESP_OK успешный возврат, результат будет помещен в ячейку памяти *baudrate
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
baudrate: указатель на ячейку памяти, которая примет установленное значение скорости UART.

esp_err_t uart_set_line_inverse (uart_port_t uart_num,
                                 uint32_t inverse_mask);

Устанавливает режим инверсии сигналов UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
inverse_mask: определяет сигналы, которые должны быть инвертированы. Здесь используется маска, составленная из объединенных операцией OR значений uart_signal_inv_t.

esp_err_t uart_set_hw_flow_ctrl (uart_port_t uart_num,
                                 uart_hw_flowcontrol_t flow_ctrl,
                                 uint8_t rx_thresh);

Устанавливает аппаратное управление потоком данных (hardware flow control).

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
flow_ctrl: режим для hardware flow control.
rx_thresh: порог срабатывания Hardware RX flow control (0 .. UART_FIFO_LEN). Значение rx_thresh устанавливается только если установлен UART_HW_FLOWCTRL_RTS.

esp_err_t uart_set_sw_flow_ctrl (uart_port_t uart_num,
                                 bool enable,
                                 uint8_t rx_thresh_xon,
                                 uint8_t rx_thresh_xoff);

Устанавливает программное управление потоком данных (software flow control).

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
enable: устанавливает, разрешено ли программное управление потоком (==true), или нет (==false).
rx_thresh_xon: нижний порог срабатывания (low water mark).
rx_thresh_xoff: верхний порог срабатывания (high water mark).

esp_err_t uart_get_hw_flow_ctrl (uart_port_t uart_num,
                                 uart_hw_flowcontrol_t *flow_ctrl);

Запрашивает конфигурацию аппаратного управления потоком данных UART.

Возвращаемые значения

ESP_OK успешный возврат, результат будет помещен в ячейку памяти *flow_ctrl
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
flow_ctrl: указатель на ячейку памяти, которая примет значение опции управления потоком.

esp_err_t uart_clear_intr_status (uart_port_t uart_num, uint32_t clr_mask);

Очистит статус прерывания UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
clr_mask: битовая маска для очищаемого статуса прерывания.

esp_err_t uart_enable_intr_mask (uart_port_tuart_num, uint32_t enable_mask);

Установит разрешенные прерывания UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
enable_mask: битовая маска для прерываний, которые должны быть разрешены.

esp_err_t uart_disable_intr_mask (uart_port_t uart_num,
                                  uint32_t disable_mask);

Очистит биты разрешения прерываний UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
disable_mask: битовая маска для прерываний, которые должны быть запрещены.

esp_err_t uart_enable_rx_intr (uart_port_t uart_num);

Разрешает прерывание приема UART (RX_FULL & RX_TIMEOUT).

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_disable_rx_intr (uart_port_t uart_num);

Запрещает прерывание приема UART (RX_FULL & RX_TIMEOUT).

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_enable_tx_intr (uart_port_tuart_num,
                               int enable,
                               int thresh);

Разрешает прерывание передачи UART (TX_FULL & TX_TIMEOUT).

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
enable: 1 разрешает, 0 запрещает прерывания.
thresh: порог для прерывания TX, 0 .. UART_FIFO_LEN.

esp_err_t uart_disable_tx_intr (uart_port_t uart_num);

Запрещает прерывание передачи UART (TX_FULL & TX_TIMEOUT).

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_set_pin (uart_port_t uart_num,
                        int tx_io_num,
                        int rx_io_num,
                        int rts_io_num,
                        int cts_io_num);

Назначает сигналы периферийного устройства UART на определенные ножки GPIO.

Если номер GPIO, сконфигурированный для сигнала UART, совпадает с одним из сигналов IOMUX для этого сигнала GPIO, то этот сигнал будет подключен напрямую через IOMUX. Иначе GPIO и назначаемый сигнал будет подключаться через GPIO Matrix. Например, если ESP32 вызовет uart_set_pin (0, 1, 3, -1, -1), то поскольку GPIO1 это ножка TX по умолчанию для UART0, и GPIO3 это ножка по умолчанию RX для UART0, они оба будут подключены соответственно к U0TXD и U0RXD через IOMUX, полностью пропуская матрицу перенаправления GPIO. Проверка направления коммутации сигналов происходит для каждой ножки. Таким образом, можно сигнал RX привязать к ножке GPIO через матрицу GPIO, в то время как сигнал TX привязан к ножке GPIO через IOMUX.

Примечание: внутренний выходной сигнал может быть выведен на несколько контактов GPIO. Входной сигнал можно подключить только к одному контакту GPIO.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
tx_io_num: номер ножки порта GPIO для сигнала TX.
rx_io_num: номер ножки порта GPIO для сигнала RX.
rts_io_num: номер ножки порта GPIO для сигнала RTS.
cts_io_num: номер ножки порта GPIO для сигнала CTS.

esp_err_t uart_set_rts (uart_port_t uart_num, int level);

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

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
level: значение 1 соответствует лог. 0 на на выходе RTS (активный уровень, передача разрешена), значение 0 соответствует лог. 1 на выходе RTS (блокировка передачи).

esp_err_t uart_set_dtr (uart_port_t uart_num,
                        int level);

Установка сигнала DTR вручную.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
level: значение 1 соответствует лог. 0 на на выходе DTR, значение 0 соответствует лог. 1 на выходе DTR.

esp_err_t uart_set_tx_idle_num (uart_port_t uart_num, uint16_t idle_num);

Установит интервал ожидания UART после опустошения FIFO передачи.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
idle_num: интервал idle, после опустошения tx FIFO (единица интервала это время отправки одного бита с текущей установленной скоростью baudrate).

esp_err_t uart_param_config (uart_port_t uart_num,
                             const uart_config_t *uart_config);

Устанавливает конфигурационные параметры UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
uart_config: указатель на структуру с заполненными параметрами настройки UART.

esp_err_t uart_intr_config (uart_port_tuart_num,
                            const uart_intr_config_t *intr_conf);

Конфигурирует прерывания UART.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
intr_conf: указатель на структуру с заполненными параметрами настройки прерываний UART.

esp_err_t uart_wait_tx_done (uart_port_t uart_num, TickType_t ticks_to_wait);

Ожидание опустошения TX FIFO.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра
ESP_ERR_TIMEOUT таймаут

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
ticks_to_wait: длительность таймаута в тиках RTOS.

int uart_tx_chars (uart_port_t uart_num, const char *buffer, uint32_t len);

Посылает данные буфера в порт UART. Эта функция не ожидает достаточного количества места в TX FIFO. Она просто заполнит свободное пространство TX FIFO передаваемыми данными, и сделает возврат.

Примечание: эта функция должна использоваться только когда не разрешен буфер UART TX.

Возвращаемые значения

(-1): ошибка параметра.
Другие значения (>=0): количество байт, которые функции удалось протолкнуть в TX FIFO.

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
buffer: адрес буфера данных.
len: длина данных для отправки в байтах.

int uart_write_bytes (uart_port_t uart_num, const void *src, size_t size);

Посылает данные буфера в порт UART. Если параметр tx_buffer_size драйвера UART установлен в 0, то эта функция не будет выполнять возврат управления, пока все данные не будут отправлены, либо как минимум не будут отправлены все данные, которые удалось протолкнуть в TX FIFO.

Иначе, если tx_buffer_size > 0, то эта функция возвратит управление после копирования все данных данных в кольцевой буфер передачи, затем UART ISR будет постепенно перемещать эти данные из кольцевого буфера в TX FIFO.

Возвращаемые значения

(-1): ошибка параметра.
Другие значения (>=0): количество байт, которые функции удалось протолкнуть в TX FIFO.

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
src: адрес буфера данных.
size: длина данных для отправки.

int uart_write_bytes_with_break (uart_port_t uart_num,
                                 const void *src,
                                 size_t size,
                                 int brk_len);

Посылает данные буфера в порт UART. Если параметр tx_buffer_size драйвера UART установлен в 0, то эта функция не будет выполнить возврат, пока не будут переданы все данные и сигнал break. После того, как все данные отправлены, посылается сигнал break.

Иначе, если tx_buffer_size > 0, эта функция сделает возврат после копирования всех данных в кольцевой буфер передачи, затем UART ISR будет постепенно перемещать данные из кольцевого буфера в TX FIFO. После того, как все данные отправлены, посылается сигнал break.

Возвращаемые значения

(-1): ошибка параметра.
Другие значения (>=0): количество байт, которые функции удалось протолкнуть в TX FIFO.

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
src: адрес буфера данных.
size: длина данных для отправки.
brk_len: длительность сигнала break (единицы: время, которое занимает отправка одного бита на текущей скорости передачи).

int uart_read_bytes (uart_port_t uart_num,
                     void *buf,
                     uint32_t length,
                     TickType_t ticks_to_wait);

Чтение байт из буфера UART.

Возвращаемые значения

(-1): ошибка параметра.
Другие значения (>=0): количество байт, которые прочитаны в из RX FIFO.

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
buf: указатель на буфер.
length: длина данных.
ticks_to_wait: sTimeout, в тиках RTOS.

esp_err_t uart_flush (uart_port_t uart_num);

Псевдоним для uart_flush_input. Сброс содержимого кольцевого буфера UART. Этот вызов отбросит все данные из буфера UART RX.

Вместо ожидания завершения отправки данных эта функция очистит буфер приема UART. Чтобы отправить все данные TX FIFO, мы можем использовать функцию uart_wait_tx_done.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_flush_input (uart_port_t uart_num);

Очищает входной буфер, все данные в кольцевом буфере отбрасываются. Чтобы отправить все данные TX FIFO, мы можем использовать функцию uart_wait_tx_done.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_get_buffered_data_len (uart_port_t uart_num, size_t *size);

Длина закешированных в кольцевом буфере RX.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
size: указатель на ячейку памяти, куда будет записано количество закешированных данных.

esp_err_t uart_enable_pattern_det_intr (uart_port_t uart_num,
                                        char pattern_chr,
                                        uint8_t chr_num,
                                        int chr_tout,
                                        int post_idle,
                                        int pre_idle);

Разрешение функции детектирования шаблона (паттерн). Разработана для приложений наподобие обработчика команд AT. Когда аппаратура детектирует последовательность одного и того же символа, сработает прерывание.

Примечание: эта функция работает только для esp32. И эта функция устарела, используйте вместо неё uart_enable_pattern_det_baud_intr.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
pattern_chr: символ шаблона.
chr_num: количество символов, 8-битное значение.
chr_tout: интервал таймаута между каждым символом шаблона. 24-битное значение, единицы длительность периода частоты тактов APB (80 МГц). Когда длительность интервала меньше этого значения, функция не возьмет эти данные в качестве символа at_cmd.
post_idle: время ожидания после последнего символа шаблона. 24-битное значение, единицы длительность периода частоты тактов APB (80 МГц). Когда длительность интервала меньше этого значения, функция не возьмет предыдущие данные в качестве последнего символа at_cmd.
pre_idle: время ожидания перед первым символом шаблона. 24-битное значение, единицы длительность периода частоты тактов APB (80 МГц). Когда длительность интервала меньше этого значения, функция не возьмет эти данные в качестве первого символа at_cmd.

esp_err_t uart_disable_pattern_det_intr (uart_port_t uart_num);

Запрет функции детектирования паттерна. Разработана для приложений наподобие обработчика команд AT. Когда аппаратура детектирует последовательность одного и того же символа, сработает прерывание.

Возвращаемые значения

ESP_OK успешный возврат
ESP_FAIL ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

int uart_pattern_pop_pos (uart_port_t uart_num);

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

Следующие API-функции будут модифицировать информацию позиции шаблона: uart_flush_input, uart_read_bytes, uart_driver_delete, uart_pop_pattern_pos. В зоне ответственности приложения гарантировать атомарность доступа к очереди шаблона и буферу приема данных, когда используется функция детектирования шаблона.

Примечание: если буфер RX полон, и управление потоком не разрешено, то из-за переполнения детектированный шаблон может не оказаться в буфере приема.

Возвращаемые значения

(-1): не найден шаблон для текущего индекса, или ошибка параметра.
Другие значения: позиция шаблона в буфере приема.

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

int uart_pattern_get_pos (uart_port_t uart_num);

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

Следующие API-функции будут модифицировать информацию позиции шаблона: uart_flush_input, uart_read_bytes, uart_driver_delete, uart_pop_pattern_pos. В зоне ответственности приложения гарантировать атомарность доступа к очереди шаблона и буферу приема данных, когда используется функция детектирования шаблона.

Примечание: если буфер RX полон, и управление потоком не разрешено, то из-за переполнения детектированный шаблон может не оказаться в буфере приема.

Возвращаемые значения

(-1): не найден шаблон для текущего индекса, или ошибка параметра.
Другие значения: позиция шаблона в буфере приема.

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_pattern_queue_reset (uart_port_t uart_num, int queue_length);

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

Возвращаемые значения

ESP_ERR_NO_MEM: недостаточно памяти
ESP_ERR_INVALID_STATE: драйвер не установлен
ESP_FAIL: ошибка параметра
ESP_OK: успешное завершение

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
queue_length: максимальная длина очереди для детектированного шаблона. Если длина очереди недостаточна, то некоторые позиции шаблонов могут быть потеряны. Установите это значение в максимальное количество шаблонов, которые могут быть сохранены в буфере данных одновременно.

esp_err_t uart_set_mode (uart_port_t uart_num, uart_mode_t mode);

Устанавливает коммуникационный режим UART.

Примечание: эта функция должна выполняться после uart_driver_install(), когда объект драйвера был инициализирован.

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
mode: устанавливаемый режим UART.

esp_err_t uart_set_rx_full_threshold (uart_port_t uart_num, int threshold);

Установит значение порога заполненности RX FIFO.

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

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: ошибка параметра
ESP_ERR_INVALID_STATE: не был инсталлирован драйвер

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
threshold: значение порога заполненности буфера приема, выше которого генерируется прерывание RX FIFO full.

esp_err_t uart_set_tx_empty_threshold (uart_port_t uart_num, int threshold);

Установит значение порога опустошения TX FIFO.

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: ошибка параметра
ESP_ERR_INVALID_STATE: не был инсталлирован драйвер

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
threshold: значение порога опустошенности буфера передачи, ниже которого генерируется прерывание TX FIFO empty.

esp_err_t uart_set_rx_timeout (uart_port_t uart_num, const uint8_t tout_thresh);

Установит порог таймаута приема UART для функции TOUT.

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: ошибка параметра
ESP_ERR_INVALID_STATE: не был инсталлирован драйвер

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
tout_thresh: этот параметр определяет порог таймаута в периодах символа. Максимальное значение для порога составляет 126. Значение tout_thresh = 1, определяет таймаут прерывания TOUT, равный времени передачи одного символа (~11 бит) на текущей скорости передачиe. Если это время истекло, то генерируется прерывание UART_RXFIFO_TOUT_INT. Если tout_thresh == 0, то функция TOUT запрещена.

esp_err_t uart_get_collision_flag (uart_port_t uart_num, bool *collision_flag);

Возвратит флаг детектирования коллизии для режима RS485 и запишет его в переменную, на которую указывает collision_flag. *collision_flag = true, если была детектирована коллизия, иначе вернет false. Эта функция должна выполняться, когда завершена актуальная передача (после uart_write_bytes()).

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: ошибка параметра

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
collision_flag: указатель на ячейку типа bool для возврата флага коллизии.

esp_err_t uart_set_wakeup_threshold (uart_port_t uart_num, int wakeup_threshold);

Устанавливает количество перепадов сигнала на ножке RX для пробуждения из легкого режима сна (light sleep wakeup).

UART может использоваться для вывода системы из light sleep. Эта функция работает путем подсчета количества количества положительных перепадов на ножке RX и сравнение этого количества с порогом. Когда счетчик превысит порог, система выйдет из режима легкого сна (light sleep). Эта функция установит значение порога.

Стоп-бит и бит четности (если он разрешен) также участвуют в подсвете количества перепадов. Например, буква 'a' с кодом ASCII 97 кодируется как 0100001101 на линии RX (при конфигурации 8n1), включая биты start и stop. У этой последовательности 3 положительных перепада (переходов 0 -> 1). Таким образом, чтобы система пробуждалась от отправки символа ‘a’, установите wakeup_threshold=3.

Символ, который вызвал пробуждение, не будет принят аппаратурой UART (т. е. его нельзя будет извлечь из RX FIFO). В зависимости от установленной скорости, несколько символов после этого символа также могут быть пропущена. Обратите внимание, что когда чип входит в режим light sleep и выходит из него, меняется частота APB. Убедитесь, что UART все время настроен на корректную скорость, выберите REF_TICK в качестве источника тактирования UART путем установки поля use_ref_tick структуры uart_config_t в true.

Примечание: в ESP32 сигнал пробуждения от UART0, UART1 может быть введен только через IO_MUX (т. е. ножка GPIO3 должна быть сконфигурирован как function_1, чтобы пробуждать UART0, ножка GPIO9 сконфигурирована как function_5 для пробуждения UART1), и UART2 не поддерживает функцию light sleep wakeup.

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: если uart_num некорректен, или wakeup_threshold выходит за пределы диапазона [3, 0x3ff].

Параметры

uart_num: номер порта UART (UART0 или UART1).
wakeup_threshold: количество перепадов сигнала RX для пробуждения из легкого сна, значение в диапазоне 3 .. 0x3ff.

esp_err_t uart_get_wakeup_threshold (uart_port_t uart_num,
                                     int *out_wakeup_threshold);

Запрашивает количество перепадов сигнала RX для вывода системы из легкого сна. См. описание этой функции выше во врезке по функции uart_set_wakeup_threshold.

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: если out_wakeup_threshold == NULL

Параметры

uart_num: номер порта UART (UART0 или UART1).
out_wakeup_threshold: указатель, куда будет записано текущее значение порога пробуждения для указанного UART.

esp_err_t uart_wait_tx_idle_polling (uart_port_t uart_num);

Ждет опустошения памяти передачи UART, пока не будет отправлен последний символ (в режиме опроса, polling).

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: ошибка параметра
ESP_FAIL: не был инсталлирован драйвер

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).

esp_err_t uart_set_loop_back (uart_port_t uart_num, bool loop_back_en);

Конфигурирует обратное перенаправление сигнала передачи TX на сигнал RX (loop back), только для целей тестирования.

Возвращаемые значения

ESP_OK: успешное завершение
ESP_ERR_INVALID_ARG: ошибка параметра
ESP_FAIL: не был инсталлирован драйвер

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
loop_back_en: установите в trure для разрешения функции loop back, или установите его в false.

void uart_set_always_rx_timeout (uart_port_t uart_num,
                                 bool always_rx_timeout_en);

Конфигурирует поведение прерывания таймаута приема.

Когда параметр always_rx_timeout == true, сработает прерывание, даже если FIFO заполнен. Эта функция может вызывать дополнительные прерывания таймаута, инициируемые только для события таймаута отправки. Вызовите эту функцию только если хотите гарантировать, чтобы прерывание таймаута всегда происходило после потока байтов.

Параметры

uart_num: номер порта UART, диапазон возможных значений 0 .. (UART_NUM_MAX-1).
always_rx_timeout_en: установка в false разрешает поведение по умолчанию прерывания таймаута, установка в true приведет к тому, что прерывание таймаута будет срабатывать всегда.

[Словарик]

APB Advanced Peripheral Bus.

ISR Interrupt Service Handler, обработчик прерывания.

MUX мультиплексор.

[Ссылки]

1. ESP32 Universal Asynchronous Receiver/Transmitter (UART) site:docs.espressif.com.
2. Установка среды разработки ESP-IDF для ESP32.
3. ESP32 Technical Reference Manual site:docs.espressif.com.

 

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


Защитный код
Обновить

Top of Page