【STM32】STM32F4中USART的使用方法和Printf的重定义(基于CubeMX和Keil)

文章目录

  • 一、前言
  • 二、STM32CubeMX生成代码
    • 2.1 选择芯片
    • 2.2 配置相关模式
    • 2.3 生成代码
  • 三、Keil重定义Printf
    • 3.1 勾选“UseMicroLIB”
    • 3.2 添加头文件和修改fputc和fgetc
  • 四、测试Printf的效果
    • 4.1 字符串测试
    • 4.2 格式化输出测试
  • 五、存在问题的解决方法
    • 5.1 检查串口号是否一致
    • 5.2 打开MicroLIB
    • 5.3 换一个串口调试助手
    • 5.4 复位一下
    • 5.5 对比博主的代码

一、前言

主要目的:利用串口来收发一些数据
使用芯片:STM32F407ZGT6
使用函数:HAL库
使用工具:STM32CubeMX + Keil uVision5
串口工具:XCOM V2.6

二、STM32CubeMX生成代码

2.1 选择芯片

在这里插入图片描述

2.2 配置相关模式

主要配置内容:

  • 调试模式为Serial
  • 设置USART1为异步模式
    在这里插入图片描述
    在这里插入图片描述

2.3 生成代码

自己给工程命名然后选择打开的编译器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、Keil重定义Printf

3.1 勾选“UseMicroLIB”

在魔术棒中打勾“UseMicroLIB”,否则即使我们include了stdio.h且编译器没没有报错的情况下仍然用不了printf。
在这里插入图片描述

3.2 添加头文件和修改fputc和fgetc

usart.c函数里面添加头文件,如下:

/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */

在这里插入图片描述
在这里插入图片描述

usart.c里面添加下面的代码。

/* USER CODE BEGIN 1 */
/*** 函数功能: 重定向c库函数printf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说    明:无*/
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;
}/*** 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说    明:无*/
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch;
}
/* USER CODE END 1 */

在这里插入图片描述

四、测试Printf的效果

4.1 字符串测试

main.c函数的while1添加下面的代码进行测试:

    printf("终于可以使用printf函数了!!!\n");HAL_Delay(1000);

在这里插入图片描述
在这里插入图片描述

4.2 格式化输出测试

main.c函数的while1添加下面的代码进行测试:

  /* USER CODE BEGIN 2 */float f_num[] = {0.1,0.2,0.3};uint8_t i_num[3] = {1,2,3};/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){printf("终于可以使用printf函数了!!!\n");HAL_Delay(500);printf("试一下格式化输出 ==> 浮点数:%.3f,\t整数:%d\n", f_num[0], i_num[0]);HAL_Delay(500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

在这里插入图片描述

五、存在问题的解决方法

5.1 检查串口号是否一致

2.2 配置相关模式中使用的是USART1,因此3.2 添加头文件和修改fputc和fgetc中的这两个函数也是用USART1,如果有问题,看看是否有对应上。
如果你使用的是USART2,那你就把这两个函数里面对应的修改一下,举例一下,就是将下面的huart1改为huart2.

int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);//修改这里的数字return ch;
}

5.2 打开MicroLIB

就是3.1 勾选“UseMicroLIB”的这一步,这个也是我解决一直没法使用printf的方法。

5.3 换一个串口调试助手

有可能是串口调试助手显示的问题,换一个试试看。

5.4 复位一下

有时候会忘记复位,程序可能还没启动。

5.5 对比博主的代码

上面的解决方法还是不行,你就对比我的上传的代码吧。
https://download.csdn.net/download/weixin_52296952/88804366

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

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

相关文章

后端八股笔记------Redis

Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f447; 写锁&#x1f4…

[短文]不同空白字符导致程序执行失败问题

