手把手教你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——一款功能强大的嵌入式命令行工具,它将为我们的开发调试带来极大便利。
📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!