|
STM32G474xx HAL用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_hal_uart_ex.c 00004 * @author MCD Application Team 00005 * @brief Extended UART HAL module driver. 00006 * This file provides firmware functions to manage the following extended 00007 * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). 00008 * + Initialization and de-initialization functions 00009 * + Peripheral Control functions 00010 * 00011 * 00012 ****************************************************************************** 00013 * @attention 00014 * 00015 * Copyright (c) 2019 STMicroelectronics. 00016 * All rights reserved. 00017 * 00018 * This software is licensed under terms that can be found in the LICENSE file 00019 * in the root directory of this software component. 00020 * If no LICENSE file comes with this software, it is provided AS-IS. 00021 * 00022 ****************************************************************************** 00023 @verbatim 00024 ============================================================================== 00025 ##### UART peripheral extended features ##### 00026 ============================================================================== 00027 [..] 00028 (#) Declare a UART_HandleTypeDef handle structure. 00029 00030 (#) For the UART RS485 Driver Enable mode, initialize the UART registers 00031 by calling the HAL_RS485Ex_Init() API. 00032 00033 (#) FIFO mode enabling/disabling and RX/TX FIFO threshold programming. 00034 00035 -@- When UART operates in FIFO mode, FIFO mode must be enabled prior 00036 starting RX/TX transfers. Also RX/TX FIFO thresholds must be 00037 configured prior starting RX/TX transfers. 00038 00039 @endverbatim 00040 ****************************************************************************** 00041 */ 00042 00043 /* Includes ------------------------------------------------------------------*/ 00044 #include "stm32g4xx_hal.h" 00045 00046 /** @addtogroup STM32G4xx_HAL_Driver 00047 * @{ 00048 */ 00049 00050 /** @defgroup UARTEx UARTEx 00051 * @brief UART Extended HAL module driver 00052 * @{ 00053 */ 00054 00055 #ifdef HAL_UART_MODULE_ENABLED 00056 00057 /* Private typedef -----------------------------------------------------------*/ 00058 /* Private define ------------------------------------------------------------*/ 00059 /** @defgroup UARTEX_Private_Constants UARTEx Private Constants 00060 * @{ 00061 */ 00062 /* UART RX FIFO depth */ 00063 #define RX_FIFO_DEPTH 8U 00064 00065 /* UART TX FIFO depth */ 00066 #define TX_FIFO_DEPTH 8U 00067 /** 00068 * @} 00069 */ 00070 00071 /* Private macros ------------------------------------------------------------*/ 00072 /* Private variables ---------------------------------------------------------*/ 00073 /* Private function prototypes -----------------------------------------------*/ 00074 /** @defgroup UARTEx_Private_Functions UARTEx Private Functions 00075 * @{ 00076 */ 00077 static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); 00078 static void UARTEx_SetNbDataToProcess(UART_HandleTypeDef *huart); 00079 /** 00080 * @} 00081 */ 00082 00083 /* Exported functions --------------------------------------------------------*/ 00084 00085 /** @defgroup UARTEx_Exported_Functions UARTEx Exported Functions 00086 * @{ 00087 */ 00088 00089 /** @defgroup UARTEx_Exported_Functions_Group1 Initialization and de-initialization functions 00090 * @brief Extended Initialization and Configuration Functions 00091 * 00092 @verbatim 00093 =============================================================================== 00094 ##### Initialization and Configuration functions ##### 00095 =============================================================================== 00096 [..] 00097 This subsection provides a set of functions allowing to initialize the USARTx or the UARTy 00098 in asynchronous mode. 00099 (+) For the asynchronous mode the parameters below can be configured: 00100 (++) Baud Rate 00101 (++) Word Length 00102 (++) Stop Bit 00103 (++) Parity: If the parity is enabled, then the MSB bit of the data written 00104 in the data register is transmitted but is changed by the parity bit. 00105 (++) Hardware flow control 00106 (++) Receiver/transmitter modes 00107 (++) Over Sampling Method 00108 (++) One-Bit Sampling Method 00109 (+) For the asynchronous mode, the following advanced features can be configured as well: 00110 (++) TX and/or RX pin level inversion 00111 (++) data logical level inversion 00112 (++) RX and TX pins swap 00113 (++) RX overrun detection disabling 00114 (++) DMA disabling on RX error 00115 (++) MSB first on communication line 00116 (++) auto Baud rate detection 00117 [..] 00118 The HAL_RS485Ex_Init() API follows the UART RS485 mode configuration 00119 procedures (details for the procedures are available in reference manual). 00120 00121 @endverbatim 00122 00123 Depending on the frame length defined by the M1 and M0 bits (7-bit, 00124 8-bit or 9-bit), the possible UART formats are listed in the 00125 following table. 00126 00127 Table 1. UART frame format. 00128 +-----------------------------------------------------------------------+ 00129 | M1 bit | M0 bit | PCE bit | UART frame | 00130 |---------|---------|-----------|---------------------------------------| 00131 | 0 | 0 | 0 | | SB | 8 bit data | STB | | 00132 |---------|---------|-----------|---------------------------------------| 00133 | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | | 00134 |---------|---------|-----------|---------------------------------------| 00135 | 0 | 1 | 0 | | SB | 9 bit data | STB | | 00136 |---------|---------|-----------|---------------------------------------| 00137 | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | | 00138 |---------|---------|-----------|---------------------------------------| 00139 | 1 | 0 | 0 | | SB | 7 bit data | STB | | 00140 |---------|---------|-----------|---------------------------------------| 00141 | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | | 00142 +-----------------------------------------------------------------------+ 00143 00144 * @{ 00145 */ 00146 00147 /** 00148 * @brief Initialize the RS485 Driver enable feature according to the specified 00149 * parameters in the UART_InitTypeDef and creates the associated handle. 00150 * @param huart UART handle. 00151 * @param Polarity Select the driver enable polarity. 00152 * This parameter can be one of the following values: 00153 * @arg @ref UART_DE_POLARITY_HIGH DE signal is active high 00154 * @arg @ref UART_DE_POLARITY_LOW DE signal is active low 00155 * @param AssertionTime Driver Enable assertion time: 00156 * 5-bit value defining the time between the activation of the DE (Driver Enable) 00157 * signal and the beginning of the start bit. It is expressed in sample time 00158 * units (1/8 or 1/16 bit time, depending on the oversampling rate) 00159 * @param DeassertionTime Driver Enable deassertion time: 00160 * 5-bit value defining the time between the end of the last stop bit, in a 00161 * transmitted message, and the de-activation of the DE (Driver Enable) signal. 00162 * It is expressed in sample time units (1/8 or 1/16 bit time, depending on the 00163 * oversampling rate). 00164 * @retval HAL status 00165 */ 00166 HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, 00167 uint32_t DeassertionTime) 00168 { 00169 uint32_t temp; 00170 00171 /* Check the UART handle allocation */ 00172 if (huart == NULL) 00173 { 00174 return HAL_ERROR; 00175 } 00176 /* Check the Driver Enable UART instance */ 00177 assert_param(IS_UART_DRIVER_ENABLE_INSTANCE(huart->Instance)); 00178 00179 /* Check the Driver Enable polarity */ 00180 assert_param(IS_UART_DE_POLARITY(Polarity)); 00181 00182 /* Check the Driver Enable assertion time */ 00183 assert_param(IS_UART_ASSERTIONTIME(AssertionTime)); 00184 00185 /* Check the Driver Enable deassertion time */ 00186 assert_param(IS_UART_DEASSERTIONTIME(DeassertionTime)); 00187 00188 if (huart->gState == HAL_UART_STATE_RESET) 00189 { 00190 /* Allocate lock resource and initialize it */ 00191 huart->Lock = HAL_UNLOCKED; 00192 00193 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) 00194 UART_InitCallbacksToDefault(huart); 00195 00196 if (huart->MspInitCallback == NULL) 00197 { 00198 huart->MspInitCallback = HAL_UART_MspInit; 00199 } 00200 00201 /* Init the low level hardware */ 00202 huart->MspInitCallback(huart); 00203 #else 00204 /* Init the low level hardware : GPIO, CLOCK, CORTEX */ 00205 HAL_UART_MspInit(huart); 00206 #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ 00207 } 00208 00209 huart->gState = HAL_UART_STATE_BUSY; 00210 00211 /* Disable the Peripheral */ 00212