大家好,我是知微。
在嵌入式开发中,串口通信是最基础也是最重要的调试手段之一。
本文将详细介绍如何在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
生成工程代码
- 代码成功生成,点击Open Project打开工程
配置keil
修改代码
编译烧录
- 我这里刚好用的就ST-LINK,按F8或者点击Load图标,直接烧录就可以
连接串口测试
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——一款功能强大的嵌入式命令行工具,它将为我们的开发调试带来极大便利。
<blockquote>
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |