/** ****************************************************************************** * @brief USART functions of the firmware library. ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "gd32f10x_usart.h" #include "gd32f10x_rcc.h" /** @addtogroup GD32F10x_Firmware * @{ */ /** @defgroup USART * @brief USART driver modules * @{ */ /** @defgroup USART_Private_Defines * @{ */ /* USART Interrupts mask */ #define INT_MASK ((uint16_t)(0x001F)) /* USART CTLR1 initializes bit mask */ #define CTLR1_CLEAR_MASK ((uint16_t)(0x160C)) /* USART CTLR2 CLOCK initializes bit mask */ #define CTLR2_CLOCK_CLEAR_MASK ((uint16_t)(0x0F00)) /* USART CTLR3 initializes bit mask */ #define CTLR3_CLEAR_MASK ((uint16_t)(0x0300)) /** * @} */ /** @defgroup USART_Private_Functions * @{ */ /** * @brief Reset the USART peripheral. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param NewValue: new value of the USARTx peripheral. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_DeInit(USART_TypeDef *USARTx) { if (USARTx == USART0) { RCC_APB2PeriphReset_Enable(RCC_APB2PERIPH_USART0RST, ENABLE); RCC_APB2PeriphReset_Enable(RCC_APB2PERIPH_USART0RST, DISABLE); } else if (USARTx == USART1) { RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_USART1RST, ENABLE); RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_USART1RST, DISABLE); } else if (USARTx == USART2) { RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_USART2RST, ENABLE); RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_USART2RST, DISABLE); } else if (USARTx == UART3) { RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_UART3RST, ENABLE); RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_UART3RST, DISABLE); } else { if (USARTx == UART4) { RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_UART4RST, ENABLE); RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_UART4RST, DISABLE); } } } /** * @brief Initialize the USART peripheral interface parameters. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_InitParaStruct: the struct USART_InitPara pointer. * @retval None */ void USART_Init(USART_TypeDef *USARTx, USART_InitPara *USART_InitParaStruct) { uint32_t divider = 0, apbclock = 0, temp = 0; RCC_ClocksPara RCC_ClocksState; USARTx->CTLR1 &= ~((uint32_t)USART_CTLR1_UEN); /* Initialize CTLR2 */ temp = USARTx->CTLR2; /* Reset stop bits then set it use USART_STBits */ temp &= ~((uint32_t)USART_CTLR2_STB); temp |= (uint32_t)USART_InitParaStruct->USART_STBits; USARTx->CTLR2 = temp; /*Initialize CTLR1*/ temp = USARTx->CTLR1; /* Reset WL, PCEN, PM, TEN and REN bits */ temp &= ~((uint32_t)CTLR1_CLEAR_MASK); /* According to USART_WL,USART_Parity,USART_RxorTx to configure the CTLR1 */ temp |= (uint32_t)USART_InitParaStruct->USART_WL | USART_InitParaStruct->USART_Parity | USART_InitParaStruct->USART_RxorTx; USARTx->CTLR1 = temp; /*Initialize CTLR3*/ temp = USARTx->CTLR3; /* Reset CTSEN and RTSEN bits */ temp &= ~((uint32_t)CTLR3_CLEAR_MASK); /* According to USART_HardwareFlowControl to configure the CTLR3 */ temp |= USART_InitParaStruct->USART_HardwareFlowControl; USARTx->CTLR3 = temp; /*Initialize USART BRR*/ RCC_GetClocksFreq(&RCC_ClocksState); if (USARTx == USART0) { apbclock = RCC_ClocksState.APB2_Frequency; } else { apbclock = RCC_ClocksState.APB1_Frequency; } /* Get integer of baud-rate divide and raction of baud-rate divider */ divider = (uint32_t)((apbclock) / ((USART_InitParaStruct->USART_BRR))); temp = (uint32_t)((apbclock) % ((USART_InitParaStruct->USART_BRR))); /* Round the divider : if fractional part i greater than 0.5 increment divider */ if (temp >= (USART_InitParaStruct->USART_BRR) / 2) { divider++; } USARTx->BRR = (uint16_t)divider; } /** * @brief Initial the struct USART_InitPara * @param USART_InitParaStruct: the struct USART_InitPara pointer * @retval None */ void USART_ParaInit(USART_InitPara *USART_InitParaStruct) { /* USART_InitStruct members default value */ USART_InitParaStruct->USART_BRR = 9600; USART_InitParaStruct->USART_WL = USART_WL_8B; USART_InitParaStruct->USART_STBits = USART_STBITS_1; USART_InitParaStruct->USART_Parity = USART_PARITY_RESET; USART_InitParaStruct->USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX; USART_InitParaStruct->USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE; } /** * @brief Initialize the USARTx peripheral Clock according to the * specified parameters in the USART_ClockInitStruct. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef structure that contains * the configuration information for the specified USART peripheral. * @retval None */ void USART_ClockInit(USART_TypeDef *USARTx, USART_ClockInitPara *USART_ClockInitStruct) { uint32_t temp = 0; temp = USARTx->CTLR2; /* Clear CKEN, CPL, CPH, LBCP and SSM bits */ temp &= ~(CTLR2_CLOCK_CLEAR_MASK); /* Reset hen set it usethe USART Clock, CPL, CPH, LBCP */ temp |= (uint32_t)(USART_ClockInitStruct->USART_CKEN | USART_ClockInitStruct->USART_CPL | USART_ClockInitStruct->USART_CPH | USART_ClockInitStruct->USART_LBCP); /* Write to USART CTLR2 */ USARTx->CTLR2 = (uint16_t)temp; } /** * @brief Initial the struct USART_ClockInitPara. * @param USART_ClockInitParaStruct: the struct USART_ClockInitPara pointer * @retval None */ void USART_ClockStructInit(USART_ClockInitPara *USART_ClockInitParaStruct) { /*Reset USART_ClockInitStruct members default value */ USART_ClockInitParaStruct->USART_CKEN = USART_CKEN_RESET; USART_ClockInitParaStruct->USART_CPL = USART_CPL_LOW; USART_ClockInitParaStruct->USART_CPH = USART_CPH_1EDGE; USART_ClockInitParaStruct->USART_LBCP = USART_LBCP_DISABLE; } /** * @brief Enable or disable the specified USART peripheral. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param NewValue: new value of the USARTx peripheral. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_Enable(USART_TypeDef *USARTx, TypeState NewValue) { /* Enable or disable the specified USART peripheral by setting the UEN bit in the CTLR1 register */ if (NewValue != DISABLE) { USARTx->CTLR1 |= USART_CTLR1_UEN; } else { USARTx->CTLR1 &= ~((uint16_t)USART_CTLR1_UEN); } } /** * @brief Set the system clock prescaler. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_Prescaler: specifies the prescaler clock. * @note This function has to be called before calling USART_Enable() function. * @retval None */ void USART_SetPrescaler(USART_TypeDef *USARTx, uint8_t USART_Prescaler) { /* Clear and set the USART prescaler */ USARTx->GTPR &= ~((uint16_t)USART_GTPR_PSC); USARTx->GTPR |= USART_Prescaler; } /** * @brief Send data by the USART peripheral. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param Data: the data will be sent. * @retval None */ void USART_DataSend(USART_TypeDef *USARTx, uint16_t Data) { USARTx->DR = (Data & (uint16_t)0x01FF); } /** * @brief Receive data by the USART peripheral. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @retval The received data. */ uint16_t USART_DataReceive(USART_TypeDef *USARTx) { return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); } /** * @brief Set the address of the USART terminal. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_Address: Indicates the address of the USART node. * @retval None */ void USART_Address(USART_TypeDef *USARTx, uint8_t USART_Address) { /* Clear the USART address and Set the USART terminal*/ USARTx->CTLR2 &= ~USART_CTLR2_ADD; USARTx->CTLR2 |= USART_Address; } /** * @brief Enable or disable the USART's mute mode. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param NewValue: the USART mute mode. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_MuteMode_Enable(USART_TypeDef *USARTx, TypeState NewValue) { /* By setting the MEN bit in the CTLR1 register enable or disable the USART's mute mode*/ if (NewValue != DISABLE) { USARTx->CTLR1 |= USART_CTLR1_RWU; } else { USARTx->CTLR1 &= ~USART_CTLR1_RWU; } } /** * @brief Set the USART WakeUp method from mute mode. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_WakeUp * This parameter can be one of the following values * @arg USART_WAKEUP_IDLELINE * @arg USART_WAKEUP_ADDRESSMARK * @retval None */ void USART_MuteModeWakeUp_Set(USART_TypeDef *USARTx, uint16_t USART_WakeUp) { USARTx->CTLR1 &= ~((uint16_t)USART_CTLR1_WM); USARTx->CTLR1 |= USART_WakeUp; } /** * @brief Set the USART LIN Break detection length. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_LINBreakDetectLength * This parameter can be one of the following values * @arg USART_LINBREAKDETECTLENGTH_10B * @arg USART_LINBREAKDETECTLENGTH_11B * @retval None */ void USART_SetLINBDLength(USART_TypeDef *USARTx, uint16_t USART_LINBreakDetectLength) { USARTx->CTLR2 &= ~((uint16_t)USART_CTLR2_LBDL); USARTx->CTLR2 |= USART_LINBreakDetectLength; } /** * @brief Enable or disable the USART's LIN mode. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param NewValue: the USART LIN mode value. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_LIN_Enable(USART_TypeDef *USARTx, TypeState NewValue) { /* By setting the LINEN bit in the CTLR2 register enable or disable the USART's LIN mode */ if (NewValue != DISABLE) { USARTx->CTLR2 |= USART_CTLR2_LMEN; } else { USARTx->CTLR2 &= ~((uint16_t)USART_CTLR2_LMEN); } } /** * @brief Enable or disable the Half-duplex mode. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param NewValue: the USART Half-duplex mode value. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_HalfDuplex_Enable(USART_TypeDef *USARTx, TypeState NewValue) { /* By setting the HDEN bit in the CTLR3 register enable or disable the Half-duplex mode */ if (NewValue != DISABLE) { USARTx->CTLR3 |= USART_CTLR3_HDEN; } else { USARTx->CTLR3 &= ~USART_CTLR3_HDEN; } } /** * @brief Set the the USART guard time. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @param USART_GuardTime: the USART guard time. * @retval None */ void USART_GuardTime_Set(USART_TypeDef *USARTx, uint8_t USART_GuardTime) { /* Set the USART guard time */ USARTx->GTPR &= ~((uint16_t)USART_GTPR_GT); USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); } /** * @brief Enable or disable the USART's Smart Card mode. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @param NewValue: the Smart Card mode value. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_SmartCard_Enable(USART_TypeDef *USARTx, TypeState NewValue) { /* By setting the SCEN bit in the CTLR3 register enable or disable the USART's Smart Card mode */ if (NewValue != DISABLE) { USARTx->CTLR3 |= USART_CTLR3_SCEN; } else { USARTx->CTLR3 &= ~((uint16_t)USART_CTLR3_SCEN); } } /** * @brief Enable or disable NACK transmission. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param NewValue: the NACK transmission state. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_SmartCardNACK_Enable(USART_TypeDef *USARTx, TypeState NewValue) { /* By setting the NACK bit in the CTLR3 register Enable or disable NACK transmission */ if (NewValue != DISABLE) { USARTx->CTLR3 |= USART_CTLR3_NACK; } else { USARTx->CTLR3 &= ~((uint32_t)USART_CTLR3_NACK); } } /** * @brief DMA enable for transmission or reception. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_DMAEnable: the DMA request. * This parameter can be one of the following values * @arg USART_DMAREQ_RX * @arg USART_DMAREQ_TX * @param NewValue: the DMA Request sources state. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_DMA_Enable(USART_TypeDef *USARTx, uint16_t USART_DMAEnable, TypeState NewValue) { /* Enable or disable the DMA transfer for transmission or reception by setting the DENT and/or DENR bits in the USART CTLR3 register */ if (NewValue != DISABLE) { USARTx->CTLR3 |= USART_DMAEnable; } else { USARTx->CTLR3 &= ~USART_DMAEnable; } } /** * @brief Set the USARTX IrDA low-power. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_IrDAMode * This parameter can be one of the following values * @arg USART_IRDAMODE_LOWPOWER * @arg USART_IRDAMODE_NORMAL. * @retval None */ void USART_IrDA_Set(USART_TypeDef *USARTx, uint16_t USART_IrDAMode) { USARTx->CTLR3 &= ~((uint16_t)USART_CTLR3_IRLP); USARTx->CTLR3 |= USART_IrDAMode; } /** * @brief Enable or disable the USART's IrDA interface. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param NewValue: the IrDA mode value. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_IrDA_Enable(USART_TypeDef *USARTx, TypeState NewValue) { /* By setting the IREN bit in the CTLR3 register enable or disable the USART's IrDA interface */ if (NewValue != DISABLE) { USARTx->CTLR3 |= USART_CTLR3_IREN; } else { USARTx->CTLR3 &= ~((uint16_t)USART_CTLR3_IREN); } } /** * @brief Detect the bit flag of STR register. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_FLAG: the flag of STR register. * This parameter can be one of the following values: * @arg USART_FLAG_CTSF: CTS Change flag.(not available for UART4 and UART5) * @arg USART_FLAG_LBDF: LIN Break detection flag * @arg USART_FLAG_TBE: Transmit data register empty flag. * @arg USART_FLAG_TC: Transmission Complete flag. * @arg USART_FLAG_RBNE: Receive data register not empty flag. * @arg USART_FLAG_IDLEF:Idle Line detection flag. * @arg USART_FLAG_ORE: OverRun Error flag. * @arg USART_FLAG_NE: Noise Error flag. * @arg USART_FLAG_FE: Framing Error flag. * @arg USART_FLAG_PE: Parity Error flag. * @retval The new state of USART_FLAG (SET or RESET). */ TypeState USART_GetBitState(USART_TypeDef *USARTx, uint16_t USART_FLAG) { if ((USARTx->STR & USART_FLAG) != (uint16_t)RESET) { return SET; } else { return RESET; } } /** * @brief Enable or disable USART interrupt. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_INT: the USART interrupt * This parameter can be one of the following values: * @arg USART_INT_PE * @arg USART_INT_TBE * @arg USART_INT_TC * @arg USART_INT_RBNE * @arg USART_INT_IDLEF * @arg USART_INT_LBDF * @arg USART_INT_CTSF (not available for UART4 and UART5) * @arg USART_INT_ERIE * @param NewValue: the USART interrupt State. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_INT_Set(USART_TypeDef *USARTx, uint16_t USART_INT, TypeState NewValue) { uint32_t intpos = 0, usartreg = 0; uint32_t usartxbase = 0; usartxbase = (uint32_t)USARTx; /* Get the USART register index and the interrupt position */ usartreg = ((uint8_t)(USART_INT) >> 0x05); intpos = USART_INT & INT_MASK; /* Get the interrupt from which register: CTLR1,CTLR2 OR CTLR3 */ if (usartreg == 0x01) { usartxbase += 0x0C; } else if (usartreg == 0x02) { usartxbase += 0x10; } else { usartxbase += 0x14; } if (NewValue != DISABLE) { *(__IO uint32_t *)usartxbase |= (((uint32_t)0x01) << intpos); } else { *(__IO uint32_t *)usartxbase &= ~(((uint32_t)0x01) << intpos); } } /** * @brief Clear the bit flag. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_FLAG: the bit flag usart . * This parameter can be one of the following values: * @arg USART_FLAG_CTSF: CTS Change flag.(not available for UART4 and UART5) * @arg USART_FLAG_LBDF: LIN Break detection flag * @arg USART_FLAG_TC: Transmission Complete flag. * @arg USART_FLAG_RBNE: Receive data register not empty flag. * @note * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun * error) and IDLEF (Idle line detected) flag bits are cleared by * software sequence: a read operation to USART_STR register * (USART_GetBitState()) followed by a read operation to USART_DR register * (USART_DataReceive()). * - RBNE flag bit can be also cleared by a read to the USART_DR register * (USART_DataReceive()). * - TC flag bit can be also cleared by software sequence: a read * operation to USART_STR register (USART_GetBitState()) followed by a write * operation to USART_DR register (USART_DataSend()). * - TBE flag bit is cleared only by a write to the USART_DR register * (USART_DataSend()). * @retval None */ void USART_ClearBitState(USART_TypeDef *USARTx, uint16_t USART_FLAG) { USARTx->STR = (uint16_t)~ USART_FLAG; } /** * @brief Detect the interrupt bit flag. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_INT: the USART interrupt bit flag. * This parameter can be one of the following values: * @arg USART_INT_PE * @arg USART_INT_TBE * @arg USART_INT_TC * @arg USART_INT_RBNE * @arg USART_INT_IDLEF * @arg USART_INT_LBDF * @arg USART_INT_CTSF: CTS flag interrupt (not available for UART4 and UART5) * @arg USART_INT_ORE * @arg USART_INT_NE * @arg USART_INT_FE * @retval The new state of USART_INT (SET or RESET). */ TypeState USART_GetIntBitState(USART_TypeDef *USARTx, uint16_t USART_INT) { uint16_t bitpos = 0, itmask = 0, usartreg = 0; /* Get the USART register index and the interrupt position */ usartreg = (((uint8_t)USART_INT) >> 0x05); itmask = (USART_INT) & (INT_MASK); itmask = (uint16_t)0x01 << itmask; if (usartreg == 0x01) { itmask &= USARTx->CTLR1; } else { if (usartreg == 0x02) { itmask &= USARTx->CTLR2; } else { itmask &= USARTx->CTLR3; } } bitpos = USART_INT >> 0x08; bitpos = (uint32_t)0x01 << bitpos; bitpos &= USARTx->STR; if ((itmask != (uint16_t)RESET) && (bitpos != (uint16_t)RESET)) { return SET; } else { return RESET; } } /** * @brief Clear the interrupt bit flag. * @param USARTx: the USART peripheral. * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @param USART_INT: the interrupt bit flag. * This parameter can be one of the following values: * @arg USART_INT_TC * @arg USART_INT_LBDF * @arg USART_INT_CTSF: CTS Flag interrupt (not available for UART4 and UART5) * @arg USART_INT_RBNE * @arg USART_INT_TC * @note * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun * error) and IDLEF (Idle line detected flag) interrupt bits are cleared by * software sequence: a read operation to USART_STR register * (USART_GetINTState()) followed by a read operation to USART_DR register * (USART_DataReceive()). * - RBNE interrupt bit can be also cleared by a read to the USART_DR register * (USART_DataReceive()). * - TC interrupt bit can be also cleared by software sequence: a read * operation to USART_STR register (USART_GetINTState()) followed by a write * operation to USART_DR register (USART_DataSend()). * - TBE interrupt bit is cleared only by a write to the USART_DR register * (USART_DataSend()). * @retval None */ void USART_ClearIntBitState(USART_TypeDef *USARTx, uint16_t USART_INT) { uint16_t bitpos = 0, itmask = 0; bitpos = USART_INT >> 0x08; itmask = ((uint16_t)0x01 << (uint16_t)bitpos); USARTx->STR = (uint16_t)~itmask; } /** * @brief Send break command. * @param USARTx: the USART peripheral * This parameter can be one of the following values * @arg USART1 * @arg USART2 * @arg USART3 * @arg UART4 * @arg UART5 * @retval None */ void USART_SendBreak(USART_TypeDef *USARTx) { /* Send break command */ USARTx->CTLR1 |= USART_CTLR1_SBKCMD; } /** * @} */ /** * @} */ /** * @} */