1.串口初始化
void uart_init(u32 bound)
{
//UART 初始化设置
UART1_Handler.Instance=USART1; //USART1
UART1_Handler.Init.BaudRate=bound; //波特率
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1
__HAL_UART_DISABLE_IT(&UART1_Handler,UART_IT_TC);
__HAL_UART_ENABLE_IT(&UART1_Handler,UART_IT_RXNE);
USART1->CR3 |= 0X1000;//关闭上溢出检测
}
2.判断串口号
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART2)//如果是串口2,进行串口2 MSP初始化
{
__HAL_RCC_USART2_CLK_ENABLE(); //使能USART2时钟
GPIO_Initure.Pin=GPIO_PIN_2; //PA2
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
GPIO_Initure.Alternate=GPIO_AF7_USART2; //复用为USART2
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_3; //PA3
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
HAL_NVIC_EnableIRQ(USART2_IRQn); //使能USART1中断通道
HAL_NVIC_SetPriority(USART2_IRQn,3,4); //抢占优先级3,子优先级4
}
}
3.识别帧头帧尾方式接受数据
void USART2_IRQHandler(void)
{
u8 a;
USART2->RQR |= 0x08;
USART2->ICR |= 0x08;
dataBuffer[g_cU2Number] = USART2->RDR;//读取接收到的数据
if(dataBuffer[0]==0xFE)
{
g_cU2Number++;
if( g_cU2Number==10&&dataBuffer[9]==0xAA)
{
g_cU2Number=0;
for(a=0;a<10;a++)
{
g_cU2Data[a]=dataBuffer[a];
}
g_cU2flag = 1;//串口接收到了一帧数据
}
}
else
g_cU2Number=0;
USART2->ICR |= 0X08;//清除上溢出标志位
}