找回密码
 立即注册
首页 业界区 安全 手把手教你STM32F429串口配置与重定向技巧 ...

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

挠溃症 2025-8-12 15:26:05
大家好,我是知微。
在嵌入式开发中,串口通信是最基础也是最重要的调试手段之一。
本文将详细介绍如何在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中修改代码如下
  1. #pragma import(__use_no_semihosting)  
  2. struct __FILE
  3. {
  4.   int handle;
  5. };
  6. FILE __stdout;         
  7. void _sys_exit(int x)
  8. {
  9.   x = x;
  10. }
复制代码
  1. int fputc(int ch, FILE *f) {
  2.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0x1FF);
  3.     return ch;
  4. }
  5. int fgetc(FILE *f) {
  6.     uint8_t ch;
  7.     HAL_UART_Receive(&huart1, &ch, 1, HAL_MAX_DELAY);
  8.     return ch;
  9. }
复制代码


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



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

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


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




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

现在我们已经完成了串口通信的基础配置和重定向,这为后续工作打下了坚实基础。
在下一篇教程中,我们将基于此工程移植letter-shell——一款功能强大的嵌入式命令行工具,它将为我们的开发调试带来极大便利。
<blockquote>

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册