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