基于 STM32H7 的 DMA 传输 SPI 应用示例通过 STM32H743-Nucleo 板进行演示。使用 SPI1,MOSI 和 MISO 短接,通过 DMA 实现自发自收功能,以开启和不开启 Cache 的形式进行配置,供参考。
使用 STM32CubeMx 配置,生成 ARM MDK 环境和 Cube 库的初始化代码。配置 SPI1 为双工主角色,数据位为 16 位,并开启 SPI 的 TX/RX DMA 请求。
完成时钟、中断配置,生成初始化代码并建立工程。
在不打开 Cache 的情况下,主程序周期性修改待发送数据,使能 SPI 和 DMA 进行数据收发。定义两个内存数组用于收发缓冲,只用到 6 个数据,并初始化。添加用户代码,未开启 DMA 传输中断。
整理、调试后,观察结果。通过打断点,在两个时刻获得截图,接收缓冲区起始地址为 0x24000020,属于 AXIM RAM 区。
开启 Cache 后,工作流程相同,但在主循环修改发送和接收数据后清除和失效 Dcache。开启 DMA 传输中断,可以在传输完成中断里进行 Cache 相关的数据更新与维护操作。用户代码与不开启 Cache 类似,仅最后添加 Cache 相关代码。
整理、编译运行,结果一致。通过打断点获得两幅截图,接收缓冲区起始地址仍为 0x24000020,属于 AXIM RAM 区。
开启 Cache 时,数据缓冲区须遵循 32 字节对齐原则。因此,收发缓冲区的定义和初始化与不开启 Cache 略有不同。代码示例中用到六个 16 位半字数据。
整个示例结束,附带的代码可供使用。开启 Cache 后,数据更新与维护可以通过配置 MPU 实现。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。