利用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,一经查实,立即删除!

相关文章

记一次etcd数据恢复

使用官方示例 etcd:image: bitnami/etcd:3.4.15restart: alwaysvolumes:- ./etcd_data:/bitnami/etcdenvironment:ALLOW_NONE_AUTHENTICATION: "yes"ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379"ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379…

史记-张良-留侯世家-8-上欲废太子;张良出谋划策;政治智慧

原文&#xff1a; 上欲废太子&#xff0c;立戚夫人子赵王如意。大臣多谏争&#xff0c;未能得坚决者也。吕后恐&#xff0c;不知所为。人或谓吕后曰&#xff1a;“留侯善画计策&#xff0c;上信用之。”吕后乃使建成侯吕泽劫留侯&#xff0c;曰&#xff1a;“君常为上谋臣&…

24届数字IC验证——SV+UVM基础知识汇总(九)

文章目录 前言57、module和program区别58、仿真调度区域59、fork-join、fork-join_none和fork-join_any的区别(经常问)60、D触发器输入高阻,输出是什么61、recovery time和removal time62、设置仿真退出时间62、$ time和$ realtime区别63、选择验证的原因(常问)64、验证工…

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

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

Python网络爬虫项目开发实战:如何解决验证码处理

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python网络爬虫项目开发实战_验证码处理_编程案例解析实例详解课程教程.pdf 一、验证码处理的简介 在Python网络爬虫项目开发实战中,验证码处理是…

SpringBoot中的扩展点

ApplicationContextInitializer的initialize方法。 时机 : 所有的配置文件都已经加载&#xff0c;spring容器还没被刷新之前 准备阶段 this.prepareContext(context, environment, listeners, applicationArguments, printedBanner); 它允许开发人员在Spring应用上下文&…

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…

分享一些常用的小程序免费源码

小程序支付源码 小程序注册、登录源码 自定义图片上传组件源码 java实现小程序和网页在线聊天、即时通讯 微信小程序自定义底部tabBar实例 生成微信小程序二维码 图片上传源码 下载地址&#xff1a; 看源社区 www.see-source.com

cross-env 与 vue-cli-service 的区别

cross-env 与 vue-cli-service 的区别 一、cross-env用法多环境基本内容配置 &#xff08;非必要&#xff0c;全局变量的一种方式&#xff09; 二、vue-cli-service&#xff1a;用法 一、cross-env 它是为了解决跨平台环境变量设置的问题而开发的。 cross-env是一个用于设置跨…

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

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

luckysheet的使用——15.复制有合并单元格的某一行的格式到一个指定空白行

在插入空白行的时候&#xff0c;如果是在画好的表格下插入&#xff0c;api提供的插入空白行会插入没有任何格式的一行&#xff0c;无法匹配合并了单元格的表格格式&#xff0c;需要手动编写api 1.找到api.js&#xff0c;在src/global中,新增一个方法 /*** 复制有合并单元格的…

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;使得界面开发变得…

Leetcode 3123. Find Edges in Shortest Paths

Leetcode 3123. Find Edges in Shortest Paths 1. 解题思路2. 代码实现 题目链接&#xff1a;3123. Find Edges in Shortest Paths 1. 解题思路 这一题思路上的话就是一个最短路径的求解问题&#xff0c;我们使用一个堆排即可对其进行实现。 不过&#xff0c;做题的时候挺犹…