问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32单片机Printf函数打印详解及源码

创作时间:
作者:
@小白创作中心

STM32单片机Printf函数打印详解及源码

引用
CSDN
1.
https://blog.csdn.net/zy2232652/article/details/141220621

本文将详细介绍如何在STM32单片机中使用Printf函数进行串口打印。从基础概念到实际应用,包括CubeMX配置和代码示例,适合零基础的学习者。

一.概要

大家一开始学习 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函数提供输出设备,‌所以需要通过编程来实现输出重定向。‌在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, FILEf)

{

/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函数,‌开发者可以将关键变量的值输出到串口等显示设备上,‌从而直观地查看程序运行时的数据,‌这对于排查问题和优化程序非常有帮助

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号