STM32应用开发教程进阶:UART串口重定向实现printf输出

实现目标

1、掌握STM32 HAL库的串口重定向

2、具体目标:1、实现printf  “打印”各种常用的类型的数据变量


一、串口“打印”

        UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串行通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

        UART 在开发中应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个UART 通信接口连接至电脑,用于在调试程序时可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错,具体在哪里出错等等。

二、原理图设计

三、STM32CubeMX 配置

1.USART配置

四、串口重定向程序设计

1.方式一:使用微库(Use MicroLIB)

①:需要在 main.c 文件中添加如下代码

/* USER CODE BEGIN Includes */

#include <stdio.h>

/* USER CODE END Includes */
/* USER CODE BEGIN 4 */

/*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
	return ch;
}
/* USER CODE END 4 */

②:在Keil5中勾选如下选项

2.方式二:不勾选 MicroLIB

①:需要在 main.c 文件中添加如下代码

/* USER CODE BEGIN Includes */

#include <stdio.h>

/* USER CODE END Includes */
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
 
}; 
 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
    //二选一,功能一样
    HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
	return ch;
    
//	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
//    USART1->DR = (uint8_t) ch;      
//	return ch;
}

说明:上面两种方法二选一即可

五、“打印”测试程序设计

1、定义各类型变量

/* USER CODE BEGIN PV */

 int i = 0;
 float m = 3.14;
 char c = 'A';
 char *str  = "Hello 李银河!";
 
/* USER CODE END PV */

2、在while (1) 里 打印各变量的值

	i++;
	printf("i = %d\r\n",i);
	
	printf("m = %.2f\r\n",m);	
	
	printf("c = %c\r\n",c);	
	
	printf("str = %s\r\n",str);

	HAL_Delay(200);

六、实验效果

七、仿真实现

说明:proteus不能使用printf发送浮点型数据,一旦发送就会卡死。仿真时将小数打印代码屏蔽。


总结

1、串口打印在开发中非常重要,它就像是工程师的眼睛一样。尤其是在调试代码时,工程师可以利用串口打印出想要知道的变量等的值,以利于查找问题所在。

作者:面包板扎

物联沃分享整理
物联沃-IOTWORD物联网 » STM32应用开发教程进阶:UART串口重定向实现printf输出

发表评论