1. 项目背景与核心目标
在嵌入式系统开发中,从裸机环境过渡到操作系统是一个关键的技术节点。这个过程中最基础也最容易被忽视的环节,就是调试信息的输出能力建设。当你的开发板还处于"光板"状态,没有文件系统、没有网络栈、甚至没有显示屏驱动时,如何获取系统运行状态信息?这就是串口输出技术存在的根本价值。
我经历过太多凌晨三点的调试现场:面对一块毫无反应的黑屏开发板,只能靠LED灯的闪烁频率来猜测程序运行状态。直到掌握了串口调试技术,才真正体会到什么叫"看见代码在跑"。本文将分享我在多个ARM Cortex-M/A系列芯片上验证过的串口输出方案,重点解析STM32平台下从时钟配置到printf重定向的全套实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件层基础配置
2.1 串口外设选型考量
在STM32系列中,USART和UART外设的选择需要权衡功能需求与资源占用:
- USART支持同步通信和硬件流控(CTS/RTS),适合高速可靠传输
- UART仅支持异步模式,但代码更精简
以STM32F407为例,其USART1挂载在APB2总线(最高84MHz),而USART2/3挂在APB1总线(最高42MHz)。如果只是输出调试信息,建议选择任意一个UART外设即可。但要注意:
重要提示:避免使用后续可能被其他功能占用的串口(如Bootloader使用的USART1)
2.2 引脚复用配置实战
以USART2为例(PA2-TX, PA3-RX),标准配置流程如下:
c复制// 使能GPIOA和USART2时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
// 配置PA2为复用功能模式
GPIOA->MODER &= ~GPIO_MODER_MODER2_0; // 清除bit0
GPIOA->MODER |= GPIO_MODER_MODER2_1; // 设置bit1为复用模式
// 选择AF7复用功能(USART2_TX)
GPIOA->AFR[0] |= (7 << (2 * 4));
常见踩坑点:
- 忘记使能GPIO端口时钟(RCC_AHB1ENR)
- 复用功能编号错误(不同芯片AF编号不同)
- 未配置引脚上拉
