前言
这是一个看似很基础但是又常常被忽略的问题,尤其是对于只接触了STM32F1系列的初学者而言。
USART(通用同步异步收发器)的数据寄存器配置因具体型号和厂商而异,但通常分为以下两种情况:
1. 单数据寄存器(共享收发)
-
常见于基础型号(如STM32F1系列、AVR等):
- 使用同一个物理寄存器 (如
USART_DR
)进行发送和接收。 - **发送数据寄存器(TDR)和接收数据寄存器(RDR)**在逻辑上分开,但共用同一地址。
- 写入时操作发送缓冲区,读取时访问接收缓冲区。
- 特点 :软件需通过状态寄存器(如
USART_SR
)检查当前是发送完成还是接收就绪。
- 使用同一个物理寄存器 (如
-
示例代码(STM32):
c// 发送数据 USART1->DR = data; // 写入TDR // 接收数据 data = USART1->DR; // 读取RDR
2. 独立收发寄存器
- 高端/新型MCU (如STM32H7系列):
- 提供独立的发送寄存器(TDR)和接收寄存器(RDR),有不同地址。
- 优势:减少软件开销,避免读写冲突风险。
- 示例 :
USART_TDR
(发送)USART_RDR
(接收)
关键注意事项:
- 硬件差异:需查阅具体芯片的参考手册(如STM32的Reference Manual或AVR的Datasheet)。
- FIFO支持:部分USART带硬件FIFO,可缓存多个数据(如STM32 UART的16字节FIFO)。
- DMA支持:直接内存访问可绕过寄存器操作,提升效率。
总结:
- 多数情况下,用户看到的是"一个数据寄存器",但硬件可能分开实现。
- 开发建议 :优先使用库函数(如HAL库的
HAL_UART_Transmit()
),避免直接操作寄存器。
若有具体型号,可进一步分析其数据手册!