/** ****************************************************************************** * @file xl_uart.c * @author Kirk * @version 4.5.2 * @date Fri Mar 26 17:29:12 2021 * @brief This file provide function about UART firmware program ****************************************************************************** * @attention * * 2019 by Chipways Communications,Inc. All Rights Reserved. * This software is supplied under the terms of a license * agreement or non-disclosure agreement with Chipways. * Passing on and copying of this document,and communication * of its contents is not permitted without prior written * authorization. * *

© COPYRIGHT 2019 Chipways

****************************************************************************** */ #if defined(__cplusplus) extern "C" { #endif /* Includes ---------------------------------------------------------------*/ #include "xl_uart.h" /** @addtogroup XL6600_StdPeriph_Driver * @{ */ /** @defgroup UART UART Module * @brief UART Driver Modules Library * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** @defgroup UART_Private_Functions * @brief * @{ */ /** * @brief ÅäÖÃUARTxÍâÉè¼Ä´æÆ÷ΪĬÈÏÖµ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @retval None */ void UART_DeInit(UART_Type* UARTx) { /* Deinitializes to default reset values */ UARTx->LCR = 0x00; UARTx->DLH = 0x00; UARTx->DLL = 0x00; UARTx->SGW = 0x00; } /** * @brief ÅäÖÃUARTxͨѶ²¨ÌØÂÊ£¬¾²Ì¬º¯Êý * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param SourceClk: ÍâÉèʱÖÓÆµÂÊ * @param BaudRate: ͨѶ²¨ÌØÂÊ * @retval None */ static void UART_SetBaudRate(UART_Type *UARTx, uint32_t SourceClk, uint32_t BaudRate) { uint32_t DivisorLatch; uint32_t Fractional; /* the serial clock frequency divided by sixteen times the value of the baud rate divisor */ DivisorLatch=(SourceClk>>4u)/BaudRate; Fractional =(((SourceClk>>4u) - (BaudRate*DivisorLatch))<<4u)/BaudRate; /* Divisor Latch Low */ UARTx->DLL=DivisorLatch; /* Divisor Latch High */ UARTx->DLH=DivisorLatch>>8u; UARTx->DLF = Fractional; } /** * @brief ¸ù¾ÝUART_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯UARTxÍâÉè * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_InitStruct: UART³õʼ»¯ÅäÖýṹÌå * @retval None */ void UART_Init(UART_Type* UARTx, const UART_InitTypeDef* UART_InitStruct) { uint32_t temp; uint32_t temp1; /* set the DLAB bit (LCR[7]) */ UARTx->LCR |= UART_LCR_DLAB_MASK; /* Set the baudrate */ UART_SetBaudRate(UARTx,UART_InitStruct->UART_SourceClk,UART_InitStruct->UART_BaudRate); temp1 = UARTx->LCR; temp1 &= ~UART_LCR_DLAB_MASK; temp1 |= ((uint32_t)UART_InitStruct->UART_DataLength | (uint32_t)UART_InitStruct->UART_StopBits | (uint32_t)UART_InitStruct->UART_Parity); UARTx->LCR = temp1; temp = UARTx->FCR; /* first clear the TET and RT bit */ temp &= ~(UART_FCR_RT_MASK | UART_FCR_TET_MASK); /* select the empty threshold level at which the THRE Interrupts */ temp |= UART_InitStruct->UART_TET; /* select the trigger level in the receiver FIFO at which the Received Data */ temp |= UART_InitStruct->UART_RT; UARTx->FCR = temp; } /** * @brief ¸ù¾ÝUART_FIFOInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯UARTxÍâÉè * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_FIFOInitStruct: UART³õʼ»¯ÅäÖýṹÌå * @retval None */ void UART_FIFOInit(UART_Type* UARTx, const UART_FIFOInitTypeDef* UART_FIFOInitStruct) { uint32_t temp; temp = (uint32_t)UART_FIFOInitStruct->UART_RT | (uint32_t)UART_FIFOInitStruct->UART_TET | \ (uint32_t)UART_FIFOInitStruct->UART_FIFO_Enable; UARTx->FCR = temp; } /** * @brief »ñÈ¡UARTµÄFTFO¹¦ÄÜʹÄÜ״̬ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @retval (ENABLE or DISABLE) */ FunctionalState UART_GetFIFOEnableStatus(const UART_Type* UARTx) { FunctionalState ret; if((UARTx->IIR & UART_IIR_FIFOSE_MASK) == UART_IIR_FIFOSE_MASK) { ret = ENABLE; } else { ret = DISABLE; } return ret; } /** * @brief ʹÄÜUARTxÍâÉè * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param State: UARTxʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: UARTxʹÄÜ * @arg DISABLE: UARTxʧÄÜ * @retval None */ void UART_EnableCmd(UART_Type* UARTx, FunctionalState State) { if(State == ENABLE) { UARTx->SGW |= UART_SGW_EN_MASK; } else { UARTx->SGW &= ~UART_SGW_EN_MASK; } } /** * @brief ·¢ËÍLINͬ²½¼ä¸ô¶Î * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @retval None */ void UART_SendLinBreak(UART_Type* UARTx) { UARTx->PATTERN |= UART_PATTERN_BC_MASK; } /** * @brief ÉèÖÃUARTxͬ²½¼ä¸ô¶Î³¤¶È * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_BreakLength: Ö¸¶¨Í¬²½¼ä¸ô¶Î³¤¶È * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART_LINBreakLength_10b: ÖÁÉÙÉú³É10bitͬ²½¼ä¸ô¶Î³¤¶È * @arg UART_LINBreakLength_13b: ÖÁÉÙÉú³É13bitͬ²½¼ä¸ô¶Î³¤¶È * @retval None */ void UART_LINBreakLengthConfig(UART_Type* UARTx, uint8_t UART_BreakLength) { UARTx->LCR &= ~UART_LCR_BRK13_MASK; UARTx->LCR |= UART_BreakLength; } /** * @brief ͨ¹ýUARTx·¢ËÍÒ»¸öÊý¾Ý * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param Data: ´ý·¢ËÍÊý¾Ý * @retval None */ void UART_SendData(UART_Type *UARTx,uint8_t Data) { UARTx->THR = Data; } /** * @brief ͨ¹ýUARTx½ÓÊÕÒ»¸öÊý¾Ý * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @retval ·µ»ØÊý¾Ý */ uint8_t UART_ReceiveData(const UART_Type *UARTx) { return (uint8_t)UARTx->RBR; } /** * @brief ʹÄÜUARTxÍâÉèÖ¸¶¨ÖÐ¶Ï * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_Interrupt£ºÖжÏÀàÐÍ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART_RDataAvailableIntEN: ½ÓÊÕÊý¾ÝÖÐ¶Ï * @arg UART_THoldingEmptyIntEN£º·¢ËͼĴæÆ÷¿ÕÖÐ¶Ï * @arg UART_RLineStatusIntEN£º Ïß·״̬ÖÐ¶Ï * @arg UART_ModenStatusIntEN£º µ÷ÖÆÖÐ¶Ï * @arg UART_THREIntEN£ºTHREÖÐ¶Ï * @param State: UARTx ÖжÏʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: UARTx Ö¸¶¨ÖжÏʹÄÜ * @arg DISABLE: UARTx Ö¸¶¨ÖжÏʧÄÜ * @retval None */ void UART_EnableInterruptCmd(UART_Type *UARTx, uint8_t UART_Interrupt, FunctionalState State) { if(State == ENABLE) { UARTx->IER |= UART_Interrupt; } else { UARTx->IER &= ~UART_Interrupt; } } /** * @brief »ñÈ¡UARTxÍâÉèÖ¸¶¨ÖжÏʹÄÜ״̬ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_Interrupt£ºÖжÏÀàÐÍ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART_RDataAvailableIntEN: ½ÓÊÕÊý¾ÝÖÐ¶Ï * @arg UART_THoldingEmptyIntEN£º·¢ËͼĴæÆ÷¿ÕÖÐ¶Ï * @arg UART_RLineStatusIntEN£º Ïß·״̬ÖÐ¶Ï * @arg UART_ModenStatusIntEN£º µ÷ÖÆÖÐ¶Ï * @arg UART_THREIntEN£ºTHREÖÐ¶Ï * @retval µ±Ç°×´Ì¬(SET or RESET) */ FlagStatus UART_GetInterruptCmd(const UART_Type *UARTx, uint8_t UART_Interrupt) { FlagStatus ret = RESET; if(0u != (UARTx->IER & UART_Interrupt)) { ret = SET; } return ret; } /** * @brief »ñÈ¡UARTxÍâÉèÖжÏ״̬ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @retval IID: ÖжÏID£¬Ö¸Ê¾²úÉúÖжϵÄÀàÐÍ * @arg UART_IID_NONE: ÎÞÖжϵȴý * @arg UART_IID_TxHoldingEmpty: THRΪ¿Õ * @arg UART_IID_RxDataAvailable: ½ÓÊÕµÄÊý¾Ý¿ÉÓà * @arg UART_IID_RxLineStatus: ½ÓÊÕÏß·״̬ * @arg UART_IID_Busy: æÖÐ¶Ï * @arg UART_IID_Overtime: ×Ö·û³¬Ê± */ uint8_t UART_GetInterruptStatus (const UART_Type *UARTx) { uint8_t IntIdentityTemp; IntIdentityTemp =(uint8_t)UARTx->IIR ; return IntIdentityTemp; } /** * @brief ʹÄÜUARTxÍâÉèÔÝÍ£´«Êä * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param State: UARTx ÔÝÍ£´«ÊäʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: UARTx ÔÝÍ£´«ÊäʹÄÜ * @arg DISABLE: UARTx ÔÝÍ£´«ÊäʧÄÜ * @retval None */ void UART_EnableHaltTransmitCmd(UART_Type *UARTx, FunctionalState State) { if(State == ENABLE) { UARTx->HTX |= UART_HTX_HTX_MASK; } else { UARTx->HTX &= ~UART_HTX_HTX_MASK; } } /** * @brief »ñÈ¡UARTxÍâÉè·¢ËÍFIFOÊý¾Ý¸öÊý * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @retval TxFIFOÊý¾Ý¸öÊý */ uint8_t UART_GetTxFIFOLevel(const UART_Type *UARTx) { return (uint8_t)UARTx->TFL&UART_TFL_TFIFOL_MASK; } /** * @brief »ñÈ¡UARTxÍâÉè½ÓÊÕFIFOÊý¾Ý¸öÊý * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @retval RxFIFOÊý¾Ý¸öÊý */ uint8_t UART_GetRxFIFOLevel(const UART_Type *UARTx) { return (uint8_t)UARTx->RFL&UART_RFL_RFIFOL_MASK; } /** * @brief »ñÈ¡UARTxÍâÉèÖ¸¶¨×´Ì¬ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_StatusType: ״̬ÀàÐÍ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART_Busy: UARTæ * @arg UART_TransmitFIFONotFull: ·¢ËÍFIFOδÂú * @arg UART_TransmitFIFOEmpty: ·¢ËÍFIFOΪ¿Õ * @arg UART_ReceiveFIFONotEmpty: ½ÓÊÕFIFO²»Îª¿Õ * @arg UART_ReceiveFIFOFull: ½ÓÊÕFIFOÂú * @arg UART_BusIdle: UART×ÜÏß´¦ÓÚIDLE״̬ * @retval µ±Ç°×´Ì¬(SET or RESET) */ FlagStatus UART_GetStatus(const UART_Type *UARTx, uint8_t UART_StatusType) { FlagStatus ret; if( ( (UARTx->USR >> UART_StatusType)&(uint32_t)0x01) != 0u) { ret = SET; } else { ret = RESET; } return ret; } /** * @brief »ñÈ¡UARTxÍâÉèÖ´ÐÐÏß·״̬ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_LineStatusType: Ïß·״̬ÀàÐÍ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART_LSRDataReady: Êý¾Ý×¼±¸ºÃ * @arg UART_LSROverrunErr: Òç³ö´íÎó * @arg UART_LSRParityErr: ÆæÅ¼Ð£Ñé´íÎó * @arg UART_LSRFrameErr: Ö¡´íÎó * @arg UART_LSRBreakIntr: ¼ä¸ô·û¼ì²âÖÐ¶Ï * @arg UART_LSRTHREmpty: ·¢Ëͱ£³Ö¼Ä´æÆ÷Ϊ¿Õλ * @arg UART_LSRTransmitterEmpty: ·¢ËÍÆ÷¿Õ * @arg UART_LSRReceiverFIFOErr: ½ÓÊÕÆ÷FIFO´íÎó * @retval µ±Ç°×´Ì¬(TRUE or FALSE) */ FlagStatus UART_GetLineStatus(const UART_Type *UARTx,uint8_t UART_LineStatusType) { FlagStatus ret; if( ( (UARTx->LSR >> UART_LineStatusType)&(uint32_t)0x01) != 0u) { ret = SET; } else { ret = RESET; } return ret; } /** * @brief µ¥ÏßģʽÏÂÉèÖÃUARTxÍâÉèTxDÒý½Å·½Ïò * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_SingleLineDirection: Ö¸¶¨TxDÒý½Å·½Ïò * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART_SingleLineDirection_Input: TxDÒý½ÅÔÚµ¥ÏßģʽÏÂÉèÖÃΪÊäÈë * @arg UART_SingleLineDirection_Output: TxDÒý½ÅÔÚµ¥ÏßģʽÏÂÉèÖÃΪÊä³ö * @retval None */ void UART_SingleLineDirectionConfig(UART_Type *UARTx, bool_t UART_SingleLineDirection) { if(UART_SingleLineDirection) { UARTx->SGW |= UART_SGW_TXDIR_MASK; } else { UARTx->SGW &= ~UART_SGW_TXDIR_MASK; } } /** * @brief ÉèÖÃUARTxÍâÉèģʽ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param UART_ModeType: Ö¸¶¨UARTxÍâÉèģʽ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART_Mode_Normal: Õý³£Ä£Ê½ * @arg UART_Mode_SingleLine: µ¥Ïßģʽ * @arg UART_Mode_Loop: »·»ØÄ£Ê½ * @retval None */ void UART_SetMode(UART_Type *UARTx , uint8_t UART_ModeType) { if(UART_ModeType == UART_Mode_Normal) { UARTx->SGW &= ~UART_SGW_LOOPS_MASK; } else if(UART_ModeType == UART_Mode_SingleLine) { UARTx->SGW |= UART_SGW_LOOPS_MASK; UARTx->SGW |= UART_SGW_RSRC_MASK; } else { UARTx->SGW |= UART_SGW_LOOPS_MASK; UARTx->SGW &= ~UART_SGW_RSRC_MASK; } } /** * @brief ʹÄÜDMAģʽÈí¼þÈ·ÈÏ * @param UARTx: Ñ¡ÔñUARTÍâÉè * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg UART0: UART0ÍâÉè * @arg UART1: UART1ÍâÉè * @arg UART2: UART2ÍâÉè * @param State: UARTx Èí¼þÓ¦´ðʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: UARTx Èí¼þÓ¦´ðʹÄÜ * @arg DISABLE: UARTx Èí¼þÓ¦´ðʧÄÜ * @retval None */ void UART_DMASoftwareAckEnableCmd(UART_Type *UARTx, FunctionalState State) { if(State == ENABLE) { UARTx->DMASA |= UART_DMASA_DMASA_MASK; } else { UARTx->DMASA &= ~UART_DMASA_DMASA_MASK; } } /** * @} */ /** * @} */ /** * @} */ #ifdef __cplusplus } #endif /* __cplusplus */