STM32 DMA传输中的内存对齐问题解析与解决方案

1. 问题现象与背景分析

最近在调试STM32F4系列MCU的SPI DMA传输时,遇到了一个相当棘手的问题。项目中使用DMA将图像数据从Flash传输到SPI外设,驱动TFT-LCD显示屏。当采用直接寄存器写入方式时,显示完全正常:

c复制SPI1->DR = *pdata;  // 数据显示正确

但切换到DMA传输后,屏幕上出现了明显的颜色异常。通过逻辑分析仪抓取SPI数据线信号,发现实际发送的数据与预期不符。

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 问题排查过程

2.1 原始数据与预期对比

测试数据在内存中的原始字节数组为:

code复制0x77, 0xB5, 0x12, 0x34, 0x56, 0x78, 0x01, 0x02, ...

在小端系统中,期望的16位传输应该是:

code复制0xB577, 0x3412, 0x7856, 0x0201, ...

但实际观测到的SPI数据寄存器(SPI_DR)值却出现了异常:

code复制发送 0xB577 → 显示 0x3700(有时0x7700)
发送 0x3412 → 显示 0x12B5 
发送 0x7856 → 显示 0x5634
发送 0x0201 → 显示 0x0178

2.2 DMA配置检查

DMA配置看起来没有问题:

c复制dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

2.3 关键发现:内存地址对齐问题

通过Keil调试器检查发现,存储在Flash中的图像数据数组起始地址为0x0803D7F3。这个地址的最低有效位是1,不符合半字(16-bit)传输要求的对齐条件。

重要提示:DMA进行16位(半字)传输严格要求2字节对齐(地址最低位=0),非对齐访问会导致硬件读取错误数据。

3. 技术原理深入解析

3.1 ARM架构的内存访问特性

在ARM Cortex-M系列处理器中,非对齐内存访问会带来以下问题:

  1. 性能损失:非对齐访问需要额外的总线周期
  2. 数据错误:某些情况下会直接导致数据读取错误

内容推荐

已经到底了哦
已经到底了哦