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

[复制链接]
发表于 2025-8-12 15:20:41 | 显示全部楼层 |阅读模式
大家好,我是知微。
在嵌入式开发中,串口通讯是最基础也是最重要的调试手段之一。
本文将详细介绍如何在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——一款功能强大的嵌入式命令行工具,它将为我们的开发调试带来极大便利。
📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表