旮旯旭 发表于 2020-12-8 22:00:23

STM32V6之HAL库 SPI1+DMA读写W25Q64下 几种方式的时间对比 基于EVR



首先打开STM32CubeMX 配置STM32V6开发板W25Q64的SPI接口

硬汉的电路上标的是SPI3,实际上PB3 PB4 PB5也是SPI1的接口
为了测试最大速度 SPI1=45MHz SPI3=22.5MHz
缩写这里选择SPI1作为本次测试的说明







配置好了SPI1,选择创建工程。

在这里移植了MDK下的 EventRecorder具体移植过程,看硬汉V6教程关于EVR章节

为何要使用EVR在接下来对比分析里面会使用到

根据下面的W25Q64的操作时序,重写了另外论坛上down下来的代码
并且是否启动DMA做了优化







需要注意的是W25Q64的03H命令的最大时钟是50MHzW25Q128的最大时钟是33MHz




接下来我们来根据EVR来对上图当中
单字节读写函数:W25QXX_ReadWriteByte
多字节读、写函数:W25QXX_Receive、W25QXX_Transmit
在读取4096字节数据时花费的时间来进行分析和对比
首先关闭DMA情况下






可以看到读取4096字节,单字节读写方式时间是 9ms
而多字节发送和接收只需要 3ms 时间

接下来我们开启DMA来看看需要多久




我们可以看到单字节的方式还是 9ms
但是当多字节传输开启了DMA方式以后
读取一个扇区4096字节时间只需要740μs 不到

让我们来计算一下,我们的SPI1的时钟是 45MHz
理论上传输一个字节的时间是45000000/8 = 5625000字节/秒
传输4096字节的时间是 4096/5625000 = 728.17μs
这个时间和开启DMA的时间是相近的。
由于在读取4096字节时,还需要发送命令和读取地址的一些时间,
可以认为只有开了DMA以后才可以达到最大时钟频率的读取。

至于查询方式的读取速度和2种方式的速度也做了比较,大家觉得哪种方式好呢?
你会选择哪种方式读取呢?

不会EventRecorder的小伙伴赶紧用起来吧,真香。
接下来还会用EVR来看看ADC+DMA+TIMER+双缓冲区的对比(非半传输和完全传输,使用DMA的multi双缓存)

无关风月 发表于 2020-12-9 08:47:11

66666

wdliming 发表于 2020-12-9 09:06:29

支持楼主

caicaptain2 发表于 2020-12-9 09:49:19

666,三连赞! 详尽细致,对新手友好!

morning_enr6U 发表于 2020-12-9 13:54:06

非常帅{:34:}

eric2013 发表于 2020-12-9 14:49:53

谢谢楼主分享。

跟着硬汉学 发表于 2024-2-5 11:22:06

老哥,你代码的初始化中,为什么把CS引脚拉低,不拉低也可以正常运行的?

旮旯旭 发表于 2024-2-5 14:59:42

跟着硬汉学 发表于 2024-2-5 11:22
老哥,你代码的初始化中,为什么把CS引脚拉低,不拉低也可以正常运行的?

CubeMX生成代码的时候初始电平我没改,默认低电平了。你可以在CubeMX里面把初始电平改成高
页: [1]
查看完整版本: STM32V6之HAL库 SPI1+DMA读写W25Q64下 几种方式的时间对比 基于EVR