Exemple #1
0
void serial_init(serial_t *obj, PinName tx, PinName rx)
{
    uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
    uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
    obj->index = pinmap_merge(uart_tx, uart_rx);
    MBED_ASSERT((int)obj->index != NC);

    uart_config_t config;

    UART_GetDefaultConfig(&config);
    config.baudRate_Bps = 9600;
    config.enableTx = false;
    config.enableRx = false;

    UART_Init(uart_addrs[obj->index], &config, CLOCK_GetFreq(uart_clocks[obj->index]));

    pinmap_pinout(tx, PinMap_UART_TX);
    pinmap_pinout(rx, PinMap_UART_RX);

    if (tx != NC) {
        UART_EnableTx(uart_addrs[obj->index], true);
        pin_mode(tx, PullUp);
    }
    if (rx != NC) {
        UART_EnableRx(uart_addrs[obj->index], true);
        pin_mode(rx, PullUp);
    }

    if (obj->index == STDIO_UART) {
        stdio_uart_inited = 1;
        memcpy(&stdio_uart, obj, sizeof(serial_t));
    }
}
int init_uart(UART_Type *uart, IRQn_Type uart_irq_num, uint32_t baud)
{
    uint32_t uart_divisor;
    uint32_t apb_clock;
    
    
    /* Determine the UART divisor for the given baud rate. */
    apb_clock = SystemCoreClock / SYSCON_GetAPBClockDivider();
    uart_divisor = ((apb_clock / 16) + (baud / 2)) / baud;

    /* Configure baud rate & other settings */
    UART_SetDivisor(uart, uart_divisor);
    UART_SetWordLength(uart, UART_WordLength_8b);
    UART_SetStopBits(uart, UART_StopBits_1);
    UART_SetParity(uart, UART_Parity_No);

    /* Enable UART FIFOs (necessary) */
    UART_EnableFifos(uart);

    /* Flush out the FIFOs */
    UART_FlushRxFifo(uart);
    UART_FlushTxFifo(uart);
    
    /* Set the UART Rx to interrupt on every incoming byte */
    UART_SetRxFifoTrigger(uart, UART_RxFifoTrigger_1);

    /* Enable Tx */
    UART_EnableTx(uart);
}
/** @brief  Initialize a UART for communication.
  *
  * @param  [in]  uart     The UART to initialize
  * @param  [in]  baud     Baud rate to configure on the UART
  *
  * @return None.
  */
void init_uart(UART_Type *uart, uint32_t baud)
{
    uint32_t uart_divisor;
    uint32_t apb_clock;
    
    
    /* Determine the UART divisor for the given baud rate. */
    apb_clock = SystemCoreClock / SYSCON_GetAPBClockDivider();
    uart_divisor = ((apb_clock / 16) + (baud / 2)) / baud;

#if (LPC2XXX_MODEL == 2148) || (LPC2XXX_MODEL == 2138) || (LPC2XXX_MODEL == 2106) \
    || (LPC2XXX_MODEL == 2103)

    /* Configure IO pins & power on the given UART */
    
    if (uart == UART0) {
        /* Configure pins for UART0 use */
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_0_TXD0);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_1_RXD0);

        /* Power on UART0 */
        SYSCON_EnablePeriphPowerLines(SYSCON_PeriphPowerLine_UART0);
    } else if (uart == UART1) {
        /* Configure pins for UART1 use */
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_8_TXD1);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_9_RXD1);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_10_RTS1);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_11_CTS1);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_12_DSR1);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_13_DTR1);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_14_DCD1);
        PINSEL_SetPinConfig(PINSEL_PinConfig_0_15_RI1);

        /* Power on UART1 */
        SYSCON_EnablePeriphPowerLines(SYSCON_PeriphPowerLine_UART1);
    }

#else
#error No current definition set up for the given microcontroller model.
#endif

    /* Configure baud rate & terminal settings (given baud @ 8n2) */
    UART_SetDivisor(uart, uart_divisor);
    UART_SetWordLength(uart, UART_WordLength_8b);
    UART_SetStopBits(uart, UART_StopBits_2);
    UART_SetParity(UART, UART_Parity_No);
    
    /* Enable FIFOs (necessary) and flush them */
    UART_EnableFifos(UART);
    UART_FlushRxFifo(UART);
    UART_FlushTxFifo(UART);
    
    /* Enable transmitting on the UART */
    UART_EnableTx(UART);

    /* Clear the receive buffer register */
    UART_Recv(uart);
}
int hal_uart_close(int port)
{
    struct hal_uart *u;

    if (port >= FSL_FEATURE_SOC_UART_COUNT) {
        return -1;
    }
    u = &uarts[port];
    if (!u->u_open) {
        return -1;
    }

    u->u_open = 0;
    UART_DisableInterrupts(u->u_base, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable | kUART_TxDataRegEmptyInterruptEnable);
    DisableIRQ(u->u_irq);
    UART_EnableTx(u->u_base, false);
    UART_EnableRx(u->u_base, false);

    return 0;
}
int
hal_uart_config(int port, int32_t speed, uint8_t databits, uint8_t stopbits,
                enum hal_uart_parity parity, enum hal_uart_flow_ctl flow_ctl)
{
    struct hal_uart *u;
    uart_config_t uconfig;

    if (port >= FSL_FEATURE_SOC_UART_COUNT) {
        return -1;
    }
    u = &uarts[port];
    if (!u->u_configured || u->u_open) {
        return -1;
    }

    /* PIN config (all UARTs use kPORT_MuxAlt3) */
    CLOCK_EnableClock(u->p_clock);
    PORT_SetPinMux(u->p_base, u->u_pin_rx, kPORT_MuxAlt3);
    PORT_SetPinMux(u->p_base, u->u_pin_tx, kPORT_MuxAlt3);

    /* UART CONFIG */
    UART_GetDefaultConfig(&uconfig);
    uconfig.baudRate_Bps = speed;

    /* TODO: only handles 8 databits currently */

    switch (stopbits) {
    case 1:
        uconfig.stopBitCount = kUART_OneStopBit;
        break;
    case 2:
        uconfig.stopBitCount = kUART_TwoStopBit;
        break;
    default:
        return -1;
    }

    switch (parity) {
    case HAL_UART_PARITY_NONE:
        uconfig.parityMode = kUART_ParityDisabled;
        break;
    case HAL_UART_PARITY_ODD:
        uconfig.parityMode = kUART_ParityOdd;
        break;
    case HAL_UART_PARITY_EVEN:
        uconfig.parityMode = kUART_ParityEven;
        break;
    }

    /* TODO: HW flow control not supported */
    assert(flow_ctl == HAL_UART_FLOW_CTL_NONE);

    u->u_open = 1;
    u->u_tx_started = 0;

    NVIC_SetVector(u->u_irq, (uint32_t)s_uartirqs[port]);

    /* Initialize UART device */
    UART_Init(u->u_base, &uconfig, CLOCK_GetFreq(u->clk_src));
    UART_EnableTx(u->u_base, true);
    UART_EnableRx(u->u_base, true);
    UART_EnableInterrupts(u->u_base,
                          kUART_RxDataRegFullInterruptEnable |
                          kUART_RxOverrunInterruptEnable);
    EnableIRQ(u->u_irq);

    return 0;
}