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

文章目录

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

c 复制代码
/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */


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

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添加下面的代码进行测试:

c 复制代码
    printf("终于可以使用printf函数了!!!\n");
    HAL_Delay(1000);


4.2 格式化输出测试

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

c 复制代码
  /* 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.

c 复制代码
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

相关推荐
模拟IC攻城狮30 分钟前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片
IT B业生37 分钟前
51单片机教程(六)- LED流水灯
单片机·嵌入式硬件·51单片机
一枝小雨42 分钟前
51单片机学习心得2(基于STC89C52):串口通信(UART)
单片机·嵌入式硬件·51单片机
IT B业生2 小时前
51单片机教程(一)- 开发环境搭建
单片机·嵌入式硬件·51单片机
小林熬夜学编程2 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺2 小时前
嵌入式之C语言(基础篇)
c语言·开发语言
躺不平的理查德3 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
u0101526583 小时前
STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器
笔记·stm32·学习
幼儿园园霸柒柒4 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
好想有猫猫4 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节