STM32CubeMX | STM32 串口通信以及串口重定向

一、串口配置

  1. 管脚以及参数配置
    羽墨志 | STM32 串口配置
  2. 使能串口中断
    羽墨志 | STM32 使能串口中断
    配置完成并保存后,点击【GENERATE CODE】重新生成代码。

二、串口发送

串口发送调用HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)函数即可。

  1. 定义一个存放串口数据发送的缓冲区:

    /* USER CODE BEGIN 0 */
    uint8_t tx_buff[]="Welcome to 羽墨志\n";
    /* USER CODE END 0 */
    

    【注】自定义添加的代码请放置于/* xx CODE BEGIN xx *//* xx CODE END xx */之间,以免在STM32CubeMX重新生成代码时被覆盖掉。

  2. 串口数据发送
    在while循环中添加如下代码:

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  HAL_UART_Transmit(&huart1,(uint8_t *)tx_buff,sizeof(tx_buff)-1,0xffff);
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */

编译下载后,可以看到每隔一秒钟收到一次数据: 羽墨志 | STM32 串口数据发送

三、串口接收

  1. 定义串口数据接收缓冲区

    /* USER CODE BEGIN 0 /
    uint8_t tx_buff[]="Welcome to 羽墨志\n"; // 串口数据发送缓冲区
    uint8_t rx_buffer;  // 串口数据接收缓冲区
    / USER CODE END 0 */
    
  2. 使能串口中断
    main()的初始化部分添加串口中断使能函数:

     /* USER CODE BEGIN 2 */
      HAL_UART_Receive_IT(&huart1,(uint8_t *)&rx_buffer,1); //使能接收中断
      /* USER CODE END 2 */
    
  3. 重写串口中断服务函数

    /**
      * @brief Rewrite callback function for USART1
      * @retval None
      */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	UNUSED(huart);
    	
        if(huart->Instance == USART1)//判断串口号
        {
            HAL_UART_Transmit(&huart1,(uint8_t *)&rx_buffer,1,100); // 将接收到的数据再通过串口发送出去
            HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_buffer, 1);   //重新使能接收中断
        }
    }
    

    每次串口接收数据时会自动关闭串口中断,因此在中断回调函数中需要再次使能串口接收中断,一边等待下一次数据接收中断。
    羽墨志 | STM32 串口中断接收

四、串口重定向

  1. 添加标准库头文件
    usart.h文件中添加标准库头文件stdio.h:

    /* USER CODE BEGIN Includes */
    #include <stdio.h>
    /* USER CODE END Includes */
    
  2. 添加重定义函数
    usart.h文件中添加相关的重定向函数:

    /* USER CODE BEGIN 1 */
    
    int fputc(int ch, FILE *fp)
    {
      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
      return ch;
    }
     
    int fgetc(FILE *fp)
    {
      uint8_t ch = 0;
      HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
      return ch;
    }
    
    /* USER CODE END 1 */
    
  3. 添加函数声明
    usart.h文件中添加相关的函数声明:

    /* USER CODE BEGIN Prototypes */
    int fputc(int ch, FILE *fp);
    int fgetc(FILE *fp);
    /* USER CODE END Prototypes */
    
  4. 测试
    main函数的while(1)循环中添加如下代码:

     /* Infinite loop */
     /* USER CODE BEGIN WHILE */
     while (1)
     {
       /* USER CODE END WHILE */
    
       /* USER CODE BEGIN 3 */
      printf("Hi,yomo!\n");
      HAL_Delay(1000);
     }
     /* USER CODE END 3 */
    

    编译下载后就可以在串口看到一秒打印一次的串口数据了。羽墨志 | STM32 串口重定向

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽墨志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值