STM32 - HAL库UART串口
1.串口初始化配置
/*******************************************************************************
Function: BSP_UART_Init
Description: 串口初始化
Input: instance 串口号baudRate: 波特率
Output: 无
Return: 无
*******************************************************************************/
void BSP_UART_Init(USART_TypeDef *instance, uint32_t baudRate)
{if (instance == USART1){huart1.Instance = USART1;huart1.Init.BaudRate = baudRate;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&s_uart1) != HAL_OK){Error_Handler();}}else if (instance == USART2){huart2.Instance = USART2;huart2.Init.BaudRate = baudRate;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&s_uart2) != HAL_OK){Error_Handler();}}else if (instance == USART3){huart3.Instance = USART3;huart3.Init.BaudRate = baudRate;huart3.Init.WordLength = UART_WORDLENGTH_8B;huart3.Init.StopBits = UART_STOPBITS_1;huart3.Init.Parity = UART_PARITY_NONE;huart3.Init.Mode = UART_MODE_TX_RX;huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart3.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&s_uart3) != HAL_OK){Error_Handler();}}
}
1.1 外设句柄 xxx_HandleTypeDef
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
第一行表示:名为huart1的、类型为UART_HandleTypeDef型的一个结构体
第二行表示:名为huart2的、类型为UART_HandleTypeDef型的一个结构体
1.2 __UART_HandleTypeDef
stm32f1xx_hal_uart.h文件
代码类型___UART_HandleTypeDef,别名UART_HandleTypeDef。
/*** @brief UART handle Structure definition*/
typedef struct __UART_HandleTypeDef
{USART_TypeDef *Instance; /*!< UART registers base address */UART_InitTypeDef Init; /*!< UART communication parameters */uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */uint16_t TxXferSize; /*!< UART Tx Transfer size */__IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */uint16_t RxXferSize; /*!< UART Rx Transfer size */__IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */HAL_LockTypeDef Lock; /*!< Locking object */__IO HAL_UART_StateTypeDef gState; /*!< UART state information related to global Handle managementand also related to Tx operations.This parameter can be a value of @ref HAL_UART_StateTypeDef */__IO HAL_UART_StateTypeDef RxState; /*!< UART state information related to Rx operations.This parameter can be a value of @ref HAL_UART_StateTypeDef */__IO uint32_t ErrorCode; /*!< UART Error code
huart1.Instance = USART1;这行代码,首先第一点huart1.Instance表示的是结构体huart1中的成员变量Instance。
1.3 Instance成员=USART1
#define USART1 ((USART_TypeDef *)USART1_BASE)
USART1是一个宏。
这个宏是将USART1_BASE(常量)强制转换为USART_TypeDef型结构体指针。
常量强制转化为一个结构体指针,该常量为结构体的起始地址。
USART1_BASE被强制转换为USART_TypeDef的起始地址,内存空间将以USART_TypeDef类型进行构建,首址为USART1_BASE,空间内有成员,按其固有类型顺序依次分配内存空间。
根据HAL库的注释,可以知道Instance指向的也是uart寄存器组的基地址。