赞
踩
硬件:正点原子探索者 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配置步骤和程序。
选择时钟源:
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);
- /* 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 */

烧录程序:将编译好的程序用ST-LINK烧录到STM32微控制器中。
观察结果:一旦程序烧录完成并运行,串口助手每隔一秒打印“Hello World!”。如果一切正常,恭喜你,你现在已经会“Hello World!”了!
1.确保你的开发环境和工具链已经正确安装和配置。
2.如果没有打印“Hello World!”,按一下复位键,检查连接和电源是否正确,注意根据你所用的硬件来接线,不要接错线了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。