利用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. 提高代码效率和可读性 :

    重定向printf到HAL_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!",按一下复位键,检查连接和电源是否正确,注意根据你所用的硬件来接线,不要接错线了。

相关推荐
新晨单片机设计3 分钟前
S033A-基于STM32单片机拼图游戏机【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件·拼图游戏机
Silicore_Emma14 分钟前
D2596HV:高压异步DC-DC降压芯片简介
嵌入式硬件·消费电子·dc-dc系列电路·电源管理电路·降压(buck)开关稳压器
2501_9226395818 分钟前
率能半导体 SS6811H双通道H桥驱动芯片:38V/1.6A,覆盖舞台灯光、安防相机、办公自动化、游戏机、机器人五大应用场景
单片机·嵌入式硬件·硬件工程
恒锐丰科技林技术员2 小时前
EG2304L 高压半桥驱动芯片:中小功率电力电子方案优选器件
经验分享·嵌入式硬件·硬件工程
comyccccc3 小时前
STM32F407VET6核心板的部分电路绘制学习笔记
笔记·stm32·学习
OIDCAT3 小时前
CH9433技术解析:一颗芯片搞定CAN总线和9线串口
单片机·嵌入式硬件·工控·调试工具·国产芯片
简单电磁炮4 小时前
关于can的调试
c语言·stm32·单片机
2501_922639584 小时前
率能半导体 SS6812T双通道H桥驱动芯片:32V/1.0A,覆盖POS打印机、安防相机、办公自动化、游戏机、机器人五大应用场景
单片机·嵌入式硬件·硬件工程
女神下凡4 小时前
芯参谋(77):裸机(无 OS)存储驱动开发指南
arm开发·单片机·嵌入式硬件·设计规范·1024程序员节
weixin_464078074 小时前
反激原副边之间的Y电容
单片机·嵌入式硬件