手把手教你STM32F429串口配置与重定向技巧
大家好,我是知微。在嵌入式开发中,串口通信是最基础也是最重要的调试手段之一。
本文将详细介绍如何在STM32F429平台上使用STM32CubeMX工具配置串口通信,并实现printf 重定向功能,为后续开发调试打下坚实基础。
1. 使用CubeMX配置串口通信
打开CubeMX,选择MCU
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753665773354-b8c0228a-5586-440e-8fe2-2d762a948f43.png
配置SYS
[*]Debug配置为Serial Wire,这样才能调试
[*]因为要用到FreerRTOS,时基源不能用SysTick
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753840614719-801b206e-8048-4a71-9b1c-d1c1fd6f2ec8.png
配置RCC
我这里HSE外接了8MHz的晶振,LSE外接了32.768KHz的晶振
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753840731366-09538e2c-7c0e-49c9-99ff-05154539639d.png
配置时钟
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753840846039-160995cf-32d1-4dcd-8af5-37eedad501b5.png
配置UART7
[*]我这里的UART7,用到的引脚分别是PE7和PE8
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753840997107-d587dbc8-3406-4653-a5ec-d331a3c54038.png
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841017209-3dd2df0b-a167-420b-89c8-7e6c29e3de36.png
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841072611-bf69612a-1e5e-4bbe-868f-876130a4f700.png
[*]参数保持默认的
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841099421-369ce736-803a-4555-be7b-9f802913c327.png
配置FreeRTOS
[*]选中就好了,参数先保持默认,后续可根据情况修改
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841204588-eae33db4-d3f5-4db6-a0fa-48d601256d93.png
配置项目管理
[*]项目名为UART7_LETTERSHELL
[*]项目所在路径
[*]IDE我这里选择MDK
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841361049-6ddaa8a0-825d-4850-8170-5c077aff26ab.png
[*]仅复制需要的库文件
[*]自动生成配对的.c/.h文件
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841440191-20469bff-8507-438d-9cdc-e5e8b1a49e7d.png
生成工程代码
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841616632-1be450c2-6d5a-4b3e-be71-e72389209c13.png
[*]代码成功生成,点击Open Project打开工程
配置keil
[*]去掉浏览信息,加快编译速度
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841769808-eaf53f11-6733-41ee-899f-4a6c62ef0993.png
[*]优化等级改为Level 0
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841824087-cef21a90-2936-4ea5-ace2-220264d63fed.png
修改代码
[*]打开freertos.c文件
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753842138554-8f480904-45b1-4c7c-9216-54d6d695842b.png
[*]增加下面的代码#
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753842212502-64f64dfd-b7db-45a4-9785-b09d9773cc3a.png
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753842433301-44770acc-5d07-4398-8f30-d1d74d3caf40.png
编译烧录
[*]编译成功
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841909776-fc285952-52e6-49c0-9201-65f3f5187c05.png
[*]我这里刚好用的就ST-LINK,按F8或者点击Load图标,直接烧录就可以
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753841973010-3eaed56d-2086-40fe-b5bb-255be523225d.png
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753842028430-901f72a4-c088-4b24-85c5-63769f5eb5aa.png
连接串口测试
[*]串口调试助手的参数配置,要与UART7保持一致
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753842751583-e284db58-df41-4f48-bf58-382cee09adb0.png
[*]可以看到,已经正常在打印了
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753842532388-494b0dcf-f588-4edb-ae04-82c7f5c058eb.png
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;
}https://cdn.nlark.com/yuque/0/2025/png/32514245/1753844152882-97abceab-b076-4053-8d96-18b7866256d6.png
[*]修改freertos.c的代码,增加头文件,将HAL_UART_Transmit用printf替代
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753844231592-fe6913c5-7d56-4548-885f-f7f58dccd12f.png
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753844247909-5abaacf9-fe8a-4d02-aaa0-87e81e5a5436.png
[*]编译烧录测试,可以看到重定向成功
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753844343019-68868c50-01fe-4c24-ad8c-aa1c944cea2e.png
方法2:使用MicroLIB(勾选Use MicroLIB)
[*]核心逻辑:MicroLIB是Keil专为嵌入式优化的精简库,默认不依赖半主机模式,但需手动实现输入/输出函数。
[*]操作步骤:在keil中勾选Use MicroLIB,注释掉前面的半主机相关代码,保留fputc/fgetc 重定向代码
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753844650527-198af77d-c38b-4bb7-9397-b0e1f9054ce9.png
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753844706341-b5aa886b-fcdd-4150-b805-2fdda8970d75.png
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753845122496-849259e6-644f-44e1-a0ce-f3a9b8aaf086.png
[*]编译烧录测试,一样重定向成功
https://cdn.nlark.com/yuque/0/2025/png/32514245/1753845162240-1bf36d54-bb43-41ea-9ada-52f4d9903482.png
现在我们已经完成了串口通信的基础配置和重定向,这为后续工作打下了坚实基础。
在下一篇教程中,我们将基于此工程移植letter-shell——一款功能强大的嵌入式命令行工具,它将为我们的开发调试带来极大便利。
<blockquote>
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]