UART异步通信配置步骤/HAL

发布时间 2023-08-07 21:23:29作者: Yannnnnnn
1 串口工作参数 MX_USART2_UART_Init
2 底层初始化 HAL_UART_MspInit
3 开启串口异步接收中断 HAL_UART_Receive_IT
4 设置优先级,使能中断 HAL_NVIC_SetPriority  /  HAL_NVIC_SetPriority
5 编写中断服务函数 USART2_IRQHandler / HAL_UART_IRQHandler / HAL_UART_RxCpltCallback
6 串口数据发送 HAL_UART_Transmit

/* USART2 init function 初始化huart2*/

void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;                         //huart2关联实物USART2
  huart2.Init.BaudRate = 115200;                    //波特率115200
  huart2.Init.WordLength = UART_WORDLENGTH_8B;      //字长8位
  huart2.Init.StopBits = UART_STOPBITS_1;           //停止位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;  //16倍过采样
  /*使用 HAL_UART_Init 配置 huart2 */
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
    /*以中断方式接收指定字节的数据到缓冲区usart2Buffer*/
    HAL_UART_Receive_IT(&huart2,usart2Buffer,1);//打开接收中断
}

/*UART的MSP级初始化*/

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};               //GPIO_InitTypeDef结构体GPIO_InitStruct
  if(uartHandle->Instance==USART2)                      //判断参数uartHandle为huart2
  {
  /* USER CODE BEGIN USART2_MspInit 0 */

  /* USER CODE END USART2_MspInit 0 */
    /* USART2 clock enable */
    __HAL_RCC_USART2_CLK_ENABLE();                      //USART2时钟使能
  
    __HAL_RCC_GPIOA_CLK_ENABLE();                       //GPIOA时钟使能
    /**USART2 GPIO Configuration    
    PA2     ------> USART2_TX  //PA2发送
    PA3     ------> USART2_RX  //PA3接收
    */
    GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin;    //选择PA2,PA3
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;             //模式:复用推挽
    GPIO_InitStruct.Pull = GPIO_PULLUP;                 //上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;  //速度选择
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;        //?
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);             //用GPIO_InitStruct初始化GPIOA

    /* USART2 interrupt Init */
    HAL_NVIC_SetPriority(USART2_IRQn, 2, 0);            //设置USART2优先级2级抢断,0级响应
    HAL_NVIC_EnableIRQ(USART2_IRQn);                    //优先级使能
  /* USER CODE BEGIN USART2_MspInit 1 */

  /* USER CODE END USART2_MspInit 1 */
  }
}

printf重定向

 //重定向c库函数printf到串口USART2,重定向后可使用printf函数,为使用printf、scanf函数需要在文件中包含stdio.h头文件
 int fputc(int ch, FILE *f)
 {

     /* 发送一个字节数据到串口USARTx */

     HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

     return (ch);

 }

 //重定向c库函数scanf到串口USART2,重写向后可使用scanf、getchar等函数
 int fgetc(FILE *f)
 {

     int ch;

     /* 等待串口输入数据 */

     while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) == RESET);

     HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

     return (ch);

 }

接收完成回调函数,接收一个字符后发送

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   
    HAL_UART_Transmit(&huart2,usart2Buffer,1,1000);//发出受到的数据
    
    HAL_UART_Receive_IT(&huart2,usart2Buffer,1);//重新打开接收中断
    
}