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
相关产品推荐
相关产品推荐