屏幕显示的一个空白字符&#xff0c;对于编程者来说&#xff0c;并无差异&#xff0c;但底层截然不同的表示方法&#xff0c;极大可能导致程序执行失败&#xff01; 今天博主就遇到一个空格字符的问题&#xff0c;大概情况是前端编写SQL传入&#xff0c;后端有时可以执行&…

Deep Learning for Detecting Robotic Grasps

链接&#xff1a;1301.3592.pdf (arxiv.org) 这个用于从单一RGB-D视图进行机器人抓取检测的算法包括以下步骤&#xff1a; 图像获取&#xff1a; 机器人获取包含待抓取对象的场景的RGB-D图像。 抓取评分&#xff1a; 使用小型深度网络对RGB-D图像中的潜在抓取进行评分。抓取以在…

C++进阶之路---多态(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、多态的概念 1.概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为…

qt-C++笔记之使用Cmake来组织和构建QWidget工程项目

qt-C笔记之使用Cmake来组织和构建QWidget工程项目 —— 杭州 2024-03-10 code review! 文章目录 qt-C笔记之使用Cmake来组织和构建QWidget工程项目1.运行2.文件结构3.CMakeLists.txt4.main.cpp5.widget.h6.widget.cpp7.widget.ui 1.运行 2.文件结构 3.CMakeLists.txt 代码 c…

Langchain-Chatchat本地搭建ChatGLM3模型和提取PDF内容

文章目录 1、软件要求2、安装CUDA2.1、安装gcc2.2、安装CUDA 3、安装Anaconda33.1、下载Anaconda33.2、创建python虚拟环境 4、部署系统4.1、下载源码4.2、安装依赖4.3、下载模型4.4、初始化配置和知识库4.4.1、初始化配置4.4.2、初始化知识库 4.5、运行4.6、运行4.6.1、启动4.…

官宣正式成为 PostgreSQL Contributor,Richard 有何秘诀?

作为世界上最受欢迎的开源数据库之一&#xff0c;PostgreSQL 国际社区于3月3日正式公布了新加入的 PostgreSQL Contributor 名单&#xff0c;以认可为 PostgreSQL 开源项目做出实质性、长期贡献的人员。本次公布的名单中包括 3 名 Contributor 和 6 名 Major Contributor。 拓…

如何保证消息的顺序性

先看看顺序会错乱的场景&#xff1a;RabbitMQ&#xff1a;一个 queue&#xff0c;多个 consumer&#xff0c;这不明显乱了&#xff1a; 解决方案&#xff1a;

Arm MMU深度解读

文章目录 一、MMU概念介绍二、虚拟地址空间和物理地址空间2.1、(虚拟/物理)地址空间的范围2.2、物理地址空间有效位(范围) 三、Translation regimes四、地址翻译/几级页表&#xff1f;4.1、思考&#xff1a;页表到底有几级&#xff1f;4.2、以4KB granule为例&#xff0c;页表的…

Dgraph 入门教程四《开发环境的搭建》

在深入 了解Dgraph 之前&#xff0c;我们先了解下开发环境&#xff0c;毕竟让开发人员真正动起手来才是第一步。 Dgraph 支持很多种语言的开发&#xff0c;包括GO&#xff0c;Python&#xff0c;JS&#xff0c;C#和Java等等。出于项目需要&#xff0c;只了解下JS和Java。 1、…

超标量与多发射和超长指令字设计

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第11篇,在这里分享给大家,这篇文章讲超标量与多发射和超长指令字设计&#xff0c;前面文章提到的书籍的pdf大家没有的话可以私信找我要&#xff01; 《计算机组成与设计&#xff1a;硬件 / 软件接口》中4.10…

01 数据结构引入 和 顺序表

阅读引言&#xff1a; 从本文开始给大家带来我在复习过程中写的数据结构的代码&#xff0c; 分享给需要的同学 一、数据结构引入 1.数据结构解决什么问题 数据结构可以将杂乱无章的数据管理起来&#xff0c; 提高数据的访问效率 计算机处理的对象&#xff08;数据&#xff09…