零基础STM32单片机编程入门(三十五) Printf打印详解及源码

一.概要

大家一开始学习 C 语言的时候, 都接触过 printf()函数, 使用起来很方面, 我们是否可以在我们的STM32程序使用这个函数来作为串口的输出呢?其实是可以 ,在一些简单的应用场景中,只需要通过串口打印信息,而不需要从外部设备接收数据。例如,当你在调试程序或者输出一些简单的日志信息时,你就可能需要用到printf函数进行串口输出,在这种情况下,只要确保UART的TX端正确配置,printf函数就能够通过TX端发送数据。

二.C语言printf()介绍

printf 是一个标准库函数,定义在头文件stdio.h中。它可以根据用户指定的格式,将指定的内容输出到显示器上。printf函数提供了丰富的格式化选项,可以输出各种类型的数据,包括整数、浮点数、字符、字符串等。‌

函数原型:
int printf ( const char * format, … );

printf函数常用的应用举例

输出字符串:
printf(“Hello, World!\n”);

输出单个字符:
char c = ‘A’;
printf(“%c\n”, c);

输出整数:
int x = 100;
printf(“%d\n”, x);

输出十六进制数:
int x = 100;
printf(“%x\n”, x);

输出浮点数:
float f = 10.50;
printf(“%f\n”, f);

输出不同类型的数据:
int a = 10;
char b = ‘B’;
float c = 3.14;
printf(“a = %d, b = %c, c = %.2f\n”, a, b, c);

三.STM32单片机中使用printf

因为STM32本身并没有直接为printf函数提供输出设备,‌所以需要通过编程来实现输出重定向。‌
将printf格式化好的字符串输出到哪个串口设备,在MDK环境中,‌可以通过勾选使用MicroLib来重定向printf。‌MicroLib是对标准C库进行了高度优化的库,‌通过重定义fputc函数到串口,‌可以实现printf函数的输出重定向。
我们需要将fputc或者__io_putchar函数实现为串口的发送。比如printf我们要用串口1进行发送,就需要把 fputc函数重定向成HAL_UART_Transmit(&huart1, ),这样单片机能识别串口,往对应的串口输出数据。

需要两步实现STM32单片机中使用printf

1.选择MicroLIB
Project -> Options for Target -> Target,勾选"Use MicroLIB"
在这里插入图片描述
2.fput函数重新定义
int fputc(int ch, FILE f)
{
/
Place your implementation of fputc here /
/
e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}

四.CubeMX配置一个USB虚拟串口收发例程

用STLINK下载程序,用 USB 线接板子USB 口,再接电脑,打开电脑上串口调试器,9600 波特率,8 位数据,无校验,发送 HELLOWORLD,板子就会返回 HELLOWORLD。

用4根杜邦线把模块与开发板相连
板子3.3----模块VCC
板子A9-----模块RXD
板子A10----模块TXD
板子G------模块GND
在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述

配置串口1
在这里插入图片描述

配置系统主频
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

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

主要代码

#include "stdio.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* Includes ------------------------------------------------------------------*/
#include "usart.h"

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,72M系统主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();//串口1,9600波特率,8位数据,无校验
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  printf("你好HELLOWORLD\r\n");
      HAL_Delay(500);
  }
  /* USER CODE END 3 */
}



实验效果
下载完程序,用 USB转TTL模块接板子,再接电脑,打开电脑上串口调试器,9600 波特率,8 位数据,无校验,板子会收到你好HELLOWORLD。
在这里插入图片描述

五.CubeMX工程源代码下载

通过百度网盘分享的文件:35.Printf打印实验.rar
链接:https://pan.baidu.com/s/15m1Dznza8JdMMADYAKHDhA
提取码:7p9h

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

CSDN代码

六.小结

STM32的printf函数它可以将变量的值输出到终端或串口,‌方便开发者观察程序运行时的各种参数。‌
在嵌入式开发中,‌调试是一个重要的环节,‌而printf函数作为一种常用的调试手段,‌其使用可以帮助开发者了解程序的运行状态和参数变化。‌通过printf函数,‌开发者可以将关键变量的值输出到串口等显示设备上,‌从而直观地查看程序运行时的数据,‌这对于排查问题和优化程序非常有帮助

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值