一、开发环境
硬件:正点原子探索者 V3 STM32F407 开发板
单片机:STM32F407ZGT6
Keil版本:5.32
STM32CubeMX版本:6.9.2
STM32Cube MCU Packges版本:STM32F4 V1.27.1
上一篇使用STM32F407的HAL库只需1行代码实现USART1串口打印“Hello World!”,而平时都是用printf打印的,现在每次都要调用HAL_UART_Transmit()函数,比较麻烦,怎么解决呢?采用fputc调用HAL_UART_Transmit实现printf重定向的,它有三个好处。
对
HAL_UART_Transmit
实现printf
重定向的三个主要好处包括:
提高代码效率和可读性:
重定向printf
到HAL_UART_Transmit
允许开发者使用熟悉的printf
函数格式来发送数据到USART,而无需每次调用底层UART传输函数。这不仅减少了代码量,还提高了代码的可读性和可维护性。开发者可以专注于业务逻辑的实现,而无需过多关注底层通信细节。简化调试过程:
在嵌入式系统开发中,调试是一个必不可少的环节。通过重定向printf
,开发者可以直接将调试信息通过USART发送到PC端的串口监视工具中,实时查看程序的运行状态和变量值。这极大地简化了调试过程,提高了开发效率。增强灵活性和扩展性:
虽然HAL_UART_Transmit
提供了基本的UART通信功能,但使用printf
重定向可以进一步扩展其用途。printf
函数支持丰富的格式化输出选项,可以方便地输出各种数据类型,并以特定的格式呈现。此外,开发者还可以结合其他库函数或自定义函数,实现更复杂的串口通信需求,如发送自定义协议包或解析接收到的数据。综上所述,对
HAL_UART_Transmit
实现printf
重定向可以带来代码效率和可读性的提升、调试过程的简化以及灵活性和扩展性的增强等好处。
下面我将详细解释利用STM32 HAL库实现USART1串口通信,并通过printf重定向输出"Hello World"的STM32CubeMX配置步骤和程序。
二、配置STM32CubeMX
- 启动STM32CubeMX,新建STM32CubeMX项目:
- 选择MCU:在软件中选择你的STM32型号-STM32F407ZGT6。
-
选择时钟源:
- 配置时钟:
- 使能Debug功能:Serial Wire
- HAL库时基选择:SysTick
- USART1配置:选择异步模式。
- 配置工程参数:在Project标签页中,配置项目名称和位置,选择工具链MDK-ARM。 9.生成代码:在Code Generator标签页中,配置工程外设文件与HAL库,勾选头文件.c和.h文件分开,然后点击Project > Generate Code生成代码。
三、代码实现与部署
-
main.c增加代码:main.c的第1行添加printf的头文件#include<stdio.h>,在 while(1)里增加2行代码。
/* USER CODE BEGIN Header */ #include<stdio.h> /********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/ /* USER CODE END Header */
//HAL_UART_Transmit(&huart1, (uint8_t*)"Hello World!\r\n", 16, 10);// 使用HAL_UART_Transmit函数直接发送"Hello World!\r\n"字符串到USART1 // 重定向后的printf函数发送"Hello World!\r\n"字符串到USART, //printf函数内部会调用自定义的重定向函数(例如fputc),该函数会使用HAL_UART_Transmit发送数据 printf("Hello World!\r\n"); HAL_Delay(1000);
- usart.c增加代码:usart.c的第1行添加头文件#include<stdio.h>,在末尾用户代码区增加如下代码。printf调用“fputc()”,该函数会使用HAL_UART_Transmit发送数据。
/* USER CODE BEGIN 1 */ struct __FILE {int a; }; FILE __stdout; /***************************************************** *function: 写字符文件函数 *param1: 输出的字符 *param2: 文件指针 *return: 输出字符的 ASCII 码 ******************************************************/ int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);return ch; } /* USER CODE END 1 */
- 连接USART1:用USB转TTL工具连接当前硬件USART1的PA9、PA10,GND。
- 打开串口助手:
- 编译代码:Keil编译生成的代码。
-
烧录程序:将编译好的程序用ST-LINK烧录到STM32微控制器中。
四、运行结果
观察结果:一旦程序烧录完成并运行,串口助手每隔一秒打印“Hello World!”。如果一切正常,恭喜你,你现在已经会“Hello World!”了!
五、注意事项
1.确保你的开发环境和工具链已经正确安装和配置。
2.如果没有打印“Hello World!”,按一下复位键,检查连接和电源是否正确,注意根据你所用的硬件来接线,不要接错线了。