利用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行代码。​​​​​  ​

    /* 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 */
    //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发送数据。
    /* 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!”,按一下复位键,检查连接和电源是否正确,注意根据你所用的硬件来接线,不要接错线了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云仓酒庄广西发布会盛启:新老经销商欢聚南宁

原标题&#xff1a;云仓酒庄广西发布会盛启&#xff1a;新老经销商欢聚南宁&#xff0c;共襄精酿啤酒盛宴在夏日的热情与激情中&#xff0c;云仓广西发布会于今日在美丽的南宁盛大开幕。来自各地的经销商们齐聚一堂&#xff0c;共同见证了这一盛况。此次发布会不仅是一次产品的…

2024年汉字小达人活动还有5个月开赛:来做18道历年选择题备考吧

现在距离2024年第11届汉字小达人比赛还有五个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。阅读理解不需要。②把历年真题刷刷熟&#x…

数电期末复习(一)数制和码制

数制和码制 1.1 概述1.2 几种常用的数制1.2.1 十进制&#xff08;Decimal&#xff09;1.2.2 二进制&#xff08;Binary&#xff09;1.2.3 二-十进制之间的转换1.2.4 十六进制和八进制1.2.5 任意进制之间的转换 1.3 二进制代码1.3.1 二-十进制码(BCD Binary Coded Decimal)1.3.2…

2023年网络安全行业:机遇与挑战并存

2023年全球网络安全人才概况 根据ISC2的《2023年全球网络安全人才调查报告》&#xff0c;全球的网络安全专业人才数量达到了550万&#xff0c;同比增长了8.7%。然而&#xff0c;这一年也见证了网络安全人才短缺达到了历史新高&#xff0c;缺口数量接近400万。尤其是亚太地区&am…

ARM_day6:实现字符串数据收发函数的封装

程序代码&#xff1a; uart4.h&#xff1a; #ifndef __UART4_H__ #define __UART4_H__ #include"stm32mp1xx_gpio.h" #include"stm32mp1xx_rcc.h" #include"stm32mp1xx_uart.h" void uart4_config(); void putchar(char dat); char getchar();…

【电机参数】直流无刷电机机械转速、ud、uq、us、输出功率、相反电动势幅值、载波周期、转矩常数

【电机参数】直流无刷电机机械转速、ud、uq、us、输出功率、相反电动势幅值、载波周期、转矩常数 前言 【电机控制】直流有刷电机、无刷电机汇总——持续更新 使用工具&#xff1a; 1.示波器&#xff1a;PICO2205A 2.电桥LCR&#xff1a;VICIOR4090A 3.电流钳&#xff1a;汉泰…

接口测试相关

接口测试&#xff0c;接口 接口是数据交互的入口和出口 接口是一套规范和标准 统一设计标准 前后端相对独立 扩展型灵活 接口文档。 接口测试 接口测试环境&#xff0c;运行程序&#xff0c;自己搭建环境 接口测试插件 谷歌postman 火狐 restclient java测试工具为j…

Linux系统的磁盘管理与文件系统

目录 一、磁盘结构 1.物理结构 2.数据结构 二、MBR与磁盘分区表示 1.MBR 2.磁盘分区表示 分区的优点 分区的缺点 三、文件系统类型 1.文件系统的组成 XFS SWAP EXT4 2.磁盘管理工具 四、Linux系统添加新硬盘的步骤 一、磁盘结构 1.物理结构 所有存储的设备都在…

【面试经典 150 | 数组】最后一个单词的长度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;遍历 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Android 性能优化之黑科技开道(二)

3. 其它可以黑科技优化的方向 3.1 核心线程绑定大核 3.1.1 定义 核心线程绑定大核的思路也很容易理解&#xff0c;现在的 CPU 都是多核的&#xff0c;大核的频率比小核要高不少&#xff0c;如果我们的核心线程固定运行在大核上&#xff0c;那么应用性能自然会有所提升。 核…

【Qt】Qt界面构建与对象管理:从 “Hello World“ 到内存释放

文章目录 1. 通过图形化界面创建控件2. 通过纯代码方式创建控件3. 对象树管理与内存管理小结&#xff1a; 在软件开发中&#xff0c;构建用户界面是至关重要的一步。Qt作为一个跨平台的C框架&#xff0c;提供了强大的界面构建工具和对象树管理机制&#xff0c;使得界面开发变得…

单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒

需求背景 从第三方采购的vue2 ElementUI实现的云管平台&#xff0c;乙方说2011年左右就开始有这个项目了&#xff08;那时候有Vue了吗&#xff0c;思考.jpg&#xff09;。十几年的项目&#xff0c;我何德何能可以担此责任。里面的代码经过多人多年迭代可以用惨不忍睹来形容&a…

Qt做关于界面

在上位机系统中&#xff0c;经常需要显示当前软件版本&#xff0c;当前fpga版本&#xff0c;那么咱就做一个help的菜单的关于界面 解决的问题&#xff1a; 解决显示版本信息的UI Axure界面图&#xff1a; 如何实现&#xff1a; 实现文件的存储&#xff1a;QSetting来存储版…

玩转Virtual Box虚拟机

玩转Virtual Box虚拟机 虚拟化技术和虚拟机简介 什么是虚拟化技术&#xff1f; 虚拟化技术是将计算机的各种硬件资源予以抽象、转换、分割、组合的一种计算机技术。虚拟化技术打破了实体结构间不可切割的障碍&#xff0c;从而使用户可以按照需求重新组合硬件资源&#xff0c…

NX二次开发UF_MTX(矩阵运算)常用函数

目录 一、概述 二、函数的介绍 2.1 UF_MTX3_copy&#xff08;复制原来矩阵&#xff09; 2.2 UF_MTX3_determinant&#xff08;计算矩阵的行列式&#xff09; 2.3 UF_MTX3_identity&#xff08;单位矩阵&#xff09; 2.4 UF_MTX3_initialize&#xff08;可以根据X、Y方向向…

R: 阿尔法α多样性计算和箱图制作,以及差异分析

# install.packages("vegan") library(vegan) library(ggplot2) library(ggpubr)setwd("xxx") # 使用read.table()函数读取数据 df <- read.table("xxx", header TRUE, row.names 1)# 转置数据框 df <- t(df)# 计算每个样品的香农多样性…

【Linux】虚拟机与Xshell及VS Code的连接

一、基础环境 虚拟机&#xff1a;VMware Workstation Pro 虚拟机镜像&#xff1a;ubuntu-18.04.5-desktop-amd64.iso 其他&#xff1a;Xshell 6、Xftp 6、Visual Studio Code 上述软件的安装操作不再赘述&#xff0c;CSDN上有大量的优秀博文&#xff0c;可参考&#xff1a;详细…

SpringBoot---------Lombook

Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具&#xff0c;通过使用对应的注解&#xff0c;可以在编译源码的时候生成对应的方法&#xff0c;也就是简化咱们之前pojo&#xff0c;实体类里面臃肿的get/set有参无参。 首先查看一…

学习51单片机 C语言知识

一、数据类型 C 语言包含的数据类型如下图所示 C51 的数据类型分为基本数据类型和组合数据类型&#xff0c;情况与标准 C 中的数据类型基本相同&#xff0c;但其中 char 型与 short 型相同&#xff0c;float 型与 double 型相同&#xff0c;另外&#xff0c;C51 中还有专门针…

免费一年期ssl证书怎么申请?看这里!(教育版、政务版)

自从去年年底开始&#xff0c;各大公有云陆续下架一年期的免费ssl证书&#xff0c;且申请数量都做了限制调整&#xff0c;那么现在去哪里申请免费一年期的ssl证书呢&#xff1f; 一、短期ssl证书 首先了解一下短期免费证书的平台&#xff0c;一般免费证书都为90天有效期&…