STM32CubeMX 配置 USART 及 Keil 实现 Printf 教程
一、引言
在嵌入式开发领域,串口通信是极为常用的功能,而Printf函数能便捷地将数据经串口输出,便于调试与信息交互。本文将围绕如何运用 STM32CubeMX 配置 STM32F4xx 的 USART,并在 Keil 编译器中编写Printf函数展开详细讲解,助力正在学习 STM32 开发的小伙伴。
二、开发环境准备
- 硬件准备:准备一块 STM32F4 系列开发板,确保开发板供电正常,且串口引脚已正确连接到电脑(通常需借助 USB 转串口模块)。
- 软件准备
-
- 安装 STM32CubeMX 软件,安装 Keil MDK-ARM,
-
- 安装相应的 STM32F4 系列器件支持包,在 STM32CubeMX 和 Keil 中都要确保已安装对应型号的器件支持包,以保证芯片资源能被正确识别。
三、STM32CubeMX 配置 USART
- 新建工程
打开 STM32CubeMX,点击 “File” -> “New Project”,在弹出的芯片选择窗口中,选择对应的 STM32F4xx 型号,例如STM32F407ZGT6,然后点击 “Start Project”。
第一步:

第二步:
第二步:
- 配置时钟树
依据开发板的晶振情况配置时钟树,一般开发板采用外部 8MHz 晶振,通过时钟树配置将系统时钟设为 168MHz。具体操作是在 “Clock Configuration” 界面中,设置 PLL 相关参数,使 HCLK 达到 168MHz,配置完成后查看时钟树连接情况,确保时钟配置无误。


- 配置 USART
-
- 在 “Pinout & Configuration” 选项卡中,找到 “Connectivity” -> “USART1”(这里以 USART1 为例,也可选择其他 USART),点击选择 “Mode” 为 “异步通信 (Asynchronous)”。

- 在 “Pinout & Configuration” 选项卡中,找到 “Connectivity” -> “USART1”(这里以 USART1 为例,也可选择其他 USART),点击选择 “Mode” 为 “异步通信 (Asynchronous)”。
-
- 配置 USART1 的波特率,一般设为 115200bps,数据位 8 位,奇偶校验为无校验,流控制为无流控制,停止位 1 位,这些参数可按需调整。

- 配置 USART1 的波特率,一般设为 115200bps,数据位 8 位,奇偶校验为无校验,流控制为无流控制,停止位 1 位,这些参数可按需调整。
-
- 配置完成后,STM32CubeMX 会自动分配相应的 GPIO 引脚作为 USART 的 TX(发送)和 RX(接收)引脚,例如 USART1 的 TX 引脚为 PA9,RX 引脚为 PA10,确保这些引脚未被其他外设复用。
- 生成代码
在 “Project Manager” 选项卡中,设置工程名称、存储路径,选择 “Toolchain / IDE” 为 “MDK-ARM”。然后点击 “Code Generator” 选项卡,勾选 “Generate peripheral initialization as a pair of '.c/.h' files per peripheral”,这样生成的代码结构更清晰,便于管理和修改。最后点击 “Generate Code” 按钮,等待代码生成完毕。




四、Keil 中编写 Printf 函数
- 打开工程
在 Keil 中打开 STM32CubeMX 生成的工程文件(.uvprojx)。
- 重定向fputc函数
在工程中找到main.c文件,添加以下代码:
#include "stdio.h"
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/* USER CODE END 0 */
上述代码重定向了fputc函数,HAL_UART_Transmit函数用于通过 USART 发送一个字节的数据,&huart1是在stm32f4xx_hal_msp.c中初始化好的 USART1 句柄,通过重定向fputc函数,Printf函数便可利用 USART 进行数据输出。
3. 使用Printf函数
在main函数中,添加如下代码进行测试:
int main(void)
{
/* USER CODE BEGIN 1 */
/* 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 */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("Hello, STM32F4!\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
上述代码中,printf("Hello, STM32F4!\r\n");语句会通过配置好的 USART1 将字符串发送出去。
五、编译与调试
1. 编译工程
在 Keil 中点击 “Rebuild All” 按钮,对工程进行编译,若代码无语法错误,编译将顺利通过,生成可执行文件。
工程配置中勾选微型库 MicroLib

2. 调试与验证
将开发板通过调试器(如 ST-Link)连接到电脑,在 Keil 中点击 “Debug” 按钮进入调试模式。在调试模式下,全速运行程序,使用串口调试助手(如 XCOM、SSCOM 等),选择对应的串口号(根据 USB 转串口模块的驱动分配的端口号),设置波特率为 115200bps,打开串口,此时应能在串口调试助手中看到输出 “Hello, STM32F4!” 字符串,表明Printf函数通过 USART 配置成功。
通过 STM32CubeMX 配置 USART 和在 Keil 中重定向fputc函数,成功实现了Printf函数经串口输出数据的功能。该方法在嵌入式开发调试过程中实用性强,能方便输出各类变量值与调试信息。
希望本教程能助大家更好掌握 STM32 的串口通信开发,若实践中遇到问题,欢迎在评论区留言交流。
更多推荐


所有评论(0)