• 利用STM32 HAL库实现USART串口通信,并通过printf重定向输出“Hello World“


      一、开发环境

    硬件:正点原子探索者 V3 STM32F407 开发板

    单片机:STM32F407ZGT6

    Keil版本:5.32

    STM32CubeMX版本:6.9.2

    STM32Cube MCU Packges版本:STM32F4 V1.27.1

    上一篇使用STM32F407的HAL库只需1行代码实现USART1串口打印“Hello World!”,而平时都是用printf打印的,现在每次都要调用HAL_UART_Transmit()函数,比较麻烦,怎么解决呢?采用fputc调用HAL_UART_Transmit实现printf重定向的,它有三个好处。

    HAL_UART_Transmit实现printf重定向的三个主要好处包括:

    1. 提高代码效率和可读性
      重定向printfHAL_UART_Transmit允许开发者使用熟悉的printf函数格式来发送数据到USART,而无需每次调用底层UART传输函数。这不仅减少了代码量,还提高了代码的可读性和可维护性。开发者可以专注于业务逻辑的实现,而无需过多关注底层通信细节。

    2. 简化调试过程
      在嵌入式系统开发中,调试是一个必不可少的环节。通过重定向printf,开发者可以直接将调试信息通过USART发送到PC端的串口监视工具中,实时查看程序的运行状态和变量值。这极大地简化了调试过程,提高了开发效率。

    3. 增强灵活性和扩展性
      虽然HAL_UART_Transmit提供了基本的UART通信功能,但使用printf重定向可以进一步扩展其用途。printf函数支持丰富的格式化输出选项,可以方便地输出各种数据类型,并以特定的格式呈现。此外,开发者还可以结合其他库函数或自定义函数,实现更复杂的串口通信需求,如发送自定义协议包或解析接收到的数据。

    综上所述,对HAL_UART_Transmit实现printf重定向可以带来代码效率和可读性的提升、调试过程的简化以及灵活性和扩展性的增强等好处。

     下面我将详细解释利用STM32 HAL库实现USART1串口通信,并通过printf重定向输出"Hello World"的STM32CubeMX配置步骤和程序。

     二、配置STM32CubeMX

    1. 启动STM32CubeMX,新建STM32CubeMX项目
    2. 选择MCU:在软件中选择你的STM32型号-STM32F407ZGT6。
    3. 选择时钟源:

    4. 配置时钟:
    5. 使能Debug功能:Serial Wire
    6. HAL库时基选择:SysTick
    7. USART1配置:选择异步模式。    
    8. 配置工程参数:在Project标签页中,配置项目名称和位置,选择工具链MDK-ARM。​ 9.生成代码:在Code Generator标签页中,配置工程外设文件与HAL库,勾选头文件.c和.h文件分开,然后点击Project > Generate Code生成代码。 

    三、代码实现与部署

    1.  main.c增加代码:main.c的第1行添加printf的头文件#include,在 while(1)里增加2行代码。​​​​​  ​

      1. /* USER CODE BEGIN Header */
      2. #include
      3. /**
      4. ******************************************************************************
      5. * @file : main.c
      6. * @brief : Main program body
      7. ******************************************************************************
      8. * @attention
      9. *
      10. * Copyright (c) 2024 STMicroelectronics.
      11. * All rights reserved.
      12. *
      13. * This software is licensed under terms that can be found in the LICENSE file
      14. * in the root directory of this software component.
      15. * If no LICENSE file comes with this software, it is provided AS-IS.
      16. *
      17. ******************************************************************************
      18. */
      19. /* USER CODE END Header */
      1. //HAL_UART_Transmit(&huart1, (uint8_t*)"Hello World!\r\n", 16, 10);// 使用HAL_UART_Transmit函数直接发送"Hello World!\r\n"字符串到USART1
      2. // 重定向后的printf函数发送"Hello World!\r\n"字符串到USART,
      3. //printf函数内部会调用自定义的重定向函数(例如fputc),该函数会使用HAL_UART_Transmit发送数据
      4. printf("Hello World!\r\n");
      5. HAL_Delay(1000);
    2.  usart.c增加代码:usart.c的第1行添加头文件#include,在末尾用户代码区增加如下代码。printf调用“fputc()”,该函数会使用HAL_UART_Transmit发送数据。
      1. /* USER CODE BEGIN 1 */
      2. struct __FILE
      3. {
      4. int a;
      5. };
      6. FILE __stdout;
      7. /*****************************************************
      8. *function: 写字符文件函数
      9. *param1: 输出的字符
      10. *param2: 文件指针
      11. *return: 输出字符的 ASCII 码
      12. ******************************************************/
      13. int fputc(int ch, FILE *f)
      14. {
      15. HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
      16. return ch;
      17. }
      18. /* USER CODE END 1 */
    3. 连接USART1:用USB转TTL工具连接当前硬件USART1的PA9、PA10,GND。
    4. 打开串口助手:
    5. 编译代码:Keil编译生成的代码。
    6. 烧录程序:将编译好的程序用ST-LINK烧录到STM32微控制器中。

    四、运行结果

    观察结果:一旦程序烧录完成并运行,串口助手每隔一秒打印“Hello World!”。如果一切正常,恭喜你,你现在已经会“Hello World!”了!​​

    ​五、注意事项

    1.确保你的开发环境和工具链已经正确安装和配置。

    2.如果没有打印“Hello World!”,按一下复位键,检查连接和电源是否正确,注意根据你所用的硬件来接线,不要接错线了。

  • 相关阅读:
    hive udf编写及JDBC连接测试
    Python正则表达式一文详解+实例代码展示
    Python分享之多进程初步 (multiprocessing包)
    windows11 利用vmware17 安装rocky9操作系统
    RabbitMQ (4)
    SSM学生信息管理系统(含源码+论文+答辩PPT等)
    (二)基于kubernetes(1.25.2) 进行基础prometheus监控
    显卡T600和RTX3050哪个好
    秀动脚本增加微信通知和多账号抢购
    MySQL主从复制
  • 原文地址:https://blog.csdn.net/m0_37371085/article/details/138036663