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; }