利用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<stdio.h>,在 while(1)里增加2行代码。​​​​​

    cpp 复制代码
    /* USER CODE BEGIN Header */
    #include<stdio.h>
    /**
      ******************************************************************************
      * @file           : main.c
      * @brief          : Main program body
      ******************************************************************************
      * @attention
      *
      * Copyright (c) 2024 STMicroelectronics.
      * All rights reserved.
      *
      * This software is licensed under terms that can be found in the LICENSE file
      * in the root directory of this software component.
      * If no LICENSE file comes with this software, it is provided AS-IS.
      *
      ******************************************************************************
      */
    /* USER CODE END Header */
    cpp 复制代码
    //HAL_UART_Transmit(&huart1, (uint8_t*)"Hello World!\r\n", 16, 10);// 使用HAL_UART_Transmit函数直接发送"Hello World!\r\n"字符串到USART1
    // 重定向后的printf函数发送"Hello World!\r\n"字符串到USART,
    //printf函数内部会调用自定义的重定向函数(例如fputc),该函数会使用HAL_UART_Transmit发送数据	
    
    printf("Hello World!\r\n");
    HAL_Delay(1000);
  2. usart.c增加代码 :usart.c的第1行添加头文件#include<stdio.h>,在末尾用户代码区增加如下代码。printf调用"fputc()",该函数会使用HAL_UART_Transmit发送数据。

    cpp 复制代码
    /* USER CODE BEGIN 1 */
    struct __FILE
    {
        int a;
    };
    FILE __stdout;
    /*****************************************************
    *function: 写字符文件函数
    *param1: 输出的字符
    *param2: 文件指针
    *return: 输出字符的 ASCII 码
    ******************************************************/
    int fputc(int ch, FILE *f)
    {
    	HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
    	return ch;
    }
    /* 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!",按一下复位键,检查连接和电源是否正确,注意根据你所用的硬件来接线,不要接错线了。

相关推荐
cjy_Somnr1 小时前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰2 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤4 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟6 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞6 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲7 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up7 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
纳祥科技16 小时前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
单片机日志17 小时前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
松涛和鸣18 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法