1. 课程导论:MCU时钟系统概述、SPI通信协议基础、DMA传输原理、三者协同设计的必要性
1.1 MCU时钟系统概述
时钟系统是MCU的“心脏”,所有外设(GPIO、SPI、DMA、定时器等)的时序逻辑都依赖时钟源驱动。理解时钟树结构是配置SPI波特率和DMA传输节奏的前提。
核心概念:时钟源 → 分频/倍频 → 总线时钟 → 外设时钟。任何外设的误配置(如SPI时钟极性/相位错误、DMA请求时钟不同步)都源于对时钟树层级的不清晰。
典型MCU时钟树层级
| 层级 | 时钟源/总线 | 典型频率范围 | 驱动对象 |
|---|---|---|---|
| L1 | HSI / HSE / LSI / LSE | 32.768 kHz ~ 几十 MHz | 系统时钟源选择 |
| L2 | SYSCLK (系统时钟) | 最高主频 (如 72 MHz / 168 MHz) | AHB 总线、CPU 内核 |
| L3 | AHB 总线时钟 (HCLK) | SYSCLK 经分频 | DMA、GPIO、Flash 接口 |
| L4 | APB1 / APB2 外设时钟 | HCLK 经分频 (通常 ≤ 36 MHz / 72 MHz) | SPI、USART、I2C、定时器 |
工程要点:SPI 的波特率发生器直接挂载在 APB 总线上。若 APB 时钟配置错误,SPI 通信速率将偏离预期,导致数据采样窗口偏移。DMA 的传输速率受 AHB 总线时钟制约,时钟树配置是协同设计的“地基”。
1.2 SPI通信协议基础
SPI(Serial Peripheral Interface)是一种全双工、同步、主从式串行总线。它使用四线制(SCK、MOSI、MISO、CS)实现高速数据交换。
SPI关键参数与配置项
| 参数 | 描述 | 典型值 / 范围 |
|---|---|---|
| 时钟极性 (CPOL) | 空闲时SCK电平 | 0 (低电平) / 1 (高电平) |
| 时钟相位 (CPHA) | 数据采样沿 | 0 (第一个跳变沿) / 1 (第二个跳变沿) |
| 数据帧格式 | MSB 或 LSB 优先 | MSB first (默认) |
| 波特率分频 | SPI时钟 = PCLK / 分频系数 | 2, 4, 8, 16, 32, 64, 128, 256 |
| 数据宽度 | 每帧数据位数 | 8-bit / 16-bit |
常见陷阱:主从设备的 CPOL/CPHA 必须完全一致,否则数据采样错位导致通信失败。SPI 无内置应答机制,时钟配置错误时不会报错,只会产生“静默数据错误”。
1.3 DMA传输原理
DMA(Direct Memory Access)允许外设与存储器之间直接传输数据,无需CPU逐字节干预。DMA控制器接管总线控制权,按配置的传输描述符(源地址、目的地址、数据长度、传输模式)自动搬运数据。
DMA传输核心要素
- 传输方向:外设→内存(接收)、内存→外设(发送)、内存→内存(拷贝)。
- 传输模式:普通模式(单次传输)、循环模式(自动重载,适用于连续数据流)。
- 数据宽度:字节(8-bit)、半字(16-bit)、字(32-bit),必须与外设数据寄存器宽度对齐。
- 增量模式:源/目的地址是否自动递增(内存侧通常递增,外设侧固定)。
- 触发源:外设的DMA请求信号(如SPI的TXE/RXNE事件)。
性能收益:以 SPI 发送 1 KB 数据为例,CPU 轮询方式约需 10,000+ 次循环(每次检查标志位+写数据),DMA 方式仅需一次配置,传输完成后触发一次中断。CPU 利用率从 100% 降至接近 0%。
1.4 三者协同设计的必要性
在高速SPI应用中(如驱动LCD、读取SD卡、与ADC/DAC通信),单独配置时钟、SPI或DMA都无法达到最优性能。三者必须作为一个整体进行协同设计。
协同设计的三大核心矛盾
| 矛盾点 | 时钟树影响 | SPI配置影响 | DMA配置影响 |
|---|---|---|---|
| 速率匹配 | APB时钟决定SPI波特率上限 | 分频系数决定实际通信速率 | DMA传输速率需匹配SPI数据吞吐 |
| 数据流控制 | DMA请求时钟来自AHB | SPI的TXE/RXNE事件触发DMA请求 | DMA传输长度与SPI帧对齐 |
| 中断与同步 | 时钟门控影响外设使能时序 | SPI忙标志影响DMA启动时机 | DMA完成中断与SPI接收完成同步 |
协同设计最佳实践:先确定系统主频和APB分频,再计算SPI目标波特率并选择合适的分频系数,最后配置DMA通道的传输宽度、方向和数据长度。三者参数必须形成闭环验证,避免“时钟跑得飞快但DMA跟不上”或“SPI速率太低浪费DMA带宽”的失衡情况。
典型协同设计流程
- 时钟树规划:根据外设需求选择时钟源、配置PLL倍频、设置AHB/APB分频,确保SPI和DMA的时钟源稳定且满足最高速率要求。
- SPI参数设定:基于APB时钟计算波特率,配置CPOL/CPHA与从设备匹配,使能DMA请求(TX/RX各一路)。
- DMA通道配置:选择与SPI关联的DMA通道,设置源/目的地址、传输宽度、增量模式、传输长度,使能循环模式(若需要连续传输)。
- 启动顺序:先使能DMA,再使能SPI(或按MCU手册要求的特定顺序),确保DMA请求信号在SPI启动后立即被响应。
- 验证与调试:使用逻辑分析仪抓取SCK、MOSI、CS信号,对比DMA传输计数与预期数据长度,确认无丢帧或错位。
工程警告:切勿在未确认时钟树配置正确的情况下调试SPI+DMA。时钟错误会导致SPI波特率偏差,进而使DMA传输的数据全部无效。建议先单独验证SPI回环(Loopback)通信,再接入DMA,最后联调。