
前言上一章利用UART实现了数据收发的功能我们在学习C语言时经常用printf函数用于程序调试但是MCU是无法直接用这个函数的。所以我们通过改写函数将 printf 重定向 到串口之上然后通过串口调试助手来显示。一、功能通过printf函数直接将文本通过UART1串口输出。二、硬件通过USB转TTL模块连接PC与Startkit板, Startkit板与USB转TTL模块的连线方式如下Startkit 开发板USB转TTL模块Tx(PA0)RxRx(PA1)TxGNDGND三、原理printf底层会调用fputc输出单个字符我们重定向这个函数把字符通过 UART 发送出去就可以串口打印。#include stdio.h // 重定向fputcprintf最终调用这个函数输出单个字符 int fputc(int ch, FILE *f) { // 阻塞发送1个字节huart1串口句柄按需改成其他的串口句柄超时时间设为1000避免长时间阻塞 HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 1000); return ch; }使用直接printf(Hello world, val %d\r\n, 123);缺点HAL_UART_Transmit是阻塞式大量打印会卡住程序不要在中断回调函数调用否则会占用大量时间。四、PY32Studio配置4.1 创建一个新工程首先用PY32Studio创建一个F032_PRINTF的新工程。4.2 配置时钟在芯片视图中点击时钟视图在时钟视图中选择HSI为时钟源配置PLL_MULx9SYS_SELPLL系统时钟为72MHz.4.3 配置UART1第一步配置完时钟后配置UART1的参数激活UART1配置UART1的参数波特率115200停止位1数据长度8位奇偶校验无。第二步点击生成工程五、编写应用代码5.1 应用代码在PY32Studio生成的代码的基础上添加以下代码在uart.c文件中包括下面头文件/* USER CODE BEGIN Includes */ #include stdio.h /* USER CODE END Includes */在uart.c文件中重写fputc()函数:/* USER CODE BEGIN ExternalFunctions */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 1000); //阻塞式发送超时时间设为10001s return ch; } /* USER CODE END ExternalFunctions */在main.c文件添加一个test_value的变量在While(1)循环中调用printf函数发送test_value的值并对test_value加1。int main(void) { /* USER CODE BEGIN 1 */ uint16_t test_value 0; //测试数据 /* 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 */ Studio_RCC_Init(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ Studio_GPIO_Init(); Studio_UART1_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while(1) { printf(testvalue %d\r\n,test_value); //打印测试数据 test_value; //测试数据加1 HAL_Delay(1000); //延时1000ms /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }5.2 设置在选项卡中选择安装的编译器版本和Debug类型。5.3 编译下载点击编译图标开始编译程序编译成功后开始下载程序下载成功后开始调试程序5.4调试点击调试图标进入调试界面运行程序。打开串口调试助手在端口名中选择对应的对口名称并设置波特率数据位校验位停止位。打开端口可以观察到MCU发送过来的数据。六、总结本章内容我们重写了fputc函数并通过printf函数打印数据。后面的练习中可以利用这个printf函数更方便地调试程序。