You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L073V8T单片机UART重定向printf无输出问题求助

STM32L073V8T UART重定向printf无输出问题排查

以下是你的代码中存在的关键问题及修复方案:

1. APB1时钟定义错误

你定义的APB1_CLK = 2097000与STM32L0的实际时钟不符。STM32L0默认HSI时钟为16MHz,若APB1预分频器为1(默认配置),则APB1时钟应为16MHz。错误的时钟值会导致波特率计算严重偏差,串口无法正确解析数据。

修复:修改宏定义为实际的APB1时钟,默认配置下:

#define APB1_CLK        16000000

2. GPIO复用功能配置错误

PD5作为USART2_TX的复用功能并非AF0,查阅STM32L073 datasheet可知,PD5的USART2_TX对应AF4。你将AFR寄存器的20-23位全部清零(设置为AF0),导致引脚未连接到USART2的发送通道,自然无输出。

修复:将PD5的复用功能设置为AF4:

// 先清除20-23位的原有配置
*pPDAFRlwReg &= ~(0xFU << 20);
// 设置为AF4
*pPDAFRlwReg |= (0x4U << 20);

3. UART发送数据逻辑错误

uart2_write函数中的ch = (ch<<1);和USART2->TDR = ~(ch & 0xFF);完全破坏了原始字符数据:

  • 左移1位会偏移字符的ASCII码,比如'H'(0x48)变成0x90;
  • 取反操作会翻转所有位,导致数据完全错误。

UART的TDR寄存器只需写入原始的字符ASCII值即可。

修复:简化发送逻辑:

void uart2_write(int ch)
{
    /* 等待发送数据寄存器为空 */
    while(!(USART2->ISR & (1U<<7))){} 
    
    /* 写入原始字符数据到TDR */
    USART2->TDR = ch & 0xFF;
}

4. USART_CR1寄存器初始化错误

你使用*pUSART2Cr1Reg = (1U<<3);直接赋值,会清除CR1寄存器的所有默认配置位(比如奇偶校验、数据位长度等),容易引发未知问题。正确的做法是使用或操作单独置位TE位。

修复:

// 仅置位TE位(发送使能),保留其他默认配置
*pUSART2Cr1Reg |= (1U<<3);

5. printf换行符问题

你的printf("Hello ");中的换行符不规范,串口监视器通常需要\r\n来正确识别换行,虽然这不是无输出的核心原因,但会影响显示效果。

修复:

printf("Hello\r\n");

额外建议

  • 确保串口监视器的波特率、数据位(8位)、停止位(1位)、奇偶校验(无)与代码配置完全一致;
  • 可以先测试uart2_write('A');直接发送单个字符,验证串口硬件连接和基础配置是否正常,再测试printf重定向。

内容的提问来源于stack exchange,提问作者UgurCinar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:04:55