/****************************************************************************** * @fn HalUARTOpenISR * * @brief Open a port according tp the configuration specified by parameter. * * @param config - contains configuration information * * @return none *****************************************************************************/ static void HalUARTOpenISR(halUARTCfg_t *config) { isrCfg.uartCB = config->callBackFunc; // Only supporting subset of baudrate for code size - other is possible. HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) || (config->baudRate == HAL_UART_BR_19200) || (config->baudRate == HAL_UART_BR_38400) || (config->baudRate == HAL_UART_BR_57600) || (config->baudRate == HAL_UART_BR_115200)); if (config->baudRate == HAL_UART_BR_57600 || config->baudRate == HAL_UART_BR_115200) { UxBAUD = 216; } else { UxBAUD = 59; } switch (config->baudRate) { case HAL_UART_BR_9600: UxGCR = 8; break; case HAL_UART_BR_19200: UxGCR = 9; break; case HAL_UART_BR_38400: case HAL_UART_BR_57600: UxGCR = 10; break; default: // HAL_UART_BR_115200 UxGCR = 11; break; } // 8 bits/char; no parity; 1 stop bit; stop bit hi. if (config->flowControl) { UxUCR = UCR_FLOW | UCR_STOP; PxSEL |= HAL_UART_Px_RTS | HAL_UART_Px_CTS; PxOUT &= ~HAL_UART_Px_RTS; PxDIR |= HAL_UART_Px_RTS; } else { UxUCR = UCR_STOP; } URXxIE = 1; UTXxIF = 1; // Prime the ISR pump. UxCSR = (CSR_MODE | CSR_RE); }
/****************************************************************************** * @fn HalUARTOpenDMA * * @brief Open a port according tp the configuration specified by parameter. * * @param config - contains configuration information * * @return none *****************************************************************************/ static void HalUARTOpenDMA(halUARTCfg_t *config) { dmaCfg.uartCB = config->callBackFunc; // Only supporting subset of baudrate for code size - other is possible. HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) || (config->baudRate == HAL_UART_BR_19200) || (config->baudRate == HAL_UART_BR_38400) || (config->baudRate == HAL_UART_BR_57600) || (config->baudRate == HAL_UART_BR_115200)); if (config->baudRate == HAL_UART_BR_57600 || config->baudRate == HAL_UART_BR_115200) { UxBAUD = 216; } else { UxBAUD = 59; } switch (config->baudRate) { case HAL_UART_BR_9600: UxGCR = 8; dmaCfg.txTick = 35; // (32768Hz / (9600bps / 10 bits)) // 10 bits include start and stop bits. break; case HAL_UART_BR_19200: UxGCR = 9; dmaCfg.txTick = 18; break; case HAL_UART_BR_38400: UxGCR = 10; dmaCfg.txTick = 9; break; case HAL_UART_BR_57600: UxGCR = 10; dmaCfg.txTick = 6; break; default: // HAL_UART_BR_115200 UxGCR = 11; dmaCfg.txTick = 3; break; } // 8 bits/char; no parity; 1 stop bit; stop bit hi. if (config->flowControl) { UxUCR = UCR_FLOW | UCR_STOP; PxSEL |= HAL_UART_Px_CTS; // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the Rx // buffer level. Start by allowing flow. PxOUT &= ~HAL_UART_Px_RTS; PxDIR |= HAL_UART_Px_RTS; } else { UxUCR = UCR_STOP; } dmaCfg.rxBuf[0] = *(volatile uint8 *)DMA_UDBUF; // Clear the DMA Rx trigger. HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_RX); HAL_DMA_ARM_CH(HAL_DMA_CH_RX); osal_memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); UxCSR |= CSR_RE; // Initialize that TX DMA is not pending dmaCfg.txDMAPending = FALSE; dmaCfg.txShdwValid = FALSE; }