stm32H7 SPI和SPI DMA时间差异对比

本文通过实验对比了SPI模式与SPIDMA模式在单字节与大量数据传输时的速度差异。结果显示,在单字节传输时SPI模式更快,而在大量数据传输时SPIDMA模式表现出显著优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

偶然发现spi dma如果在单个字节速度会比spi模式慢很多, 因此做一个对比

SPI速度设置为16M

1 单个字节收发

SPI模式

可以看到每个字节的数据之间有不是连续的, 中间会有一段时间没有数据

SPI DMA模式

如果每次收发1个字节, 会慢很多 达到8us, 远远超过了SPI模式

2 SPI DMA大量数据读写

因为SPI模式间隔和单字节是一样的,这里就只测试SPI DMA模式

可以看到SPI DMA数据和数据之间是连续的

3 SPI模式和SPI DMA模式读FLASH 4096字节数据时间

 SPI模式13ms

SPI DMA模式2MS

4 SPI DMA不同速度下读4096字节时间对比

1 16M -2ms

 

2 32M-1ms

3 50M -600us

 4 100m-350us

 

5  总结

1 如果是单个字节, 那么SPI模式速度比SPI DMA模式块

2 如果是大量数据传输, 还是DMA速度快很多倍

3 SPI时钟速度越快, 大量数据传输的优势越明显

### STM32H7 SPI DMA 数据传输配置 #### 配置概述 为了使STM32H7能够通过SPI接口高效地进行数据传输,通常会选择使用DMA来减轻CPU负担并提高吞吐率。当涉及到大量数据交换时,采用DMA方式进行SPI通信可以显著提升性能[^1]。 #### 初始化过程 初始化过程中不仅需要完成标准的SPI参数设定(如波特率、工作模式等),还需要特别注意对NSS引脚的支持以及DMA通道的选择与配置。具体而言,在双机通信场景下,除了常规的SPI设置外,还需额外处理硬件片选信号——即NSS管脚的管理。 #### 关键代码片段 下面给出一段用于启动基于DMASPI发送操作的关键C语言源码: ```c // 假设已经定义好了SPI句柄 hspi DMA 句柄 hdma_spi_tx HAL_StatusTypeDef status; status = HAL_SPI_Transmit_DMA(&hspi, (uint8_t*)pDataBufferTx, Size); if(status != HAL_OK){ // 错误处理逻辑... } ``` 这段代码展示了如何调用`HAL_SPI_Transmit_DMA()`函数以异步的方式向指定的目标设备传送缓冲区中的数据。这里的`hspi`代表之前已正确初始化好的SPI实例对象;而`hdma_spi_tx`则是关联至该SPI外设上的专用DMA流/通道结构体变量名。 对于接收端,则应考虑如下形式的方法来进行准备: ```c // 同样假设存在有效的SPI句柄 hspi 以及对应的DMA接受句柄 hdma_spi_rx HAL_StatusTypeDef status; status = HAL_SPI_Receive_DMA(&hspi, (uint8_t *) pDataBuffeRx, Size); if(status != HAL_OK){ // 错误处理逻辑... } ``` 上述两段示例均依赖于意法半导体官方提供的HAL库框架下的API实现,并且强调了利用DMA特性所带来的效率增益特别是在批量数据交互场合下的表现优势[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值