串口初始化
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1; //USART1
huart1.Init.BaudRate = 115200; //波特率
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; //过采样设置,8倍或者16倍
if (HAL_UART_Init(&huart1) != HAL_OK) //
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
{
/* Check the UART handle allocation */
if (huart == NULL)
{
return HAL_ERROR;
}
/* Check the parameters */
if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
{
/* The hardware flow control is available only for USART1, USART2 and USART3 */
/* assert_param 的定义
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
表示参数expr为false,则执行后面的assert_failed()函数,__FILE__, __LINE__是标准库函数中的宏定义,表示文件名和行号;
如果参数exp为TRUE,则执行((void)0),什么都不做
*/
assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
/*
如果IS_UART_HWFLOW_INSTANCE(huart->Instance)是true,则什么都不做,
表示IS_UART_HWFLOW_INSTANCE(huart->Instance)为false,则执行后面的assert_failed()函数,
*/
assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
}
else
{
assert_param(IS_UART_INSTANCE(huart->Instance));
}
/*
如果有硬件控制,则检查 HARDWARE_FLOW_CONTROL 和 IS_UART_HWFLOW_INSTANCE
#define IS_UART_HWFLOW_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \
((INSTANCE) == USART2) || \
((INSTANCE) == USART3))
无则检查IS_UART_INSTANCE
#define IS_UART_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \
((INSTANCE) == USART2) || \
((INSTANCE) == USART3) || \
((INSTANCE) == UART4) || \
((INSTANCE) == UART5))
*/
assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); //检查数据位
/*
#define IS_UART_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B) || \
((LENGTH) == UART_WORDLENGTH_9B))
*/
#if defined(USART_CR1_OVER8)
assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
#endif /* USART_CR1_OVER8 */
if (huart->gState == HAL_UART_STATE_RESET)
{
/* Allocate lock resource and initialize it */
huart->Lock = HAL_UNLOCKED;
//如果串口刚被复位,则锁住串口,并初始化
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) //如果使用寄存器回调
UART_InitCallbacksToDefault(huart);
if (huart->MspInitCallback == NULL)
{
huart->MspInitCallback = HAL_UART_MspInit;
}
/* Init the low level hardware */
huart->MspInitCallback(huart);
#else
/* Init the low level hardware : GPIO, CLOCK */ //否则调用 HAL_UART_MspInit,初始化GPIO和时钟
HAL_UART_MspInit(huart);
#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
}
huart->gState = HAL_UART_STATE_BUSY; //把串口状态设置为忙
/* Disable the peripheral */
__HAL_UART_DISABLE(huart); // 停用串口
/* Set the UART Communication parameters */
UART_SetConfig(huart); //真正设置串口寄存器的波特率,停止位等
/* In asynchronous mode, the following bits must be kept cleared:
- LINEN and CLKEN bits in the USART_CR2 register,
- SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
/*
在异步模式下,必须清除以下位::
CR2 寄存器中的 LINEN 和 CLKEN 位
LINEN: LIN模式使能 (LIN mode enable)
该位由软件设置或清除。
0:禁止LIN模式;
1:使能LIN模式。
在LIN模式下,可以用USART_CR1寄存器中的SBK位发送LIN同步断开符(低13位),以及检测LIN同步断开符。
CLKEN:时钟使能 (Clock enable)
该位用来使能CK引脚
0:禁止CK引脚;
1:使能CK引脚。
CR3 寄存器中SCEN, HDSEL 和 IREN 位
SCEN: 智能卡模式使能 (Smartcard mode enable)
该位用来使能智能卡模式
0:禁止智能卡模式;
1:使能智能卡模式。
注: UART4和UART5上不存在这一位
HDSEL:半双工选择 (Half-duplex selection)
选择单线半双工模式
0:不选择半双工模式;
1:选择半双工模式。
IREN:红外模式使能 (IrDA mode enable)
该位由软件设置或清除。
0:不使能红外模式;
1:使能红外模式。
*/
CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));
/* Enable the peripheral */
/* 使能串口*/
__HAL_UART_ENABLE(huart);
/* Initialize the UART state */
/*初始化串口的状态:无错误/全局状态准备好/接收准备好/发送准备好
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->gState = HAL_UART_STATE_READY;
huart-