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 总线时钟制约,时钟树配置是协同设计的“地基”。
MCU时钟树架构图 HSI / HSE LSI / LSE SYSCLK (系统时钟) AHB (HCLK) DMA / GPIO / Flash APB1 SPI2/3 / I2C / USART APB2 SPI1 / USART1 / TIM SPI2 SPI1 时钟树配置关键路径 时钟源 → PLL倍频 → SYSCLK → AHB分频(HCLK) → APB分频(PCLK1/PCLK2) SPI波特率 = PCLK / (2 × 分频系数) ;DMA传输时钟 = HCLK

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%。
DMA传输与CPU轮询对比流程图 CPU 轮询方式 CPU 循环检查 SPI 标志位 CPU 写数据到 SPI_DR CPU 等待传输完成 重复直到数据发送完毕 DMA 传输方式 CPU 配置 DMA 描述符 CPU 启动 DMA (1条指令) DMA 自动搬运数据 (CPU 可执行其他任务) DMA 传输完成中断 效率对比

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带宽”的失衡情况。

典型协同设计流程

  1. 时钟树规划:根据外设需求选择时钟源、配置PLL倍频、设置AHB/APB分频,确保SPI和DMA的时钟源稳定且满足最高速率要求。
  2. SPI参数设定:基于APB时钟计算波特率,配置CPOL/CPHA与从设备匹配,使能DMA请求(TX/RX各一路)。
  3. DMA通道配置:选择与SPI关联的DMA通道,设置源/目的地址、传输宽度、增量模式、传输长度,使能循环模式(若需要连续传输)。
  4. 启动顺序:先使能DMA,再使能SPI(或按MCU手册要求的特定顺序),确保DMA请求信号在SPI启动后立即被响应。
  5. 验证与调试:使用逻辑分析仪抓取SCK、MOSI、CS信号,对比DMA传输计数与预期数据长度,确认无丢帧或错位。
工程警告:切勿在未确认时钟树配置正确的情况下调试SPI+DMA。时钟错误会导致SPI波特率偏差,进而使DMA传输的数据全部无效。建议先单独验证SPI回环(Loopback)通信,再接入DMA,最后联调。