Jump to main content

##

# 1.1.9.4.1 DRV_USART_Initialize Function

## C

    SYS_MODULE_OBJ DRV_USART_Initialize
    (
        const SYS_MODULE_INDEX index,
        const SYS_MODULE_INIT * const init
    )

## Summary

Initializes the USART instance for the specified driver index.

## Description

This routine initializes the USART driver instance for the specified driver index, making it ready for clients to open and use it. The initialization data is specified by the init parameter. The initialization may fail if the number of driver objects allocated are insufficient or if the specified driver instance is already initialized. The driver instance index is independent of the USART module ID. For example, driver instance 0 can be assigned to USART2.

## Precondition

None.

## Parameters

Param | Description
--- | ---
index | Identifier for the instance to be initialized
init | Pointer to the init data structure containing any data necessary to initialize the driver.

## Returns

If successful, returns a valid handle to a driver instance object. Otherwise, returns SYS_MODULE_OBJ_INVALID.

## Example

    // The following code snippet shows an example USART driver initialization.

    SYS_MODULE_OBJ objectHandle;

    const DRV_USART_PLIB_INTERFACE drvUsart0PlibAPI = {
        .readCallbackRegister = (DRV_USART_PLIB_READ_CALLBACK_REG)USART1_ReadCallbackRegister,
        .read = (DRV_USART_PLIB_READ)USART1_Read,
        .readIsBusy = (DRV_USART_PLIB_READ_IS_BUSY)USART1_ReadIsBusy,
        .readCountGet = (DRV_USART_PLIB_READ_COUNT_GET)USART1_ReadCountGet,
        .writeCallbackRegister = (DRV_USART_PLIB_WRITE_CALLBACK_REG)USART1_WriteCallbackRegister,
        .write = (DRV_USART_PLIB_WRITE)USART1_Write,
        .writeIsBusy = (DRV_USART_PLIB_WRITE_IS_BUSY)USART1_WriteIsBusy,
        .writeCountGet = (DRV_USART_PLIB_WRITE_COUNT_GET)USART1_WriteCountGet,
        .errorGet = (DRV_USART_PLIB_ERROR_GET)USART1_ErrorGet,
        .serialSetup = (DRV_USART_PLIB_SERIAL_SETUP)USART1_SerialSetup
    };

    const DRV_USART_INIT drvUsart0InitData = {
        .usartPlib = &drvUsart0PlibAPI,
        .numClients = DRV_USART_CLIENTS_NUMBER_IDX0,
        .clientObjPool = (uintptr_t)&drvUSART0ClientObjPool[0],
        .dmaChannelTransmit = DRV_USART_XMIT_DMA_CH_IDX0,
        .usartTransmitAddress = (void *)&(USART1_REGS->US_THR),
        .dmaChannelReceive = DRV_USART_RCV_DMA_CH_IDX0,
        .usartReceiveAddress = (void *)&(USART1_REGS->US_RHR),
        .bufferObjPoolSize = DRV_USART_QUEUE_SIZE_IDX0,
        .bufferObjPool = (uintptr_t)&drvUSART0BufferObjPool[0],
        .interruptUSART = USART1_IRQn,
        .interruptDMA = XDMAC_IRQn,
        .remapDataWidth = drvUsart0remapDataWidth,
        .remapParity = drvUsart0remapParity,
        .remapStopBits = drvUsart0remapStopBits,
        .remapError = drvUsart0remapError,
    };

    objectHandle = DRV_USART_Initialize(DRV_USART_INDEX_1, (SYS_MODULE_INIT*)&drvUsart0InitData);

    if (objectHandle == SYS_MODULE_OBJ_INVALID)
    {
        // Handle error
    }

## Remarks

This routine must be called before any other USART routine is called.

This routine should only be called once during system initialization. This routine will NEVER block for hardware access.