[i=s] 本帖最后由 xusiwei1236 于 2025-7-29 22:38 编辑 [/i]<br />
<br />
本篇将介绍如何在STM32U385上实现 printf
输出到LPUART1,并通过板载STLink-V3E的虚拟串口将输出内容转发到PC,具体包括原理图解读、项目创建、代码实现、实验验证的完整开发流程。首先介绍了软硬件准备,包括VSCode+CubeMX的软件开发环境、开发板与PC的硬件连接方式,以及LPUART相关的硬件原理图。接着介绍了CubeMX项目的创建步骤,涵盖芯片型号选择、引脚配置、LPUART参数设置、ioc文件保存及CMake项目生成。随后介绍了printf重定向的实现代码,即在VSCode中导入项目后,于 usart.c
添加 __io_putchar
函数,实现通过 LPUART1
发送字符,并在 main.c
的主循环中添加 printf
调用进行测试。最后介绍了printf重定向的验证步骤,包括生成elf文件、下载运行elf文件,以及通过MobaXterm串口会话查看输出结果。文档末尾还提供了ST官网文章、CubeMX等工具的参考链接,对相关内容感兴趣的读者,可自行访问相应链接了解更详细的信息。
一、准备软硬件
1.1 软件环境
开发环境用的是VSCode+CubeMX,搭建方式见上一篇帖子: 【STM32U385RG 测评】搭建基于VSCode的STM32开发环境
1.2 硬件连接
硬件连接方式如下图所示:

通过USB Type-C线连将开发板连接到PC,需要注意的是:
- 开发板接标有USB STLK的口,如图所示;
- 有的USB线PC不识别,不是驱动问题,换一根线就可以;
1.3 原理图
开发板上带了ST-Link V3E调试器,位于主控芯片STM32U385RGT6Q和STLK USB接口之间,用于实现PC和主控芯片之间的JTAG调试和UART通信,其中UART相关连接部分的原理图如下图所示:


二、创建CubeMX项目
2.1 选择芯片型号
启动CubeMX,芯片型号STM32U385RG,Start Project,如下图:

2.2 配置引脚功能
根据前面的原理图,将PA9和PA10引脚分别配置为LPUART1_TX、LPUART1_RX功能,如下图:

2.3 配置LPUART参数
首先,找到Connectivity->LPUART1,Mode下拉到Asynchronous,启用LPUART1功能;
然后,修改波特率为115200,如下图:

2.4 保存ioc文件
完成上述配置后,使用CubeMX菜单File->Save as,或者快捷键Ctrl+S,弹出保存ioc文件对话框,
例如,保存到 E:\DIY\ST\STM32U385\21ic_bbs\LPUART_printf
目录,如下图:

2.5生成CMake项目
切到Project Manager标签页,Toolchain选择CMake,如下图:

Code Generator中,勾选Copy only the necessary library fies和Generate peripheral initialization as a pair of '.c/.h' files per peripheral;

接着,Generate Code即可生成CMake项目代码。
三、实现printf重定向到LPUART
3.1 导入CMake项目
在VSCode中,使用STM32插件的Import CMake project菜单,导入项目:

选择前面创建的目录,E:\DIY\ST\STM32U385\21ic_bbs\LPUART_printf
,确认导入,在当前窗口打开即可。
3.2 实现__io_putchar函数
找到 usart.c
文件,在末尾添加如下 __io_putchar
函数:
int __io_putchar(int ch)
{
HAL_UART_Transmit(&hlpuart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
Ctrl+S保存。
3.3 添加printf调用
找到 main.c
,在 while (1)
循环中添加如下代码:
printf("Hello 21ic, Hello NUCLEO-U385RG-Q!\r\n");
HAL_Delay(1000);
Ctrl+S保存。
四、验证printf重定向到LPUART
4.1 生成elf文件
在VSCode中,使用CMake插件的生成按钮,生成LPUART_printf.elf文件,如下图:

构建成功后,可以看到RAM、Flash占用信息:

4.2 下载、运行LPUART_printf.elf文件
在VSCode中,使用STM32插件的“运行命令”按钮,下载LPUART_printf.elf到开发板,并复位运行,如下图:

弹出界面中,选择 CubeProg: Flash project (SWD)
,如下图:

在MobaXterm中,创建新的Serial会话,参数如下图:

点击OK,确认创建串口会话,此时就可以看到输出了:

最后,附上项目开源代码链接:
https://gitcode.com/xusiwei1236/NUCLEO-U385/tree/main/LPUART_printf
五、参考链接
- ST官网文章《使用面向VS Code的STM32扩展简化您的开发过程》: https://www.st.com.cn/content/st_com/zh/campaigns/stm32-vs-code-extension-z11.html
- STM32CubeMX下载页面: https://www.st.com.cn/zh/development-tools/stm32cubemx.html
- STM32CubeCLT下载页面: https://www.st.com.cn/zh/development-tools/stm32cubeclt.html
- ST-MCU-FINDER-PC下载页面:https://www.st.com.cn/zh/development-tools/st-mcu-finder-pc.html
- VSCode下载页面: https://code.visualstudio.com/Download
- NUCLEO-U385RG-Q开发板原理图: https://www.st.com.cn/resource/en/schematic_pack/mb1841-u385rgq-e01-schematic.pdf