一.概要
大家一开始学习 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
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
六.小结
STM32的printf函数它可以将变量的值输出到终端或串口,方便开发者观察程序运行时的各种参数。
在嵌入式开发中,调试是一个重要的环节,而printf函数作为一种常用的调试手段,其使用可以帮助开发者了解程序的运行状态和参数变化。通过printf函数,开发者可以将关键变量的值输出到串口等显示设备上,从而直观地查看程序运行时的数据,这对于排查问题和优化程序非常有帮助