手把手教你STM32F429串口配置与重定向技巧

大家好,我是知微。

在嵌入式开发中,串口通信是最基础也是最重要的调试手段之一。

本文将详细介绍如何在STM32F429平台上使用STM32CubeMX工具配置串口通信,并实现printf 重定向功能,为后续开发调试打下坚实基础。

1. 使用CubeMX配置串口通信

打开CubeMX,选择MCU

配置SYS

  • Debug配置为Serial Wire,这样才能调试
  • 因为要用到FreerRTOS,时基源不能用SysTick

配置RCC

我这里HSE外接了8MHz的晶振,LSE外接了32.768KHz的晶振

配置时钟

配置UART7

  • 我这里的UART7,用到的引脚分别是PE7和PE8

  • 参数保持默认的

配置FreeRTOS

  • 选中就好了,参数先保持默认,后续可根据情况修改

配置项目管理

  • 项目名为UART7_LETTERSHELL
  • 项目所在路径
  • IDE我这里选择MDK

  • 仅复制需要的库文件
  • 自动生成配对的.c/.h文件

生成工程代码

  • 代码成功生成,点击Open Project打开工程

配置keil

  • 去掉浏览信息,加快编译速度

  • 优化等级改为Level 0

修改代码

  • 打开freertos.c文件

  • 增加下面的代码#

编译烧录

  • 编译成功

  • 我这里刚好用的就ST-LINK,按F8或者点击Load图标,直接烧录就可以

连接串口测试

  • 串口调试助手的参数配置,要与UART7保持一致

  • 可以看到,已经正常在打印了

2. 实现串口重定向

如果每次都靠HAL_UART_Transmit来输出打印信息,一点都不方便。万一要移植代码到其他平台,修改工作量就会特别大。最常用的还是采用printf,那要怎么实现呢,这就需要用到重定向了

方法1:使用标准库(不勾选Use MicroLIB)

  • 核心逻辑:标准库默认依赖半主机模式,需显式关闭半主机并重定向输入/输出。
  • 操作步骤:关闭半主机模式,重定向函数,在usart.c中修改代码如下
#pragma import(__use_no_semihosting)  
struct __FILE 
{ 
  int handle; 
}; 
FILE __stdout;         
void _sys_exit(int x) 
{ 
  x = x; 
} 
int fputc(int ch, FILE *f) {
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0x1FF);
    return ch;
}
int fgetc(FILE *f) {
    uint8_t ch;
    HAL_UART_Receive(&huart1, &ch, 1, HAL_MAX_DELAY);
    return ch;
}

  • 修改freertos.c的代码,增加头文件,将HAL_UART_Transmit用printf替代

  • 编译烧录测试,可以看到重定向成功

方法2:使用MicroLIB(勾选Use MicroLIB)

  • 核心逻辑:MicroLIB是Keil专为嵌入式优化的精简库,默认不依赖半主机模式,但需手动实现输入/输出函数。
  • 操作步骤:在keil中勾选Use MicroLIB,注释掉前面的半主机相关代码,保留fputc/fgetc 重定向代码

  • 编译烧录测试,一样重定向成功

现在我们已经完成了串口通信的基础配置和重定向,这为后续工作打下了坚实基础。

在下一篇教程中,我们将基于此工程移植letter-shell——一款功能强大的嵌入式命令行工具,它将为我们的开发调试带来极大便利。

📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!

posted @ 2025-08-12 17:13  知微之见  阅读(17)  评论(0)    收藏  举报