| .. _uart_api: |
| |
| Universal Asynchronous Receiver-Transmitter (UART) |
| ################################################## |
| |
| Overview |
| ******** |
| |
| Zephyr provides three different ways to access the UART peripheral. Depending |
| on the method, different API functions are used according to below sections: |
| |
| 1. :ref:`uart_polling_api` |
| 2. :ref:`uart_interrupt_api` |
| 3. :ref:`uart_async_api` using :ref:`dma_api` |
| |
| Polling is the most basic method to access the UART peripheral. The reading |
| function, :c:func:`uart_poll_in`, is a non-blocking function and returns a character |
| or ``-1`` when no valid data is available. The writing function, |
| :c:func:`uart_poll_out`, is a blocking function and the thread waits until the given |
| character is sent. |
| |
| With the Interrupt-driven API, possibly slow communication can happen in the |
| background while the thread continues with other tasks. The Kernel's |
| :ref:`kernel_data_passing_api` features can be used to communicate between |
| the thread and the UART driver. |
| |
| The Asynchronous API allows to read and write data in the background using DMA |
| without interrupting the MCU at all. However, the setup is more complex |
| than the other methods. |
| |
| .. warning:: |
| |
| Interrupt-driven API and the Asynchronous API should NOT be used at |
| the same time for the same hardware peripheral, since both APIs require |
| hardware interrupts to function properly. Using the callbacks for both |
| APIs would result in interference between each other. |
| :kconfig:option:`CONFIG_UART_EXCLUSIVE_API_CALLBACKS` is enabled by default |
| so that only the callbacks associated with one API is active at a time. |
| |
| |
| Configuration Options |
| ********************* |
| |
| Most importantly, the Kconfig options define whether the polling API (default), |
| the interrupt-driven API or the asynchronous API can be used. Only enable the |
| features you need in order to minimize memory footprint. |
| |
| Related configuration options: |
| |
| * :kconfig:option:`CONFIG_SERIAL` |
| * :kconfig:option:`CONFIG_UART_INTERRUPT_DRIVEN` |
| * :kconfig:option:`CONFIG_UART_ASYNC_API` |
| * :kconfig:option:`CONFIG_UART_WIDE_DATA` |
| * :kconfig:option:`CONFIG_UART_USE_RUNTIME_CONFIGURE` |
| * :kconfig:option:`CONFIG_UART_LINE_CTRL` |
| * :kconfig:option:`CONFIG_UART_DRV_CMD` |
| |
| |
| API Reference |
| ************* |
| |
| .. doxygengroup:: uart_interface |
| |
| |
| .. _uart_polling_api: |
| |
| Polling API |
| =========== |
| |
| .. doxygengroup:: uart_polling |
| |
| |
| .. _uart_interrupt_api: |
| |
| Interrupt-driven API |
| ==================== |
| |
| .. doxygengroup:: uart_interrupt |
| |
| |
| .. _uart_async_api: |
| |
| Asynchronous API |
| ================ |
| |
| .. doxygengroup:: uart_async |