2、硬件基础:外设总线架构与寄存器分类
外设驱动开发的核心在于通过总线访问寄存器,从而控制硬件行为。理解总线架构与寄存器分类,是进行寄存器配置与内存映射设计的前提。本章从硬件基础出发,梳理主流总线协议(AMBA/AXI/AHB)的拓扑与特性,并系统分类外设寄存器(控制/状态/数据),为后续性能调优流程奠定硬件认知基础。
2.1 外设总线架构:AMBA / AXI / AHB
现代 SoC(System on Chip)普遍采用 ARM 公司提出的 AMBA(Advanced Microcontroller Bus Architecture) 总线规范。其中,AXI(Advanced eXtensible Interface) 和 AHB(Advanced High-performance Bus) 是最常用的高性能总线协议。它们定义了主设备(Master)与从设备(Slave)之间的通信规则,直接影响外设寄存器的访问延迟与带宽。
2.1.1 AMBA 总线家族对比
| 特性 | AXI4 | AHB5 | APB |
|---|---|---|---|
| 应用场景 | 高性能、高带宽(DDR、GPU、DMA) | 中高性能(内部 SRAM、外设桥) | 低功耗、低速外设(UART、GPIO、I2C) |
| 数据总线宽度 | 32/64/128/256/512/1024 bit | 32/64/128/256 bit | 32 bit(固定) |
| 传输方式 | 突发传输(Burst)、乱序完成 | 突发传输(Burst)、流水线 | 单次传输、无流水线 |
| 地址/数据通道 | 分离的读地址、读数据、写地址、写数据、写响应通道 | 共享地址/数据相位 | 共享地址/数据相位 |
| 寄存器访问延迟 | 低(支持 Out-of-Order) | 中(需等待地址相位) | 高(至少 2 个时钟周期) |
| 典型外设 | DDR 控制器、PCIe、高速 DMA | 内部 SRAM、NIC、USB 控制器 | UART、SPI、I2C、GPIO、Timer |
2.1.2 AXI 总线架构详解
AXI 总线采用多通道分离架构,包含 5 个独立通道:读地址通道(AR)、读数据通道(R)、写地址通道(AW)、写数据通道(W)、写响应通道(B)。这种设计允许读写操作并行执行,显著提升总线利用率。
2.1.3 AHB 总线架构特点
AHB 总线采用共享地址/数据相位设计,地址相位与数据相位分时复用。虽然不支持乱序完成,但通过流水线技术(Pipeline)可以在一个时钟周期内完成地址传输,下一个时钟周期完成数据传输,实现较高的吞吐量。
- 地址相位:Master 驱动地址和控制信号,持续一个时钟周期。
- 数据相位:Slave 返回数据或准备接收数据,可能插入等待状态(Wait State)。
- 流水线特性:当前传输的数据相位与下一传输的地址相位可以重叠,减少总线空闲。
- 仲裁机制:支持多个 Master,通过中央仲裁器(Arbiter)决定总线使用权。
2.2 外设寄存器分类:控制 / 状态 / 数据
外设寄存器是驱动与硬件交互的接口。根据功能,寄存器通常分为三类:控制寄存器(Control Register)、状态寄存器(Status Register) 和 数据寄存器(Data Register)。理解每类寄存器的读写属性和位定义,是正确配置外设的基础。
2.2.1 三类寄存器对比
| 寄存器类型 | 读写属性 | 典型位宽 | 功能描述 | 驱动操作示例 |
|---|---|---|---|---|
| 控制寄存器 | 只写(WO)或读写(RW) | 8/16/32 bit | 配置外设工作模式、使能中断、启动传输 | 写 0x01 使能 UART 发送 |
| 状态寄存器 | 只读(RO)或读-清零(RC) | 8/16/32 bit | 反映外设当前状态(忙/空闲/错误/中断标志) | 读 bit[0] 检查发送完成标志 |
| 数据寄存器 | 读写(RW)或只读(RO) | 8/16/32 bit | 存放待发送或已接收的数据 | 写数据到 FIFO 或从 FIFO 读取 |
2.2.2 控制寄存器详解
控制寄存器是驱动配置外设行为的主要手段。通常包含以下位域:
- 使能位(Enable):控制外设模块的开启与关闭。
- 模式选择位(Mode Select):配置工作模式(如 UART 的波特率、数据位、停止位)。
- 中断使能位(Interrupt Enable):允许或禁止特定中断事件。
- 启动位(Start/Trigger):触发一次数据传输或操作。
- 复位位(Reset):将外设恢复到初始状态。
2.2.3 状态寄存器详解
状态寄存器用于驱动查询外设的工作状态。常见位域包括:
- 忙标志(Busy):外设正在处理当前操作,驱动应等待其清除。
- 完成标志(Done/Complete):操作已完成,驱动可以读取数据或发起下一操作。
- 错误标志(Error):传输过程中发生错误(如溢出、帧错误、校验错误)。
- 中断标志(Interrupt Flag):指示某个中断事件已发生,驱动需在 ISR 中处理。
- FIFO 状态(FIFO Full/Empty):指示数据 FIFO 的填充情况,用于流控。
2.2.4 数据寄存器详解
数据寄存器是外设与系统内存之间数据交换的通道。根据外设类型,数据寄存器可能以单寄存器或FIFO(First In First Out)形式存在。
| 数据寄存器类型 | 特点 | 典型外设 | 驱动访问方式 |
|---|---|---|---|
| 单数据寄存器 | 每次只能存放一个数据单元 | SPI、I2C、GPIO | 每次读写一个字节/字 |
| FIFO 数据寄存器 | 深度可配置(如 16/32/64 级) | UART、I2S、DMA | 批量读写,减少中断频率 |
| 双缓冲数据寄存器 | 两个缓冲区交替工作 | 音频 Codec、高速 ADC | 乒乓操作,避免数据覆盖 |
2.2.5 寄存器分类与总线访问的关系
不同类别的寄存器在总线上的访问行为差异显著,直接影响驱动性能:
- 控制寄存器:通常使用单次写操作,对延迟敏感。在 AXI 总线上,建议使用 Non-modifiable 传输,避免被总线合并。
- 状态寄存器:读操作频繁,但数据量小。在 AHB 总线上,应避免在状态寄存器上使用突发读,因为状态值可能实时变化。
- 数据寄存器:批量读写时,应充分利用总线突发传输(Burst)和 FIFO 深度,减少总线事务次数。
2.3 本章小结
- AMBA 总线家族:AXI 适合高性能外设(多通道、乱序完成),AHB 适合中高性能外设(流水线、突发传输),APB 适合低速外设(简单、低功耗)。
- 寄存器分类:控制寄存器用于配置,状态寄存器用于查询,数据寄存器用于数据交换。三类寄存器的访问模式不同,驱动设计需分别优化。
- 总线与寄存器关系:总线架构决定了寄存器访问的延迟和带宽特性。驱动开发者应根据总线协议特点,选择合适的访问策略(单次/突发、轮询/中断、对齐/非对齐)。