4.16. UART¶
4.16.1. Introduction¶
Driver enables UART’s available on SOC for reading and writing to any peripherals on board. Additionally it supports simple APIs for Console/STDIO operations.
Modes of Operation
Following modes of operations are supported
UART_MODE_BLOCKING: In this mode, read and write APIs, blocks on semaphore until required operation is complete. By default, UART driver operates in blocking mode. In this mode, code execution of a task blocks until UART transaction is complete. While transaction is in progress additional tasks pending requests will remain in blocked state waiting for semaphore.
UART_MODE_CALLBACK: In this mode, read and write operation returns immediately. On trigger of hardware Interrupt (hwi) callback function gets triggered.
4.16.2. User Interface¶
4.16.2.1. Driver Configuration¶
Board Specific Configuration
All board specific configurations eg:enabling clock and pin-mux for UART pins are required before calling any driver APIs.By default Board_Init() API supports all initialization sequence for TI supported EVMs. In addition it initializes UART instance for Console/STDIO.Refer PDK Board Support for additional details.Once board specific configuration is complete UART_init() API can be called to initialize driver.
UART Configuration Structure
The UART_soc.c file binds driver with hardware attributes on the board through UART_config structure. This structure must be provided to UART driver. It must be initialized before the UART_init() function is called and cannot be changed afterwards.
For details about individual fields of this library structure, see the PDK doxygen documentation
4.16.2.2. APIs¶
API reference for application:
#include <ti/drv/uart/UART.h>
STDIO API reference for application:
#include <ti/drv/uart/UART_stdio.h>
Open UART
There are three ways to open a UART instance:
- UART_open()
...
Board_init(boardCfg);
...
UART_socGetInitCfg(UART_INSTANCE, &uart_cfg);
...
UART_socSetInitCfg(UART_INSTANCE, &uart_cfg);
...
UART_Params_init(¶ms);
...
handle = UART_open(UART_INSTANCE, ¶ms);
At this point UART driver is ready for data transfer on specific instance identified by handle. Application can call UART_read/write API for read/write operation
- UART_stdioInit() using the default UART parameters
...
Board_init(boardCfg);
...
UART_socGetInitCfg(UART_INSTANCE, &uart_cfg);
...
UART_socSetInitCfg(UART_INSTANCE, &uart_cfg);
...
UART_stdioInit(UART_INSTANCE);
At this point UART driver is ready for data transfer on specific instance. Application can call UART_printf/scanFmt API for read/write operation
- UART_stdioInit2() using Application specified UART parameters
...
Board_init(boardCfg);
...
UART_socGetInitCfg(UART_INSTANCE, &uart_cfg);
...
UART_socSetInitCfg(UART_INSTANCE, &uart_cfg);
...
UART_Params_init(¶ms);
...
UART_stdioInit2(UART_INSTANCE, ¶ms);
At this point UART driver is ready for data transfer on specific instance. Application can call UART_printf/scanFmt API for read/write operation
Read/Write APIs
Interrupt:
UART_read(handle,scanPrompt, sizeof(scanPrompt));/* Read API */
...
UART_write(handle, bufferPrompt, sizeof(bufferPrompt));/* Write API */
Or
UART_transactionInit(&transaction);
transaction.buf = (void *)scanPrompt;
transaction.count = sizeof(scanPrompt);
UART_read2(uart, &transaction);
...
UART_transactionInit(&transaction);
transaction.buf = (void *)bufferPrompt;
transaction.count = sizeof(bufferPrompt);
UART_write2(uart, &transaction);
Polling:
UART_readPolling(handle,scanPrompt, sizeof(scanPrompt));/* Read Polling mode API */
...
UART_writePolling(handle, bufferPrompt, sizeof(bufferPrompt));/* Write Polling API */
DMA Usage :
UART driver supports DMA operations to transfer data between
- Memory and RX FIFO for read transfer
- Memory and TX FIFO for write transfer.
DMA Driver is DMA family IP (EDMA and UDMA) and UART IP (V0 and V1) specific. Refer soc/dma/v#/UART_dma.c for these operations. Application need to create DMA handle and update the configuration before UART_init() API.
uartInitCfg[UART_INSTANCE].edmaHandle = UartApp_edmaInit();/* For AM/K1/K2 devices */
or
uartInitCfg[UART_INSTANCE].udmaHandle = UartApp_udmaInit();/* For K3 devices */
UART_init();
Refer “UART_BasicExample_[SOC]_[cpu]DMATestproject” or “UART_DMA_[evm]_[cpu]TestApp” for additional reference. Refer SDK Release Note for supported EVMs.
4.16.3. Application¶
4.16.3.1. Examples¶
Name | Description | Expected Results | SoC Supported | Build Type |
---|---|---|---|---|
UART_Example application | Example demonstrating simple UART use case. Reference example for developers | Application prompts user to enter input data in console. User can enter up to 16 characters or terminate with enter key.Application echoes back characters. |
AM335x, AM437x, AM571x, AM572x, AM574x, k2g, k2hk,k2l,k2e,k2l c6657,c6678 omapl137, omapl138, | CCS project |
UART_TestApplication | Unit Test application to test all APIs | User can enter up to 16 characters using serial console.Application echoes back | AM335x,AM437x,AM571x AM572x,AM574X k2g,k2hk,k2l,k2e,k2l c6657,c6678 omapl137,omapl138 | CCS project |
am65xx,j721e,tpr12 j7200, am64x | makefile | |||
UART_DMATestApplication | Unit Test application with DMA mode. | User can enter up to 16 characters using serial console.Application echoes back | AM335x,AM437x,AM571x AM572x,AM574X k2g,k2hk,k2l,k2e,k2l c6657,c6678 omapl137,omapl138 | CCS project |
am65xx,j721e,tpr12, j7200, am64x | makefile |