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 management
and 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寄存器组的基地址。